26

特定のファイルに影響を与える、または関係するすべてのマージコミットを見つけたい。

背景として、マージ時に誰かが競合を誤って解決しましたが、チームは数日間その競合に気づきませんでした。その時点で、他の多くの無関係なマージがコミットされていました(私たちの中には、リベースを使用しないことを好む人もいました。そうしないと、物事はもっと簡単になります)。「悪い」マージコミットを見つける必要があるので、他に何が元に戻されたかを特定するためにチェックできます(もちろん、有罪を特定して罰するために)。

シナリオは次のようになります。

$ echo First > a.txt && git add a.txt && git commit -m 'First commit'
$ git branch branch1
$ echo "Second: main-branch" >> a.txt && git commit -a -m 'Commit on master'
$ git tag a1
$ echo "Third: main" >> a.txt && git commit -a -m 'Other commit on master'
$ git checkout branch1
$ echo "Second: on branch1" >> a.txt && git commit -a -m 'Commit on branch'
$ git tag b1

...したがって、masterとbranch1のa.txtに競合する変更があります。

$ git checkout master
$ git merge branch1 
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
Automatic merge failed; fix conflicts and then commit the result.
$ cat a.txt 
First
<<<<<<< HEAD:a.txt
Second: main-branch
Third: main
=======
Second: on branch1
>>>>>>> branch1:a.txt
$ vi a.txt
# ...
$ cat a.txt 
First
Second: on branch1
$ git add a.txt
$ git commit -m 'Merge commit'

...言い換えれば、解決策は「彼らのものを取る」です。グラフは次のようになります。

$ git log --graph --branches --format='%h %s %d' 
*   fefb623 Merge commit  (refs/heads/master)
|\  
| * 93e065e Commit on branch  (refs/tags/b1, refs/heads/branch1)
* | cf4d12b Other commit on master 
* | 6fade67 Commit on master  (refs/tags/a1)
|/  
* 07545ea First commit 

この時点で、間違ったバージョンのa.txtがマスターにあります。a1のバージョンは必要なものですが、b1バージョンはコミットされています。これまで私が試した:

$ git log --decorate --oneline a.txt
93e065e (refs/tags/b1, refs/heads/branch1) Commit on branch
07545ea First commit

わかりました。a1もマージコミットも表示されません。

$ git log --decorate --oneline --follow a.txt
...

これにより、両方のブランチのすべてが表示されますが、マージコミットは省略されます。

$ git log --oneline --graph --decorate a1..master
...

これはもちろん「a1ではなくマスターのすべて」であり、このおもちゃの例では機能しますが、私の実際のケースでは、最近行われたすべてのマージが表示されます(a.txtに触れたものは示されません)。

マージがその変更を省略することを選択したので、ファイルの履歴からa1が消えることを合理化できます(少なくともgitが気にするという意味では)。しかし、a.txtに影響を与えるすべてのマージコミットを見つけるにはどうすればよいですか?これは、すべての候補マージコミットを手動で検査しなくても可能ですか?

4

2 に答える 2

25

あなたの場合の問題は、マージコミットが空であるということです。これは、1つのブランチからのみデータを取得するためです。したがって、gitは、これらの「空の」コミットを削除することで履歴を簡素化します。

したがって、マージコミットをログに表示するには、にを指定して、履歴の簡略化を変更するようにgitに指示する必要があります--simplify-merges。なぜこれを使用しなければならないのかを理解したい場合は、git logマニュアルページに進んでください。しかし、私はそれを理解していません:)とにかく、この場合、マージコミットは.txtフィルタリングで正しく表示されるので、それが必要です。

最後に、各親で、を使用してdiffを2回表示し-mます。

だからこれは

git log -U -m --simplify-merges --merges -- a.txt

出力付き

commit a7340d6e91deedff6f52c8ec8da932245f73e5f6 (from d577e6c4dcbff5485ded666c89f38
Merge: d577e6c fe3c4d2

    merge commit

diff --git a/a.txt b/a.txt
index 319137b..1aa6dc4 100644
--- a/a.txt
+++ b/a.txt
@@ -1,3 +1,2 @@
 First
-Second: main-branch
-Third: main
+Second: on branch1
于 2012-04-16T21:02:51.070 に答える
2

--mergeslogコマンドにを追加できます。これは、マージコミットのみを一覧表示します。--first-parentさらに、ブランチ履歴のみを追跡し、ブランチ履歴にマージされたブランチの履歴を考慮しないように指定できます。

于 2012-04-16T20:08:31.670 に答える