Git 合并几次 commit 记录
合并几次 commit 记录
查看需要合并的 commit
记录
1 | git log |
运行以下命令,将你想要合并的 commit 记录的数量替换为 <要合并的次数>
:
1 | git rebase -i HEAD~<要合并的次数> |
例如,如果你想合并最近的 5 次 commit 记录,那么命令会是:
1 | git rebase -i HEAD~5 |
输入命令回车以后,会打开一个交互式的文本编辑器,显示了你选择的 commit 记录(越往下的越新)。每个 commit 记录前面都有一个动作,通常是 pick
。
你需要将你想要合并的 commit 记录的动作从 pick
改为 squash
或 s
(这里的修改操作同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 merge
和 git rebase
区别
在使用git pull
命令时,git pull
是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge
git merge
在执行git merge test
命令以后,merge
命令会把两个分支的最新快照(F、E
和 D、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
做为新的基底了。