手把手教你:git rebase 合并多个提交
- 前言
- 场景一:rebase 合并提交
-
- 操作步骤:
- 场景二:rebase 到主分支
-
- 操作步骤:
- 总结
在实际的项目开发过程中,往往会出现多人在同一个代码库中开发的情况,每个人都会在自己的分支上进行功能开发,之后再提个 pr 让同事 review 一下代码,再合并到主分支上。这个过程就需要用到 rebase 命令,帮助我们更好的优化提交记录。
- 首先,我们从 main 分支上拉取出来一个 dev 分支,开发一个添加用户的功能。
- 在 dev 分支上开发好功能后,做了一次提交,commit 信息为 【feature: add user】。
- 在测试的时候,发现了两个 bug,所以又做了两次 bugfix 的提交。这时查看我们的 dev 分支的 log,会发现这三个 commit 都有。但是最终合并到主分支的时候,只想保留 feature 信息,并不想保留两个 bugfix 信息,这时候就需要 变基功能——rebase。
操作步骤:
- 【dev 分支】
git log
查看提交记录:
commit: hash3
bugfix2: fix db bug
commit: hash2
bugfix1: fix error bug
commit: hash1
feature:add user
commit: hash0
main 分支的提交 commit
- 【dev 分支】rebase 需要保留的 commit 提交信息的上一个哈希值:
git rebase -i hash0
- 【dev 分支】运行上述命令后,会出现一个编辑框:
pick hash1 feature:add user
pick hash2 bugfix1: fix error bug
pick hash3 bugfix2: fix db bug
(1) 需要保留的是第一个,保持前面的命令 pick 不动
(2) 将第二行和第三行的命令 pick 改成 squash
(3) wq 保存并退出
- 【dev 分支】wq 保存并退出后,又出现一个编辑框,里面是你需要保留的 commit 信息:
# 这是一个 3 个提交的组合。
# 这是第一个提交说明:
feature:add user
# 这是提交说明 #2:
bugfix1: fix error bug
# 这是提交说明 #3:
bugfix2: fix db bug
我们把不需要的 commit 信息(bugfix1 和 bugfix2)直接删掉,
保留第一个的 commit 信息(也可以修改一下),再次 wq 保存并退出。
- 【dev 分支】
git log
查看提交记录,就只有一条我们想保留的 commit 记录了(feature:add user)。检查一下代码,发现之后的两个 bugfix 修改的代码都在。
还是上面的例子,这时候,我们的 dev 分支就只有 feature 这一个提交了。现在想合并到主分支 main 上去,远端已经有其他同事提交的 feature2。传统做法是使用 git merge,但是在 main 分支上的提交历史里就会出现一个额外的 merge 节点,不是很美观。这时就需要 变基功能——rebase。
操作步骤:
- 【dev 分支】
git fetch --all
同步一下远端代码。 - 【dev 分支】
git rebase origin/main
变基到远端的 main 分支上。 - 【dev 分支】如果有冲突,先
git status
查看一下,修改了冲突的文件后,使用git add .
将冲突的地方 add 一下。 - 【dev 分支】
git rebase --continue
继续变基,如果确定已经解决并 add 了冲突的文件,还是出现提示让你 add 的情况,就使用git rebase --skip
命令跳过。 - 【dev 分支】重复步骤 3 和 4,直到将所有的冲突解决完毕。
- 【dev 分支】将本地的修改 push 到远端的 dev 分支上,然后就可以提一个 pr(mr)让同事愉快地 review 代码了。
- 【dev 分支】代码 review 通过且合并后,本地拉取一下远端的 main 分支的代码
git pull origin/main
,然后在git log
查看一下提交记录:
commit: hash1
feature:add user
commit: hash_feature2
feature2: add group
commit: hash0
main 分支的提交 commit
提交记录明明白白、清清爽爽,就像大家一直在 main 分支上提交一样,并且一个 feature 就是一个commit,方便以后 cherry-pick 和 review,完美!
以上就是今天要讲的内容,本文仅仅简单介绍了git rebase 的使用,还有其他更高级的用法,大家可以多查阅官方文档,往往能有事半功倍的效果。