合并分支后的Git提交顺序

9

我一直在尝试使用以下文章中描述的分支模型:

http://nvie.com/posts/a-successful-git-branching-model/
  1. 我从主分支上新建了一个名为items的分支,并在该分支上进行了几次提交。
  2. 然后我回到主分支并进行了一次提交。
  3. 使用git merge --no-ff命令合并items分支,然后解决任何合并冲突。

我以为来自另一个分支的所有已合并提交将按顺序一起被引入,但事实并非如此。以下是git log的输出:

f28e150 Merge branch 'items'
8281666 [Master] Another middle commit before merge
73d0ca9 [items] commit 2
0442978 [items] commit 1

为什么item分支的前两个提交显示在主分支之前?难道把它们和合并提交一起显示不是更有意义吗,因为那是我将所有代码合并的时候?调用图形选项:git log --graph 以正确的顺序显示。
*   f28e150 Merge branch 'items'
|\  
| * 73d0ca9 [items] commit 2
| * 0442978 [items] commit 1
* | 8281666 [Master] Another middle commit before merge
|/  

我希望将它们合并在一起,这样就更容易让我撤销整个合并过程。
1个回答

14
简短的回答是,git log会对输出进行排序,您需要选择所需的排序顺序。(之所以要排序是因为它必须这样做:图中父/子关系只提供了部分顺序,但是git log需要强制实施一个完全排序。) 更多详细信息请参阅 git log文档中描述的内容,其中包含很多内容;搜索commit ordering(此链接应将您直接带到该部分)。
“逆时间顺序”默认排序顺序有点虚假(在早期版本的Git中是正确的),因此您默认获取的顺序取决于您使用的Git版本。注意,--graph会自动开启--topo-order,因此--topo-order可能是您想要的。
还要注意,您可以将修订步行限制为仅查看每个合并的第一个父项,使用--first-parent选项。在这种情况下,您将根本看不到其他分支。对于--first-parent有用,每个合并的人都需要有点小心,以便您不会将提交推送到侧分支中。请参见GIT: How can I prevent foxtrot merges in my 'master' branch?

谢谢澄清。然而,当您对过去的x个提交执行git重置时,将使用哪个顺序? - Khalid Al-Mutawa
git reset 命令本身不使用这种编号系统。但是,gitrevisions 允许 <identifier>~n(例如 HEAD~5)。这遵循父链接,特别是第一个父链接。这不是 git reset 的事情,而是一般目的的“按关系命名特定提交”的事情,您可以使用例如 git show 查看该特定提交。在 https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html 中有更多细节。 - torek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接