工作中经常会出现 master 分支有新的 commit,与自己的分支存在冲突,若此时将master分支merge到自己的分支,会在git log中留下一个从master到自己分支的合并(不符合规范且分支会非常乱)那么就需要采用rebase操作将master最新的变更同步到自己的分支;
具体操作:
git rebase master
将最新的master代码同步到本地分支当我们在向 master 分支 merge 代码时,保证master分支commit记录干净,尽量使每个功能只有一个commit,此时就需要用到 rebase 的合并commit功能
假设git提交历史如下:
* b1b8189 - (HEAD -> master) Commit-3
* 5756e15 - Commit-2
* e7ba81d - Commit-1
* 5d39ff2 - Commit-0
想要把 e7ba81d(Commit-1)
、5756e15(Commit-2)
、b1b8189(Commit-3)
合并到一起,并且只保留 e7ba81d(Commit-1)
的 Git message Commit-1
需要使用 git rebase -i
进行提交合并,后面加的参数应该是 最新的一个想保留的 Commit id 。
就我们前面提到的那个例子中,这个「最新的一个想保留的 Commit」就是 5d39ff2(Commit-0)
,于是我们的命令看起来就长这样:
git rebase -i 5d39ff2
// 也可以使用向前找到3个提交的方式 指定该commit
git rebase -i HEAD~3
执行完命令后进入如下界面,选择需要保留的commit message
pick e7ba81d Commit-1
s 5756e15 Commit-2
s b1b8189 Commit-3
# Rebase 5d39ff2..b1b8189 onto 5d39ff2 (3 command(s))
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
// 常用!使用该 Commit,但会被合并到前一个 Commit 当中
# s, squash = use commit, but meld into previous commit
// 常用!和squash一样,但会丢弃该commit message
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
由于该界面为vim界面,退出需要 :wq
完成后再次查看git log
* 2d7b687 - (HEAD -> master) Commit-1
* 5d39ff2 - Commit-0
此时会出现当前分支落后于remote的提示,不用理会因为我们已经将remote分支的多个提交在本地压缩,直接使用 git push -f
( 大胆使用 -f ) 即可将remote分支的commit也进行压缩