0

git log特定のファイルがいつマスターに持ち込まれたかを見つけるために使用しようとしています。(簡略化された) バージョン履歴は次のようになります。

*   f77cac3 Merge branch 'branch2'
|\  
| *   da35250 Merge branch 'branch1' into branch2
| |\  
| | * 90ab3e3 adding foo on branch1
| * | 42a0367 adding bar in branch2
| |/  
* | 853b691 changes to baz on master
* | c7b6c72 baz file on master
|/  
* e195580 first commit

ファイル「foo」をマスターに導入したコミットを見つけたいと思います(f77cac3である必要があります)。ただし、実行git log --fooすると 90ab3e3 が返されます。ブランチ 1 とブランチ 2 のファイル foo に複数の変更が加えられた、より複雑なケースでは、それらのコミットはすべて表示されますが、マージ コミットは表示されません。私はgitのヘルプを読んだり、スタックオーバーフローでグーグル検索したり検索したりしましたが、これを行う方法が見つかりません。

以下のシナリオを再現するために使用できるコマンドは次のとおりです。

mkdir testgit
cd testgit
git init
vim README
git add README
git commit
git checkout -b branch1
vim foo
git add foo
git commit
git checkout master
git checkout -b branch2
vim bar
git add bar
git commit
git checkout master
vim baz
git add baz
git commit
vim baz
git add baz
git commit
git checkout branch2
git merge --no-ff branch1
git checkout master
git merge --no-ff branch2

私はこの時点で本当に困惑しています。

4

2 に答える 2

1

だからここに私が見つけたものがあります:正しい呪文は ですgit log --first-parent -- fooが、それはあなたのgitバージョンが1.7.9.1以上である場合にのみ機能します。そのバージョンより前--first-parentは壊れていたからです。残念ながら、この問題に遭遇したとき、私は古いバージョンを使用していましたが、1.7.9.1 のリリース ノート (https://github.com/git/git/blob/master/Documentation/RelNotes /1.7.9.1.txt)

于 2012-07-16T21:42:30.013 に答える
0

ここでできる最善の方法は、変更を含む最初のコミットを使用git blameまたはgit bisect検索してから、子コミットのチェーンをたどって最初のマージ コミットを見つけることです。

Git には、ブランチに属する特定のコミットという概念が実際にはありません。はい、コミットはブランチに含まれており、1 つのブランチのみに含まれている場合と含まれていない場合があります。あなたがやろうとしているのは、すべてのコミットがどのブランチにあったかを記録することです。これは Mercurial が行うことですが、Git では行いません。


あなたの質問を少し読んでみると、自動化された方法でこれを行う必要はないかもしれません。その場合、提供されているコミットのリストを見ることができますgit log --sparse -- foo

違いは、--sparse歩いたすべての親をリストし、まったく同じ内容を持つ親 (この場合、マージの右側) を最初に歩くことです。

于 2012-07-13T23:56:54.940 に答える