如何只显示已经合并回父级的分支上的提交?

时间:2014-05-01 14:32:12

标签: git logging commit

该场景是一个分支是在master之外创建的,工作已经完成并且已经合并回master。我用来审查分支的常规命令现在什么都不返回:

git log --no-merges master..

git diff `git merge-base master HEAD`..HEAD

2 个答案:

答案 0 :(得分:0)

分支点在哪里?如果A是你的分支从master分离的点的哈希值,而B是合并提交,那么你可以这样做:

git diff A^..B

答案 1 :(得分:0)

我将在这里调用分支branch,并且为了示例,使用show命令:

$ git checkout -b branch  # was on master
... work and commit ...   # for, say, four commits
$ git checkout master
... work and commit ...   # just to create commit "l" below on master
$ git merge branch
$ git branch -d branch

假设自合并以来没有向master添加新提交,您的图表现在看起来像这样:

...-b-------l-m   <-- master
     \       /
      o-o-o-*     ["branch", before deleting the label]

您正在寻找的是将提交b(合并基础)与提交*(它是分支branch的提示)进行比较,当它存在时;或者从提交*(包括)登录回提交b(不包括b本身)。

这里的诀窍是使用git的gitrevisions语法。 m上的master提交是一个合并提交,因此至少有两个父母。我将假设标签master名称提交m;如果您在master上添加了更多提交,则需要首先沿着提交链返回以查找m

“第一个”父级是master^1或只是master^。提交m的“第二个”父级为master^2,此名称提交*

查找b可能比较棘手。但是,这里的秘密(您在编写git log master..时已经使用的)是不必找到它,您可以让 git 找到它。

修订语法x..y实际上意味着 1 y ^x 2 查找从y开始并向后工作的所有提交,但是擦除该结果,所有提交从x开始并向后工作。所以,如果你写:

git log master^..master^2

这“意味着”master^2 --not master^,即从master^2开始 - 即提交* - 并且“永远”向后工作,但删除从{{1}开始的所有提交} - 提交master^ - 并且“永远”向后工作。从l开始向后工作,我们删除了提交l以及之前的所有历史记录,因此这个名称只是b上的提交。

(我创建了branch,因此l不仅仅是bmaster^上提交m的第一个父级现在是master而不是l,所以b名称提交master^。但是,如果没有l,这将仍然有效。在这种情况下,l将命名提交{{1直接和master^仍然可以做你想做的事。)

对于b案例,您确实必须找到提交master^..master^2,但您可以使用git diff来执行此操作,或使用特殊的三点b语法

作为练习,假设自合并以来 git merge-base上进行了一些提交:

git diff

现在master是指提交...-b-------l-m-n-o-p <-- master \ / o-o-o-* masterp引用master^master~1o是指master^^,等等。找到一些方法(在gitrevisions中)来命名提交master~2n命名的内容是什么?


1 m除外,它专门处理master~3^2git diff。除了组合差异情况,git diff总是比较两个提交 - 或者更准确地说是两个树 - 所以这里..只意味着“提交...并提交x..yx在左边和y在右边“,x被噱头表示”(左边是yx...y的合并基础),({{1 }} 在右边)”。 (左和右也可称为“从”和“到”。)

2 请注意,x中的y来自 x之前的,而y中的^来自在 ^x之后^的位置在这里至关重要:作为前缀,它意味着“不”,但作为后缀,它意味着“找到父母”。