sin*_*boy 6 git merge history branch
这与如何列出分支上的提交而不是合并的分支相反,所以我会以相同的格式询问它。假设我的 git 提交历史如下所示:
A---B---C---D---E---F master
\ /
X---Y---Z topic
Run Code Online (Sandbox Code Playgroud)
我如何列出topic分支上的提交——也就是X、Y、 和Z?需要注意的是简单地做git log topic是行不通的-这将返回提交A,并B为好。
我原以为我可以跑去git merge-base topic masterfind B,然后做得到git log B..Z这些提交。不幸的是,git merge-base topic master返回Z,而不是B,回想起来Z是有道理的——因为已经合并到 master,topic和master那个共享历史记录之间的第一次提交是Z.
如果您只合并topic一次master ,并且您知道您在合并提交中合并topic了,则可以简单地使用修订语法:masterE<rev>^-<n>
git log E^-
Run Code Online (Sandbox Code Playgroud)
如果您不记得提交的哈希值E,并且想要一种简单的方法来根据分支名称 ( ) 找到它,您可以使用问题“查找包含特定提交的合并提交”topic中的答案之一。我个人喜欢:git when-merged
git when-merged topic
Run Code Online (Sandbox Code Playgroud)
把它们放在一起:
git log $(git when-merged -c topic)^-
Run Code Online (Sandbox Code Playgroud)
如果您topic多次合并到master,那么上面的语法将仅列出在最近一次合并提交中合并的提交。在这种情况下,您可以使用 Rocketraman 的mergedtopiclg别名
git mergedtopiclg $(git when-merged -c topic)
Run Code Online (Sandbox Code Playgroud)
为了完整起见,此别名配置为
git log E^-
Run Code Online (Sandbox Code Playgroud)
您可以使用以下命令:
git log topic --not $(git rev-list master ^topic --merges | tail -1)^
Run Code Online (Sandbox Code Playgroud)
git rev-list master ^topic --mergesmaster返回从到的所有合并提交的 SHA-1 密钥topic;因为可能有多个合并提交,我用它来获取最后一个合并提交,即和tail -1的合并提交。mastertopic
然后我们记录所有提交,topic同时忽略合并提交 ( --not <merge-commit>^) 的第一个父级的所有提交。
为了有效地使用这个命令,我将定义一个别名,如下所示:
git config --global alias.<alias-name> '!f() { git log $1 --not $(git rev-list $2 ^$1 --merges | tail -1)^; }; f'
Run Code Online (Sandbox Code Playgroud)
然后就可以像这样使用了git <alias-name> topic master。
仅供您参考:
在我的 git 版本(1.9.0)中,如果您省略它也可以工作tail,但我认为仅返回相关的 SHA-1 密钥会更干净。