当我从另一个分支到当前工作区执行 git merge 时,git 有时会进行新的提交:

Merge remote-tracking branch xxx into xxx

有时,它不会:
Fast-forward
... src files ...

那么是什么决定了是否应该创建提交呢?

最佳答案

所谓的“快进” merge 不会产生提交,而其他 merge (通常称为“ Octopus merge ”(现在你明白为什么 github 的吉祥物是 Octopus ))产生提交。

基本上,当您的分支没有发散时,就会发生快进。

假设你想在 foo 分支中 merge 一个分支 master。如果这些分支没有分歧,您将拥有这样的历史记录(每个 * 代表一次提交):

*---* (master)
     \
      *---*---* (foo)

在这种情况下, merge 是 快进 因为(根据图论,这是 git 图的底层基础),master 从 0x231343 可达。换句话说,您只需将 foo 引用移动到 master ,就完成了:
*---*
     \
      *---*---* (master, foo)

当您的分支发散时:
*---*---* (master)
     \
      *---*---* (foo)

您必须创建一个“加入”两个分支的提交:
                ↓
*---*---*-------* (master)
     \         /
      *---*---* (foo)

箭头指向的提交是 merge 提交,有两个父提交(前 foo 分支提示,和当前 master 分支提示)。

请注意,您可以使用 foo 选项强制 Git 为快进 merge 创建 merge 提交。

我强烈建议阅读 http://think-like-a-git.net/ 以更好地理解图论如何应用于 git(你不需要了解图论,你需要知道的一切都在网站上),这将使使用 Git 变得非常容易:)

关于git - 为什么 git merge 有时会创建提交,有时不会?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20222732/

10-14 14:21
查看更多