菜鸟笔记
提升您的技术认知

手把手教你:git rebase 合并多个提交

手把手教你:git rebase 合并多个提交

  • 前言
  • 场景一:rebase 合并提交
    • 操作步骤:
  • 场景二:rebase 到主分支
    • 操作步骤:
  • 总结

前言

在实际的项目开发过程中,往往会出现多人在同一个代码库中开发的情况,每个人都会在自己的分支上进行功能开发,之后再提个 pr 让同事 review 一下代码,再合并到主分支上。这个过程就需要用到 rebase 命令,帮助我们更好的优化提交记录。

场景一:rebase 合并提交

  1. 首先,我们从 main 分支上拉取出来一个 dev 分支,开发一个添加用户的功能。
  2. 在 dev 分支上开发好功能后,做了一次提交,commit 信息为 【feature: add user】。
  3. 在测试的时候,发现了两个 bug,所以又做了两次 bugfix 的提交。这时查看我们的 dev 分支的 log,会发现这三个 commit 都有。但是最终合并到主分支的时候,只想保留 feature 信息,并不想保留两个 bugfix 信息,这时候就需要 变基功能——rebase

操作步骤:

  1. 【dev 分支】git log 查看提交记录:
commit: hash3
	bugfix2: fix db bug

commit: hash2
	bugfix1: fix error bug

commit: hash1
	feature:add user

commit: hash0
	main 分支的提交 commit
  1. 【dev 分支】rebase 需要保留的 commit 提交信息的上一个哈希值:
git rebase -i hash0
  1. 【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 保存并退出
  1. 【dev 分支】wq 保存并退出后,又出现一个编辑框,里面是你需要保留的 commit 信息:
# 这是一个 3 个提交的组合。
# 这是第一个提交说明:
feature:add user
# 这是提交说明 #2:
bugfix1: fix error bug
# 这是提交说明 #3:
bugfix2: fix db bug
我们把不需要的 commit 信息(bugfix1 和 bugfix2)直接删掉,
保留第一个的 commit 信息(也可以修改一下),再次 wq 保存并退出。
  1. 【dev 分支】git log 查看提交记录,就只有一条我们想保留的 commit 记录了(feature:add user)。检查一下代码,发现之后的两个 bugfix 修改的代码都在。

场景二:rebase 到主分支

还是上面的例子,这时候,我们的 dev 分支就只有 feature 这一个提交了。现在想合并到主分支 main 上去,远端已经有其他同事提交的 feature2。传统做法是使用 git merge,但是在 main 分支上的提交历史里就会出现一个额外的 merge 节点,不是很美观。这时就需要 变基功能——rebase

操作步骤:

  1. 【dev 分支】git fetch --all 同步一下远端代码。
  2. 【dev 分支】git rebase origin/main 变基到远端的 main 分支上。
  3. 【dev 分支】如果有冲突,先 git status 查看一下,修改了冲突的文件后,使用 git add . 将冲突的地方 add 一下。
  4. 【dev 分支】git rebase --continue 继续变基,如果确定已经解决并 add 了冲突的文件,还是出现提示让你 add 的情况,就使用 git rebase --skip 命令跳过。
  5. 【dev 分支】重复步骤 3 和 4,直到将所有的冲突解决完毕。
  6. 【dev 分支】将本地的修改 push 到远端的 dev 分支上,然后就可以提一个 pr(mr)让同事愉快地 review 代码了。
  7. 【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 的使用,还有其他更高级的用法,大家可以多查阅官方文档,往往能有事半功倍的效果。