git rebase
rebase简介
rebase, 意思为变基,即改变分支的的根支。提到rebase就不得不说说merge,他们两个都可以完成相同的的工作(结果),将两个分支进行合并,但他们工作方式完全不同。
merge和rebase最大的不同,merge会保留所有的提交历史记录,而rebase会删除基变分支的历史记录,如下图所示。
merge工作方式图:
rebase工作方式图:
rebase的基本操作
#
# C5---C6---C7 dev1
# /
# C1---C2---C3---C4 dev
git rebase dev
# A'--B'--C' dev1
# /
# D---E---F---G dev
# 在 rebase 的过程中,也许会出现冲突 conflict 。在这种情况, git 会停止 rebase 并会让你去解决冲突。在解决完冲突后,用 git add 命令去更新这些内容。
# 注意,你无需执行 git-commit,只要执行 continue
git rebase --continue
# 这样 git 会继续应用余下的 patch 补丁文件。
# 在任何时候,我们都可以用 --abort 参数来终止 rebase 的行动,并且分支会回到 rebase 开始前的状态。
git rebase —abort
rebase的另一种操作:合并分支
命令:
git rebase -i HEAD~3
上面命令的意思是合并最近的 4 次提交纪录。
# 进入编辑模式
p 9abd07c add bbb
s 16981e9 add ccc
s e0f8d72 add d
# Rebase 7e215b2..e0f8d72 onto 7e215b2 (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# . create a merge commit using the original merge commit's
# . message (or the oneline, if no original merge commit was
# . specified). Use -c <commit> to reword the commit message.
#
# 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.
#
pick:保留该commit(缩写:p)
reword:保留该commit,但我需要修改该commit的注释(缩写:r)
edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash:将该commit和前一个commit合并(缩写:s)
fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
exec:执行shell命令(缩写:x)
drop:我要丢弃该commit(缩写:d)
如果你异常退出了 vim
窗口,可以执行
git rebase --edit-todo
这时候会一直处在这个编辑的模式里,我们可以回去继续编辑,修改完保存一下:
git rebase --continue
rebase最佳实践
- 不要对master分支进行rebase
- 一般来说,执行rebase的分支都是自己本地的分支,没有推送到远程版本库