请求解析git pull/merge/rebase上游分支的命令差异
三个同步命令的差异详解
嘿,这三个命令都能实现将你的origin/master与upstream/master同步的目标,但它们的工作逻辑、生成的提交历史以及适用场景完全不同,我给你逐个拆解:
1. git pull upstream master
这个命令其实是两个命令的组合:git fetch upstream + git merge upstream/master。
- 第一步
git fetch upstream会把上游仓库upstream的所有最新变更拉取到本地的远程跟踪分支(比如upstream/master),但不会影响你的本地工作分支。 - 第二步自动执行
git merge upstream/master,把上游的最新变更合并到你当前所在的分支(这里应该是master)。 - 特点:会生成一个新的合并提交,你的提交历史会保留分叉(上游的提交和你本地的提交分开,最后通过合并提交汇合),历史记录完整但略显“臃肿”。
- 适用场景:不想手动执行fetch+merge,或者对提交历史的线性度要求不高的情况。
2. git merge upstream/master
这个命令需要你先手动执行过git fetch upstream(确保本地的upstream/master是最新的),然后再执行它:
- 它会直接把
upstream/master的变更合并到当前分支,同样会生成一个新的合并提交。 - 和
git pull的区别是:git pull自动帮你做了fetch,而这个命令需要你提前完成fetch操作,更灵活(比如你可以先检查上游变更再决定是否合并)。 - 特点:保留所有提交历史,包括分叉,不会改写已有的提交记录,对公共分支非常友好(因为公共分支不能随意改写历史,否则会导致其他协作者的本地分支冲突)。
- 适用场景:公共协作分支,或者希望完整保留所有提交分叉历史的情况。
3. git rebase upstream/master
这个命令的逻辑和merge完全不同:
- 它会先把你当前分支上的所有本地提交临时“存起来”,然后把当前分支的起点移动到
upstream/master的最新提交上,最后再把之前存起来的本地提交依次“重播”到新的起点之后。 - 特点:不会生成合并提交,最终的提交历史是完全线性的,看起来就像你是基于上游最新版本从头开始做的提交,历史非常干净。但要注意:它会改写提交历史,如果你的分支是公共分支(有其他协作者在使用),绝对不能用这个命令,否则会导致其他人的本地分支和远程分支严重冲突。
- 适用场景:你自己的私人开发分支,没有其他协作者,想要保持提交历史整洁的时候。
总结一下选择建议
- 如果是公共分支,或者想保留完整的分叉历史:用
git merge upstream/master(或者git pull upstream master) - 如果是私人分支,追求干净的线性历史:用
git rebase upstream/master
内容的提问来源于stack exchange,提问作者Gibin Ealias
相关产品推荐
相关产品推荐

