该场景是一个分支是在master之外创建的,工作已经完成并且已经合并回master。我用来审查分支的常规命令现在什么都不返回:
git log --no-merges master..
和
git diff `git merge-base master HEAD`..HEAD
答案 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
不仅仅是b
:master^
上提交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-*
,master
和p
引用master^
,master~1
和o
是指master^^
,等等。找到一些方法(在gitrevisions
中)来命名提交master~2
。 n
命名的内容是什么?
1 m
除外,它专门处理master~3^2
和git diff
。除了组合差异情况,git diff总是比较两个提交 - 或者更准确地说是两个树 - 所以这里..
只意味着“提交...
并提交x..y
,x
在左边和y
在右边“,x
被噱头表示”(左边是y
和x...y
的合并基础),({{1 }} 在右边)”。 (左和右也可称为“从”和“到”。)
2 请注意,x
中的y
来自 x之前的,而y
中的^
来自在 ^x
之后。 ^
的位置在这里至关重要:作为前缀,它意味着“不”,但作为后缀,它意味着“找到父母”。