Git Rebase 使用
合并多次提交记录
当本地仓库提交了很多次的记录,在push前为了提交记录的简洁,想要将其中的一部分提交记录合并成一条,再push到远程仓库,可以使用git rebase
将最近的三次提交合并:
$ git rebase -i HEAD~~~
$ git rebase -i HEAD~3
-i
表示进入交互界面,
下面显示的记录的顺序与log中的提交信息的顺序是相反的,也就是a是最先提交的,git会在执行时顺序执行a>b>c
pick 1cfe438 a
pick bcf5d95 b
pick bc623e0 c
# Rebase 19d8fa6..bc623e0 onto 19d8fa6 (3 commands)
#
# Commands:
# Rebase 19d8fa6..bc623e0 onto 19d8fa6 (3 commands)
表示将1cfe438 bcf5d95 bc623e0合并放到bc623e0之后,但是具体是合并还是怎么着都是由上面的命令来决定的
# Commands:
# p, pick <commit> = 保留commit
# r, reword <commit> = 保留commit,但是要修改这条commit的提交信息
# e, edit <commit> = 保留commit,但是要修改这条commit(不仅仅是提交的注释,也包含代码修改)
# s, squash <commit> = 将该commit合并到前一个commit
# f, fixup [-C | -c] <commit> = 将该commit合并到前一个commit,但是不保留这条commit的注释信息
# x, exec <command> = 执行shell命令
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <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
# u, update-ref <ref> = track a placeholder for the <ref> to be updated
# to this position in the new commits. The <ref> is
# updated at the end of the rebase
例如要保留a提交,然后将c合并到b上则应该修改为
pick 1cfe438 a
pick bcf5d95 b
s bc623e0 c
保存后会弹出新的交互界面,展示的是b和c的提交信息可以手动进行修改提交的信息,可以删除不要的提交信息,也可以直接注释掉不要的提交信息最终只会保留未注释的提交信息
# This is a combination of 2 commits.
# This is the 1st commit message:
b
# This is the commit message #2:
c
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date: Fri Mar 29 14:08:49 2024 +0800
#
# interactive rebase in progress; onto c376d93
# Last commands done (3 commands done):
# pick b709ef9 b
# squash 0627840 c
# No commands remaining.
# You are currently rebasing branch 'master' on 'c376d93'.
避免提交记录分叉
在日常开发中经常是多条分支开发,在进行合并时不可避免的发生提交记录的分叉
例如上面这样的情况,就是直接merge形成的,有了分叉既看着不美观,同时如果后面对代码进行回滚也不好操作
如果用rebase的方式就可以避免分叉的出现,但是要注意rebase是要在开发分支rebase主分支,而不要将开发分支rebase到主分支,操作顺序是:
- 在开发分支上rebase主分支
$ git rebase master
上面的示例如果使用这种方式的话,结果就是这样的
可以看到C和E出现在了F之后,提交信息的hash值变了,但是整个分支的提交记录简洁了
如果有冲突解决冲突
在主分支上merge开发分支
$ git merge feature
merge后的master分支的提交记录如下
这样就保持了master分支的整洁,以及开发顺序的查看也都很容易地看出来,即便后面进行回滚也容易了
避免合并提交
当多个人共同开发一个分支时,由于其他人在这个分支上先推送了代码,导致推送代码失败,一般我们会使用git pull
来拉取最新的代码并合并到本地,但是这样在查看提交记录的时候就会看到一个合并的提交,而且这个合并的提交是提交记录的分叉点,这样也会影响提交记录的简洁,所以需要避免这种情况的出现,可以通过rebase的方式避免,也就是git pull --rebase
如果使用git pull
,结果是这样的
如果使用git pull --rebase
,结果是这样的
此时再进行git push
,结果是这样的