git - 从当前分支 merge 到另一个分支

标签 git

git merge从另一个分支合并到当前分支。
是否可以从当前分支合并到另一个分支,并保留在当前分支中?
当然,以下是可能的,但有三个步骤。

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

最佳答案

简而言之:不,你必须使用多步骤方法。
稍微复杂一点的回答是:是的,这是可能的,但这比多步骤方法更为有效。诀窍在于:合并可以做两件不同的事情;其中一件是对称的;另一件不是。
对称部分是“产生合并结果”(就附加到提交的树而言)。为此,git有四个步骤:
找到merge base。这是某个特定的commit2,它既是当前提交(HEAD)的祖先,也是要合并的命名提交(通常是某个分支的顶端,但您可以合并任何提交id)。
将合并基与HEAD进行比较。
将合并基与要合并的提交进行比较。
将两个diff结合起来,在没有冲突的地方自动生成结果,在两个diff冲突的地方生成冲突的结果(这会导致合并停止并获得帮助)。
完成所有这些之后,git merge通常会在当前分支(或分离的HEAD)上进行新的“合并提交”,除非您当然告诉它不要(git merge --no-commit)或它由于冲突而停止。
这个新提交是非对称部分。考虑到上述情况(并忽略潜在的rerere情况,因为这些情况可能取决于diff对的顺序),如果您阻止新提交,那么无论您使用哪个“方向”进行合并,都将得到相同的树。但是您将得到一个不同的提交,因为新的合并提交有三个有趣的属性:
父级列表:列表相同,但顺序取决于合并的方向。合并的第一个父级始终是要合并到的提交(当前分支),第二个父级是要合并到的提交(从分支合并或提交)。
提交消息:默认消息为“merge branch merge from”,因此显示合并的from分支的名称。
当前分支的自动调整:这与任何新提交相同。如果您在branchmaster上,并且您进行了一次新的提交,master指向的sha-1将被更新,以便master指向新的提交。在本例中,这是新的合并提交。
如果停止编写实际的合并提交(使用--no-commit),我们将得到正确的树(忽略某些rerere情况)。然后,我们可以使用正确的父级、树和日志消息创建一个新提交,并更新另一个分支,而不是我们正在使用的分支,方法是使用git write-treegit commit-tree在某个地方编写新提交,然后使用git update-ref更新我们正在使用的分支以外的引用。git commit-tree命令按照我们控制的顺序获取父sha-1 id的列表,并采用-m-F来设置提交消息,并且不推进当前分支(新提交对象的id只是简单地写入标准输出),因此这一切都是可行的,但这不是要做的事情。
1当进行正常(非八达通)合并时,从“我们的”到“他们的”,以及其他相应的微妙之处,如索引中的冲突合并条目和rerere可能性。
2这掩盖了递归合并在某些情况下使用的“虚基”,但即使在那时,原理仍然不变。
3更准确地说,碰撞不是简单的“做同样的改变”,而是通过只做一次而不是两次的改变来自动解决的。或者,如果启用了rerere,git将检查该冲突的“重新”记录的“重新”解决方案,并将其“重新”使用,而不是停止。

关于git - 从当前分支 merge 到另一个分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28083406/

相关文章:

git - 无法使用 Azure DevOps 为 Azure Repos git 生成 git 凭据

git - 从当前提交中获取最新的 git 标签

php - sh : php: command not found in git bash windows 8

git - 我必须在 merge 每个文件后退出我的 Git diff 工具吗?

Git 推送到 gh-pages(更新被拒绝)

java - 构建spring框架源码遇到错误

git - 如何在不获取整个 repo 协议(protocol)的情况下仅克隆特定标签?

c++ - 当存在调试代码时如何禁止 git 提交

android - 保存文件时Egit错误

git - 如何删除所有本地提交并转到分支主机(在远程存储库上)的最后一次提交?