当前位置:   article > 正文

Git进阶之合并多次commit

cannot 'squash' without a previous commit

前言

当我们开发一个功能,不是一时半会可以完成的时候,为了保护代码不丢失,通常会把这次的修改先 commit,等到这个功能完全做好,再 push。不过这样一来,就会有很多零碎的 commit 记录,这会使远程的提交历史显得杂乱。

必要的时候,我们需要将这些相近的 commit 合并为一个 commit 再 push。当然了,如果你想合并远程的 commit 也是可以的,但请一定要提前跟团队里的其他人说一声,免得有人也在跟你做同样的事情,导致没必要的代码冲突(所以合并 commit 尽量在 push 前)。

操作步骤

1. git log 查看commit节点id

git log --oneline

我喜欢在 log 的时候,带上参数 `--oneline` ,它可以让你的 commit log 在一行输出,比较紧凑,coimmit id 也以简短的位数展示,便于查看。

找到你要保留的那条 commit 的上一条 commit,复制这条 commit 的 id。记住一定要是目标提交的上一次提交记录,这样可以保证你要保留的那一条 commit 出现在 pick 清单的顶部,这非常重要。

2. git rebase 变基

git rebase -i [commit_id]

`[commit_id]` 就放你在第1步复制的那个值。

然后就会进入 rebase 界面,类似这样:

d67e9bf88670e477590a7f4c145e288f.jpeg

注意:观察头部的 commit 清单,确保你要保留的那条 commit 出现在内。一切顺利的话,它会出现在顶部第一条。

3. 修改 `pick` 为 `squash`

vi指令 `i` 进入编辑模式,修改你不想保留的 commit 记录前的 `pick` 为 `squash`(或者`s`)。`git` 会把前面为 `squash`的 commit 记录与它的上一条记录合并为一条。

注意要确保第一条为 `pick`,因为`squash`的作用是把 commit 合并到上一个提交,所以必须保证至少第一个提交被 `pick`。

如果你不小心把所有的`pick`都改为了`s`,然后保存退出,会收到一个错误提示:`cannot 'squash' without a previous commit`。不要怕,根据它的下一个提示操作就可以了:

  1. You can fix this with 'git rebase --edit-todo' and then run 'git rebase --continue'.
  2. Or you can abort the rebase with 'git rebase --abort'.

尽管它提示了2种方法来处理,我还是推荐你使用`git rebase --abort`,然后重来一次 rebase,这样最稳妥。

4. 处理合并后的commit message

如果第3步顺利的话,`esc`之后,`:`进入指令模式,输入vi指令`wq`,保存并退出vi界面,然后会进入另一个vi界面,在这里它会把你合并的这些commit的日志列出来,便于你编辑。

同样使用vi指令`i`进入编辑模式,编辑完后,`esc`+`:`+`wq`回车退出。然后会出现

`Successfully rebased and updated refs/heads/xxx.`说明commit合并成功了。

5. 如果修改的是远程的commit,则强制push一把

git push -f

如果你还没 push,只是处理本地的 commit,则不需要这一步。否则,就需要把这次的rebase 强制覆盖远程分支。

done!

现在可以 `git log --oneline` 看下,是不是 commit 数量已经减少了,并且你指定的那些 commit 都合并为了一条,message 就是你在第4步处理的内容。

- End -

f141e53b7fc320ec3ea86d808b3e5d44.png

相关文章推荐:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/609764
推荐阅读
相关标签
  

闽ICP备14008679号