特定のコミットを見つけるためにgit-blameを使用しました。ここで、元々あったブランチを見つけたいと思います。 (そこから、ブランチ名を使用して特定のチケットを検索します)
「元のブランチ」を「ブランチが他のブランチにマージされる前にコミットが行われたブランチ」と定義してみましょう。
他の人が言ったように、探しているブランチがこのコミットを非難しているリポジトリにローカルではない場合(たとえば、遠い開発者の個人的なリポジトリ内のブランチのみ)は、困惑しています。
しかし、求められているブランチが目に見えるものであり、もちろんコミットのハッシュがあると仮定すると、d590f2...
、部分的な答えはあなたができるということです:
$ git branch --contains d590f2
tests
* master
次に、犯人がいることを確認するだけです。
$ git rev-list tests | grep d590f2
もちろん、d590f2
は複数のブランチにマージされているため、これよりも微妙でなければなりません。
これはgitでは実際には適用できません。ブランチは、各リポジトリに対するローカルの概念です。ある人の「ローカルなもの」ブランチは、別の人の「ローカルなもの」ブランチから完全に分離することができます。メインの統合ブランチとクエリコミットを確認し、2つの間のすべてのマージベースを削除するなどの操作を行うと、いくつかの照明を消す可能性があるコミット履歴のサブツリーを取得できるはずです... 。例えばクエリコミットから「マスター」へのリンクをたどる場合、うまくいけば、マージがどこから来たのかを示す便利なコメントが付いたマージコミットが見つかるはずです。
例えば_gitk some-commit...master
_(gitk some-commit master --not $(git merge-base some-commit master)
の略です)
Gitブランチは、「コミットへの名前付きポインター」にすぎません(これは、他の有名なVCSとは根本的に異なる概念です)。
この状況は明らかです。コミットAはbranch-1
にあり、コミットBはbranch-2
にあります。
o A [branch-1]
|
o | B [branch-2]
| |
マージ後、A(またはB)が元々branch-1
またはbranch-2
にあったかどうかが不明確になった後:
o [branch-1] [branch-2]
|
o merged
|\
| o A
| |
o | B
| |
Aの親コミットにタグを付けた場合、コミットAがどのGitブランチであったかを推測できるかもしれません。 release-1
そして、このタグはbranch-1
でのコミットに対してのみ指定されたことがわかります。
o [branch-1] [branch-2]
|
o merged
|\
| o A
| |
o | B
| |
| o <release-1]
| |
試してみますが、完全に定かではないのでコメントしてください。ただし、うまくいくと思います。
次は、ブランチがマスターにマージされる前にまだ先端を指している場合にのみ機能します。これは、ブランチが同じリポジトリにある場合です。
o [master]
|
o merged branch "great-feature" into master
|\
| o A [great-feature]
| |
o | B
| |
そうでない場合(たとえば、別のリポジトリからプルした場合)は、手動で再作成できます。
まず、コミットがあるブランチを取得します。
$ git branch -a --contains=<sha-of-B>
*master
great-feature
次に、ブランチごとに、コミットとヘッドを区切るコミット数を取得します。これは、指定された範囲のgitログを出力する行数です。
$ git log --pretty=oneline <sha-of-B>..great-feature | wc -l
1
$ git log --pretty=oneline <sha-of-B>..master | wc -l
4
したがって、Bは偉大な機能に最も近い、つまりそれはその中で作成されたことを意味します。
これは素敵なスクリプトにすることができます。答えに自由に追加してください(私はこれが得意ではありません)
まず、リモートから変更をフェッチしたことを確認します
$ git fetch --all
そして、
$ git branch -a --contains d590f2
-aオプションがないと、リモートブランチにのみ存在するコミットを見つけることができません
あなたがブランチにいるとき、"元のブランチ"がマージされました。あなたは走ることができます:
git log <SHA>..HEAD --ancestry-path --merges
このコマンドは、<SHA>..HEAD
間のすべてのmerge
コミットを表示します。最後のものが必要です。
たとえば、c0118fa
commit(最後の1つ)の場合、"original branch"はredesign_interactions
です
* ccfd449 (HEAD -> develop) Require to return undef if no digits found
* 93dd5ff Merge pull request #4 from KES777/clean_api
|\
| * 39d82d1 Fix tc0118faests for debugging debugger internals
| * ed67179 Move &Push_frame out of core
| * 2fd84b5 Do not lose info about call point
| * 3ab09a2 Improve debugger output: Show info about emitted events
| * a435005 Merge branch 'redesign_interactions' into clean_api
| |\
| | * a06cc29 Code comments
| | * d5d6266 Remove copy/paste code
| | * c0118fa Allow command to choose how continue interaction
| | * 19cb534 Emit &interact event
あなたは実行する必要があります:
git log c0118fa..HEAD --ancestry-path --merges
そして下にスクロールして、最後のコミットを見つけます。これは:
commit a435005445a6752dfe788b8d994e155b3cd9778f
Merge: 0953cac a06cc29
Author: Eugen Konkov
Date: Sat Oct 1 00:54:18 2016 +0300
Merge branch 'redesign_interactions' into clean_api
私はそれを行うためのより簡単な方法を見つけました:git log <sha>..HEAD --merges
の最後のコミットのメッセージにあります!
このコマンドは、マスターとコミットの間で発生したマージを表示します。このコマンドによる最後のコミット出力は、それを含んだ最初のマージコミットです。通常はブランチ名が含まれているため、ブランチが削除された場合でもその名前を見つけることができます。
ブランチの名前のみを取得するには、git log <sha>..HEAD --merges --oneline |tail -1
と入力します
これはgitを使用して100%の精度で回答できる質問ではないようです。
git branch --contains --merge <sha1>
コミットがマージされたすべてのブランチと元のブランチのリストを返します。 -no-mergedは、マージポイントの後に分岐したため、コミットを含む後続のすべての分岐を返します。
したがって、各マージのリストを取得できますが、元のブランチは取得できず、コマンドの実行前に削除されたブランチは失われます(またはreflogを確認します)。
結果
git branch --contains <sha1 for "added feature/inital 1">
* develop
feature/inital
feature/subsequent1
git branch --contains <sha1 for "added feature/inital 1"> --merged
* develop
feature/inital
git branch --contains <sha1 for "added feature/inital 1"> --no-merged
feature/inital
テストスクリプト
function mkbranch {
git checkout -b $1
git Push --set-upstream Origin $1
}
# Develop
mkbranch develop
for f in 1 2 3; do date > file${f}.txt; git add file${f}.txt; git commit -m "added develop $f"; done
git Push
# Initial Feature Branch
mkbranch feature/inital
for f in 1 3; do date > file${f}.txt; git add file${f}.txt; git commit -m "modified feature/inital $f"; done
git Push
# Merge
git checkout -b develop
git merge feature/inital
git Push
# Next Feature Branch
mkbranch feature/subsequent1
for f in 1 3; do date > file${f}.txt; git add file${f}.txt; git commit -m "modified feature/subsequent1 $f"; done
git Push