git:列出在分支上进行的所有提交( - first-parent给出错误的结果)

时间:2017-01-24 11:03:27

标签: git

我试图在git中列出在分支上进行的所有提交,并怀疑这是不可能做到的。我是对的吗?

鉴于以下git历史记录:

A - B - D  master branch 
  \ C /    dev branch

提交顺序:

  1. A,在主人
  2. 上进行的初始提交
  3. C,在dev分支上制作
  4. B,在主分支上制作
  5. D,合并提交,将master合并到dev
  6. D,合并提交,将dev合并为master
  7. 当步骤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。

1 个答案:

答案 0 :(得分:0)

Git的回答是“不要那样做”

更准确地说,您需要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和两个不同的分支提示BC必须合并。所以现在,在第4步之后,你有了这个:

A--B   <-- master
 \  \
  C--D   <-- dev

在第5步中,虽然 - git checkout master && git merge dev - 您没有获得新提交。当你这样做时,公共合并基础是B指向的提交master。单个进一步的提示提交是提交Ddev指向(并且仍然指向)。因此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做你想做的事。