【问题标题】:List merge commits affecting a file列出影响文件的合并提交
【发布时间】:2012-04-28 04:10:38
【问题描述】:

我想找到所有影响或涉及给定文件的合并提交。

作为背景,有人在合并时错误解决了冲突,并且几天没有被团队注意到。那时,已经提交了许多其他不相关的合并(我们中的一些人一直更喜欢不使用 rebase,否则事情会更简单)。我需要找到“错误”的合并提交,以便检查它以确定其他可能被还原的内容(当然,识别和惩罚有罪的人)。

场景是这样的:

$ 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 

此时,master 上的 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
...

这当然是“master not in a1 中的所有内容”,它在这个玩具示例中有效,但在我的真实案例中,它为我提供了最近完成的所有合并(并且没有迹象表明哪一个接触了 a.txt)。

我可以合理化 a1 从文件历史记录中的消失,因为合并选择忽略该更改(至少在 git 关心的意义上,我认为)。但是如何找到影响 a.txt 的所有合并提交?如果不手动检查所有候选合并提交,这甚至可能吗?

【问题讨论】:

  • 提交日志不显示合并,因为它与您合并的分支中的第一个父提交不同;然后 git 认为没有文件被修改

标签: git git-branch git-merge git-log


【解决方案1】:

你的问题是合并提交是空的,因为你只从一个分支中获取东西,所以 git 通过删除那些“空”提交来简化历史。

因此,为了让您的合并提交显示在日志中,您需要告诉 git 更改历史简化,方法是告诉 --simplify-merges。如果您想了解为什么必须使用它,请继续阅读 git log 手册页,但我已经不在了 :) 无论如何,在这种情况下,合并提交通过 a.txt 过滤正确显示,这就是你想要的。

最后,你想显示 diff 两次,每个父级,-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

【讨论】:

  • 是的,这就是我要找的差异。
  • +1 表示 --simplify-merges。没有看到合并提交——或者没有意识到它们被隐藏在日志中——浪费了我今天的时间。
【解决方案2】:

您可以将--merges 添加到日志命令中。这只会列出合并提交。此外,您可以指定--first-parent,这样您就只关注分支历史,而不考虑合并到其中的分支的历史。

【讨论】:

  • 这行不通,因为git log a.txt 没有列出合并提交(我不知道为什么)
  • 可能只有在您解决了涉及该文件的合并提交中的冲突...git log -- a.txt 怎么样?
  • 不,它不显示,即使涉及合并冲突a.txt;如果您通过仅选择他们的更改来解决合并冲突,则提交差异为空,并且被日志隐藏。但是我发现了如何规避
  • 对不起,我查了,和用他们的或我们的解决问题没有关系,这两种情况都是空的
  • 为此寻找了一个多小时!我需要一个影响某个路径的所有合并提交的列表。使用 git log --merges --first-parent -- my/path 给了我正确的结果。
猜你喜欢
  • 2020-06-28
  • 2020-04-21
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
  • 1970-01-01
  • 2021-01-20
  • 2017-06-25
  • 1970-01-01
相关资源
最近更新 更多