共计 1682 个字符,预计需要花费 5 分钟才能阅读完成。
假设我们在 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 进行合并,且可以编辑上一个提交的注释作为合并后的注释。
完成。
处于不断的学习过程中,总结下来为了以后方便查阅。
希望和各位大佬交流。