git-rebase合并commits不完全指南

31次阅读

共计 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 进行合并,且可以编辑上一个提交的注释作为合并后的注释。

完成。

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

希望和各位大佬交流。

正文完
 0