在团队协作中,大家都在同一个 dev 分支上开发。当你和同事都有新的提交时,简单的 git pull 会产生一个“合并提交”(Merge Commit),让历史产生分叉。如果Git提交历史像蜘蛛网一样混乱,这不仅让代码审查变得痛苦,也给未来追溯问题埋下了隐患。
接下来介绍一下如何将代码干净利落地合并到远程 dev 分支,让提交历史始终保持一条漂亮的直线。通过 rebase,可以把你的提交“嫁接”到同事的提交之后,就像是你排队在他后面提交代码一样。
第一步:获取远程最新代码(Fetch)
在推送你的代码之前,首先要做的是了解远程仓库 dev 分支上发生了什么新变化。这里我们使用 fetch 命令。fetch 会联系远程服务器,下载所有最新的提交记录,并将其保存在一个名为 origin/dev 的特殊“远程追踪分支”上。这一步不会对你本地的 dev 分支做任何修改,非常安全。
第二步:更新本地分支并“变基”(Rebase)
IDEA 操作:
-
确保你当前在 dev 分支上。
-
点击更新按钮。
-
将本地自己的dev分支变基到dev
这个操作会智能地完成三件事:
-
把你本地 dev 分支上尚未推送的提交(即你的新代码)暂时“摘下来”,放在一边。
-
将你的本地 dev 分支快进到与刚刚 fetch 下来的 origin/dev 完全一致的状态。
-
最后,把你刚刚“摘下来”的那些提交,一次一个地、重新应用(嫁接)到已经更新的 dev 分支的顶端。
关于冲突:如果在“嫁接”你的某个提交时,发现它和同事的代码修改了同一处,rebase 过程会暂停。此时,你需要:
-
手动解决文件中的冲突。
-
在IDEA中,它会弹出冲突解决工具,解决后点击继续。
-
在命令行中,执行 git add . 将解决后的文件标记起来,然后执行 git rebase --continue 继续变基过程。
第三步:推送你的代码到远程(Push)
经过变基之后,本地 dev 分支不仅包含了团队的所有最新代码,而且你自己的新提交也排在了历史记录的最顶端,最后将它推送到远程仓库了,这次推送将是一个“快进式(Fast-forward)”的推送,不会在远程仓库产生任何合并节点。快进式(Fast-forward)合并,指的是当你要合并的那个分支的所有提交,能够直接“续”在你当前分支的后面,没有任何分叉时,Git所执行的一种最简单的“指针移动”式合并。