特定のコミットを見つけるためにgit-blameを使用しました。ここで、元々のブランチを見つけたいと思います。(そこから、ブランチ名を使用して特定のチケットを検索します)
「元のブランチ」を「ブランチが他のブランチにマージされる前にコミットが行われたブランチ」と定義しましょう。
特定のコミットを見つけるために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
| |
release-1
たとえば、Aの親コミットにタグを付けていて、このタグがのコミットにのみ与えられていることがわかっている場合は、コミットAがどのGitブランチであるかを推測できます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は優れた機能に最も近く、つまりBで作成されたということです。
これは素敵なスクリプトにすることができます。答えに自由に追加してください(私はこれが得意ではありません)
まず、リモートから変更をフェッチしたことを確認します
$ git fetch --all
と、
$ git branch -a --contains d590f2
-aオプションがないと、リモートブランチにのみ存在するコミットを見つけることができません。
あなたがブランチにいるとき、「元のブランチ」はにマージされました。あなたは実行することができます:
git log <SHA>..HEAD --ancestry-path --merges
このコマンドはmerge
、の間のすべてのコミットを表示し<SHA>..HEAD
ます。最後のものが必要です。
たとえば、c0118fa
コミット(最後の1つを除く)の場合、「元のブランチ」は次のようになります。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
これは、Jenkinsワークスペースの切り離されたヘッドからブランチ名を取得するのに十分に機能しました。
git show -s --pretty=%d