【问题标题】:Git Order of Commits after Merging Branch合并分支后的 Git 提交顺序
【发布时间】:2016-07-13 20:02:21
【问题描述】:

我一直在尝试以下文章中描述的分支模型: http://nvie.com/posts/a-successful-git-branching-model/

  1. 我创建了一个名为 items from master 的新分支,并在那里进行了一些提交
  2. 回到分支 master 并进行了一次提交
  3. git merge --no-ff 分支项然后解决任何合并冲突

我假设来自其他分支的所有合并提交都会按顺序放在一起,但事实似乎并非如此。以下是git log的输出:

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

为什么 item 分支的前两次提交显示在 master 分支之前?在合并提交下将它们一起显示不是更有意义吗,因为那是我将它们全部与我的代码合并的时候?

调用图形选项:git log --graph 以正确的顺序显示它

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

我希望它们全部放在一起的原因是为了让我更容易撤消整个合并

【问题讨论】:

    标签: git github version-control


    【解决方案1】:

    简短的回答是git log 对其输出进行排序,您必须选择您喜欢的排序顺序。 (它之所以排序是因为它必须parent/child relationships in a graph provide only a partial ordergit log 需要施加一个总顺序。)

    详情见the git log documentation,很长;搜索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 reset 时,将使用哪个顺序?
    • git reset 命令本身不使用这种编号系统。但是,gitrevisions确实允许<identifier>~n(例如,HEAD~5)。这遵循父链接,特别是第一个父链接。这不是 git reset 的事情,而是通用的“通过关系命名特定提交”的事情,您可以使用例如 git show 来查看该特定提交。 kernel.org/pub/software/scm/git/docs/gitrevisions.html 中有(很多)更多细节
    猜你喜欢
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 2021-06-26
    相关资源
    最近更新 更多