git rebase合并commits不完全指南

假设我们在feature分支上进行功能开发时,一个小功能commit了n多次,当feature代码合并到master时,master上就会出现我们这n多次的提交,如果此时,我们需要进行code review或者回退版本时,这n多个commit就会显得十分碍眼,难道我要一个个commit去check吗?
这时候合并commit就显得很重要的。

本地合并多个commit

假设我在本地分支上已经commit了几次,但是还未push到远程仓库,这时候我想把它们合并为一个commit再提交。

如图,我想把最上面两次提交给合并为一个。

git log。

git rebase -i 807ca8 回车

解释下 git rebase -i 807ca8, 807ca8是最新两次commit后的一个commitID,我们想合并最新两个提交,git rebase 会获取807ca8这个提交前面(前面指时间距离当前更近)的两个提交,-i表示进行vim编辑。出现:

我们想要合并的两个commit记录显示在了顶部, 然后键入i可以进行编辑,

下面Commands解释如下:

pick:保留该commit(缩写:p)

reword:保留该commit,但我需要修改该commit的注释(缩写:r)

edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)

squash:将该commit和前一个commit合并(缩写:s)

fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)

exec:执行shell命令(缩写:x)

drop:我要丢弃该commit(缩写:d)

我们将第二个提交前的pick改为s,将它和前一个commit合并。


然后ESC, 输入:wq保存


在这里,我们可以编辑合并后的提交的提交内容。或者直接esc+:q退出。

此时git log

对比一下,发现合并成功~这时再push到远程仓库。

合并远程commit

如果还想要合并远程commit怎么做呢?

友情提示:远程commit不要随意更改~
方法是一样的。选取commit合并后需要将我们的修改push到远程仓库。

如果运行git push 时报错,改成下面的命令强制提交就好了

git push -u origin master -f

合并仅有的两个commit

在只剩两个commit的情况下,我们使用git rebase会发现有问题,报错如下:
cannot 'squash' without a previous commit,在没有前一个commit时不允许使用squash合并,很好理解,前一个分支都没,你和谁合并呢。

出现这个报错,运行 git rebase --abort 可以退出rebase。

那怎么合并呢?

git reset为你合并。

git reset --soft HEAD^1
git commit --amend
i编辑:wq保存并退出
git push -u origin 分支名 -f
解释一下:

我们发现现在我们只有两次commit,而且没有需要提交的内容。

执行git reset --soft HEAD^1

再git log 发现,最新的提交已经不存在了,只剩一个提交。HEAD^1指向HEAD之前的一个提交。

git status 我们发现那个消失的commit变成了我们本地未提交的更改。

git reset 分支名 意思是回退到某分支(丢弃该分支),

--soft表示,丢弃该提交但是保存这个提交的内容

--hard 会丢弃该提交与该提交的内容.

随后 git commit --amend 将status中的内容与剩余那个提交进行合并,同时可以修改提交的注释。

接着push到远程仓库便完成了合并。

更简单的合并方法

如果我们只需要与上一个commit进行合并,我们在本地commit时,

使用下列命令:

1.git add
2.git commit --amend
3.git push -u origin 分支名 -f

git commit --amend 将当前status中的修改与上一个commit进行合并,且可以编辑上一个提交的注释作为合并后的注释。

完成。

处于不断的学习过程中,总结下来为了以后方便查阅。

希望和各位大佬交流。

你可能感兴趣的:(git,前端)