我试图在git中列出在分支上进行的所有提交,并怀疑这是不可能做到的。我是对的吗?
鉴于以下git历史记录:
A - B - D master branch
\ C / dev branch
提交顺序:
当步骤5发生时,主分支标记从B移动到D.
在步骤4之后,D的第一个父亲是C.但是由于步骤5中的合并没有创建新的合并提交,所以只移动了分支标签,在步骤5之后,D的第一个父亲仍然是C.
所以在运行时
git log --first-parent master
要查看master分支的历史记录,它会列出提交D,C,A。这是错误的,因为C是在dev分支上创建的,而不是在master上。
我知道git不存储创建提交时使用哪个分支的信息。似乎也无法从git历史中找到这些信息。这是否意味着基本上无法告诉git中分支上的提交列表?在这种情况下,我希望看到结果D,B,A。
答案 0 :(得分:0)
更准确地说,您需要git merge --no-ff
。那样做。
以下是我喜欢的风格重绘的历史记录:
A--B
\ \
C--D <-- dev, master
请注意,这与稍微笨拙的绘图相同:
A--B--D <-- dev, master
\ /
`-C
就图表所包含的内容而言:两个分支名称都指向单个提交D
。 (旁白:没有正确绘制标签,哪个向后链接是第一个,哪个是第二个。这样的文本图形中没有足够的空间放入这些标签。)这来自你的步骤4和5.让我们画出你的内容在第3步:
A--B <-- master
\
C <-- dev
在第4步中,你得到了一个真正的合并提交 - --no-ff
没有任何区别 - 因为你做了git checkout dev && git merge master
,并且有一个共同的合并基础提交A
和两个不同的分支提示B
和C
必须合并。所以现在,在第4步之后,你有了这个:
A--B <-- master
\ \
C--D <-- dev
在第5步中,虽然 - git checkout master && git merge dev
- 您没有获得新提交。当你这样做时,公共合并基础是B
指向的提交master
。单个进一步的提示提交是提交D
,dev
指向(并且仍然指向)。因此Git执行快进操作,将名称master
移动到指向现有提交D
(并更新流程中的工作树):
A--B
\ \
C--D <-- dev, master
如果您使用--no-ff
,则告诉git merge
“不要这样做” - 不要进行快进操作;做一个真正的合并。然后你得到新的合并提交E
:
A--B---E <-- master
\ \ /
C--D <-- dev
提交E
的第一个父级是B
,而提交D
的第一个父级是C
。所以现在--first-parent
做你想做的事。