git rebase 变基操作介绍

2019-12-13 0 By admin

在使用 GIT 服务做版本管理时,我们对分支常用操作就是合并了。
经常使用到的时 merge 操作,可以明白得记录每个分支上得 commit信息。
另外还有一个 rebase 操作,会根据和合并过来得分支信息,重写当前分支得开始点(基)。

一、rebase 和 Merge 操作比较

1、变基操作后,无法看出原来 commit 提交到那个分支了。
2、commit 提交顺序会被更改。

1.1、创建比较场景

在 master 分支和 dev 分支中各提交两个记录。

1.2、merge 操作说明

merge 操作会保存另个分支得提交信息,可以清晰得看出每个分支得提交记录。

1.3、rebase 操作说明

rebase 操作会将两条并行得 commit 提交记录,合并为一个。这样就不能看出 commit 是提交在那个分支上了。

如图,是将 dev 分支得代码 rebase 到 master 分支的。git 具体的操作过程:

  1. 找到 master 分支和 dev 分支的共同 commit 节点(1st master)。
  2. 将 dev 分支从此节点(1st master)后的commits ,移动到 master 分支的(1st mater)节点后面。
  3. 将原本master 分支(1st master)节点后面的commits ,添加到原来dev commits(移动的) 节点的后面。这样就是对 master 分支(1st master)后面的 commit 做了变基操作。

解决冲突的操作

在rebase的过程中,也许会出现冲突(conflict). 在这种情况,Git会停止rebase并会让你去解决冲突。
1、在解决完冲突后,用”git-add”命令去更新这些内容的索引(index)。
2、你无需执行 git-commit,只要执行:
$ git rebase --continue
这样git会继续应用(apply)余下的补丁。
在任何时候,你可以用–abort参数来终止rebase的行动,并且”mywork” 分支会回到rebase开始前的状态。
$ git rebase --abort

二、rebase 合并多个commit

git rebase -i [startpoint] [endpoint]

-i 的含义是:–interactive, 即弹出交互式的界面让用户编辑完成合并操作
[startpoint] 指合并区间的起点
[endpoint] 指合并区间的终点。省略的话,默认是当前分支的HEAD指向的commit。

  1. 这里的区间是前开后闭区间;前面的值不能取到,后面的值可以取到。
  2. 如果 [endpoint] 不是当前分支的HEAD指向的Commit,则可能会涉及到临时分支操作。
  3. 合并commit操作后,会修改后面的commit 的ID。

2.1、确定区间,开始操作

git rebase -i HEAD~3

2.2、编辑交互界面

将要合并操作的分支行,第一个单词改为 s(squash);保存退出;

p, pick: 保留该 commit。
r, reword: 保留该 commit,可以修改 commit 的注释。
e, eidt: 保留该 commit,但停下来修改该 commit (不仅仅是注释),可以用来解决 merge 冲突。
s, squash: 将该 commit 和 前面一个 commit 合并。
f, fixup: 将该 commit 和 前面一个 commit 合并,但不保留该提交的注释信息。
x, exec: 执行 shell 命令。
d, drop: 丢弃该 commit。

2.3、编辑Commit 注释界面

在新打开的交互界面中,填写 commit 的注释,并保存退出。

2.4、没有临时分支的情况下,提交

git push --force 将修改记录推送到远程。