合并几次 commit 记录

查看需要合并的 commit 记录

1
git log

运行以下命令,将你想要合并的 commit 记录的数量替换为 <要合并的次数>

1
git rebase -i HEAD~<要合并的次数>

例如,如果你想合并最近的 5 次 commit 记录,那么命令会是:

1
git rebase -i HEAD~5

输入命令回车以后,会打开一个交互式的文本编辑器,显示了你选择的 commit 记录(越往下的越新)。每个 commit 记录前面都有一个动作,通常是 pick

你需要将你想要合并的 commit 记录的动作从 pick 改为 squashs(这里的修改操作同vim编辑器一样)。这将合并它们到最前一个 commit(所以下方图中第一行的提交记录不能修改为s,否则会报错:error: cannot 'squash' without a previous commit)

这个错误消息表明在进行 git rebase 操作时,你尝试执行 squash 操作,但 Git 没有找到可以合并(squash)的前一个提交。通常,squash 操作需要合并当前提交与前一个提交,将它们合并成一个新的提交

保存并关闭编辑器后,另一个编辑器会自动打开,允许你编辑合并后的 commit 记录的提交信息。你可以保留其中一个提交信息或编辑为你想要的新信息。

保存并关闭编辑器后,Git 会自动合并这些 commit 记录并更新你的分支(使用一下命令可以修改commit消息)

如果提交到远程仓库,需要强制提交

1
git push -f

git mergegit rebase 区别

在使用git pull 命令时,git pull 是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge

git merge

在执行git merge test 命令以后,merge 命令会把两个分支的最新快照(F、ED、C)以及二者最近的共同祖先(B)进行三方合并,合并的结果是生成一个新的快照G(并提交)。

git rebase

当我们在master (待变基分支)上执行git rebase test(基分支)时,git就会从两者的共同祖先B开始,提取 master 分支上的修改,也就是 C,D 两个 commit ,提取到之后 git 会先保存起来,然后将master 分支指向 test 分支最新提交的节点,也就是 F 节点,然后把提取到的 C,D 接到 F 后面,在这个过程当中,会删除原来 C,D 的 commit 记录,生成新的C‘,D',虽然 C',D' 和原来的C,D 的coommit 的内容是一样的,但是 commit id 是不同的。

rebase 操作如果用一句话进行解释就是改变基底。master 分支原来的基底是A,现在变成了以 test 分支最新的提交 F 做为新的基底了。