要从当前分支合并到另一个分支

时间:2015-01-22 07:32:46

标签: git

git merge从其他分支合并到当前分支。

可以将从当前分支合并到另一个分支,并保留在当前分支中吗?

当然以下是可能的,但有三个步骤。

(on brancha)
git checkout master
git merge brancha
git checkout brancha

1 个答案:

答案 0 :(得分:5)

简答:不,你必须使用多步法。

稍微复杂一点的答案:是的,它是可能的,但它比多步骤方法甚至更多的工作。这就是诀窍:合并有两个不同的东西;其中一个是对称的; 1 其中一个不是。

对称部分是"得出合并结果" (就附加到提交的树而言)。为此,git有四个步骤:

  1. 找到merge base。这是一些特定的提交 2 ,它既是当前提交(HEAD)的祖先,又是命名的,待合并的提交(通常是某个分支的提示,但是你可以合并任何commit-ID。
  2. 将合并基础与HEAD区分开来。
  3. 将合并基础与要合并的提交区分开来。
  4. 结合两个差异,自动结果没有冲突,结果冲突(导致合并停止并获得帮助)两个差异发生碰撞的地方。 3
  5. 完成所有这些后,git merge通常会进行新的"合并提交"在当前分支上(或在分离的HEAD),除非您告诉它不要(git merge --no-commit)或由于冲突而停止。

    这个新提交是非对称部分。鉴于上述情况(并忽略了潜在的rerere个案例,因为这些情况可能取决于差异对的顺序),如果您阻止新的提交,您将获得相同的无论哪个"方向"你用来做合并。但是你会得到一个不同的提交,因为新的合并提交有三个有趣的属性:

    • 父母列表:列表相同,但订单取决于合并的方向。合并的第一个父级始终是要合并的提交(当前分支),其第二个父级是要合并的提交(合并) - 来自分支或承诺)。
    • 提交消息:默认消息显示"合并分支合并来自",因此出现合并来自分支的名称。
    • 当前分支的自动调整:这与任何新提交相同。如果你在分支master上,并且你进行了新的提交,那么master指向的SHA-1将被更新,以便master指向新的提交。在这种情况下,这是新的合并提交。

    如果我们停止编写实际的合并提交(使用--no-commit),我们将获得正确的(忽略某些rerere个案例)。然后,我们可以使用正确的父,树和日志消息创建新的提交,并使用git write-tree更新其他分支,而不是我们所使用的分支。 git commit-tree在某处编写新提交,然后使用git update-ref更新我们所依赖的分支以外的引用。 git commit-tree命令按照我们控制的顺序获取父SHA-1 ID列表,并使-m-F设置提交消息,并且不提前当前分支(新的提交对象的ID只是写入标准输出),所以这一切都是可行的,但这不是可行的方法。


    1 除了"我们的" vs"他们的"进行正常(非章鱼)合并时,以及其他相应的细微差别,例如索引中的冲突合并条目以及rerere种可能性。

    2 这掩盖了"虚拟基地"递归合并在某些情况下使用,但即使这样,原则仍然保持不变。

    3 更确切地说,碰撞不是简单的"进行相同的改变",这是通过仅改变一次而不是两次来自动解决的。或者,如果启用了rerere,git会检查该冲突的“解决方案”并解决它可以“使用”的问题,以及然后将重复使用而不是停止。