当你在开发软件时,频繁的提交(commit)能帮你更好地追踪代码变化。然而,当一系列小的改动造成了大量的提交记录,合并(squash)这些提交能让历史更加清晰易读。
在 Git 中,我们可以通过交互式 rebase 来实现这一点。现在,我会带你用一种简单易懂的方式,一步步地学会如何合并多个 commit。
交互式 rebase 是 Git 的一个强大功能,它允许你重写历史—即重写连续的提交序列。你可以用它来修改提交的顺序,改变提交信息,甚至合并提交。
要开始合并提交,首先打开你的终端(Terminal),然后切换到你的项目目录下。为了展示这个过程,我们首先查看当前的提交历史:
shgit log --oneline
你会看到类似这样的输出:
plaintexta1b2c3d 最新的改动 e4f5g6h 一些小的改动 i7j8k9l 又一些小的改动 ...
现在我们开始交互式 rebase。如果你想合并最近的三个提交,你可以这样做:
shgit rebase -i HEAD~3
运行上面的命令后,你的默认文本编辑器会打开一个带有提交列表的文件,每个提交前都有 pick
字样。它看起来可能类似于这样:
plaintextpick e4f5g6h 一些小的改动 pick i7j8k9l 又一些小的改动 pick a1b2c3d 最新的改动
要合并这些提交,你需要把除了第一个提交之外的所有 pick
改成 squash
或简写 s
。这表示你想将这些提交合并到前一个提交中。
plaintextpick e4f5g6h 一些小的改动 squash i7j8k9l 又一些小的改动 squash a1b2c3d 最新的改动
保存并关闭编辑器后,Git 会开始合并提交。如果合并的提交有各自不同的提交信息,Git 会让你编辑一个新的提交信息来替代这些被合并的提交信息。
编辑器会展示所有原始的提交信息,并让你编辑。你可以完全自定义这个新的提交信息,通常是一个总结性的信息。完成后保存并关闭编辑器。
一旦完成上述步骤,你可以通过以下命令检查新的提交历史:
shgit log --oneline
你应该会看到一个新的提交代替了之前的三个提交。
如果你之前的提交已经推送到了远程仓库,你需要用 force push 来覆盖远程仓库中的历史:
shgit push origin <branch-name> --force
⚠️ 注意:强制推送会重写远程仓库的历史,这在团队协作中可能会有问题。确保你的团队成员了解你的变更,避免工作冲突。
这是一个强大的特性,能够帮助你维护一个干净、有条理的提交历史。使用这些技巧,你可以提高你的代码库的整洁性和可读性,也可以在需要的时候更容易地回溯和理解历史改动。但是,务必谨慎地使用交互式 rebase 和 force push,特别是在多人协作的项目中,因为这会重写历史,可能会影响到其他人的工作。