Git:如何更新基于merge-base创建的本地分支
问题:如何简便同步本地分支与同事的最新更改?
我本地有v1.0和development两个分支,团队创建本地分支的标准流程是:
git merge-base v1.0 development git checkout <commit-hash> git checkout -b <new-branch-name>
近期有位同事按照相同流程创建了他的本地分支,之后执行了以下操作并推送到远程:
git checkout v1.0 git merge <his-local-branch-name> git push git checkout development git merge <his-local-branch-name> git push
现在我想把自己的本地分支和同事的最新更改同步,但目前的做法是通过merge-base重新创建包含最新更改的分支,再合并我的本地修改,这个过程太繁琐。我尝试过直接git merge <last-commit-hash>(同事分支的最后提交哈希),但产生了大量冲突。请问有没有更简便的方法?
解决方案
其实不用重新创建分支,你可以利用远程仓库已经更新的v1.0和development分支来同步,步骤如下:
1. 先拉取远程的最新代码
首先确保你本地的v1.0和development分支是远程的最新状态:
# 更新本地v1.0分支 git checkout v1.0 git pull origin v1.0 # 更新本地development分支 git checkout development git pull origin development
2. 同步你的本地分支
接下来根据你最终要把分支合并到哪个目标分支,选择对应的同步方式:
方式一:如果你的分支最终要合并到v1.0
切换到你的本地分支,将远程最新的v1.0合并进来:
git checkout <your-local-branch> git merge origin/v1.0
或者如果你偏好线性的提交历史,可以用变基(rebase):
git checkout <your-local-branch> git rebase origin/v1.0
变基会把你的提交逐个应用到最新的v1.0分支之上,相比直接merge,冲突的粒度更小,更容易逐个解决。
方式二:如果你的分支最终要合并到development
操作逻辑和上面一致,只是目标分支换成development:
# 合并方式 git checkout <your-local-branch> git merge origin/development # 变基方式 git checkout <your-local-branch> git rebase origin/development
为什么之前直接merge同事的提交哈希会冲突多?
因为你和同事的分支都是基于同一个旧的merge-base创建的,相当于两条完全并行的修改线,直接merge他的提交时,Git需要一次性合并所有并行的修改,自然会产生大量冲突。而现在同事的修改已经合并到了v1.0/development,这两个分支已经包含了旧基础代码+同事的修改,此时合并/变基到这两个分支,Git只需要处理你的修改和“旧基础+同事修改”之间的差异,冲突会更聚焦,也更容易处理。
内容的提问来源于stack exchange,提问作者mpasko256




