git merge
将从其他分支合并到当前分支。
可以将从当前分支合并到另一个分支,并保留在当前分支中吗?
当然以下是可能的,但有三个步骤。
(on brancha)
git checkout master
git merge brancha
git checkout brancha
答案 0 :(得分:5)
简答:不,你必须使用多步法。
稍微复杂一点的答案:是的,它是可能的,但它比多步骤方法甚至更多的工作。这就是诀窍:合并有两个不同的东西;其中一个是对称的; 1 其中一个不是。
对称部分是"得出合并结果" (就附加到提交的树而言)。为此,git有四个步骤:
HEAD
)的祖先,又是命名的,待合并的提交(通常是某个分支的提示,但是你可以合并任何commit-ID。HEAD
区分开来。完成所有这些后,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会检查该冲突的“解决方案”并解决它可以“使用”的问题,以及然后将重复使用而不是停止。