git rebase详解

git rebase详解教程

git rebase 命令用于把一个分支的修改合并到当前分支。

git rebase语法

语法

git rebase [options]

参数

参数 描述
options 参数

合并分支详解

语法

git rebase branchName

说明

我们可以使用 git rebase 命令,后面加上分支名,实现合并分支。

解决冲突详解

说明

在 rebase 的过程中,也许会出现冲突(conflict)。在这种情况,Git 会停止 rebase 并会让你去解决冲突;在解决完冲突后,用 git add* 命令去更新这些内容的索引(index),然后,你无需执行 git commit,只要执行:

语法

git rebase --continue

这样 git 会继续应用(apply)余下的补丁。在任何时候,你可以用 --abort 参数来终止 rebase 的行动,并且 “mywork” 分支会回到 rebase 开始前的状态:

git rebase --abort

git rebase与git merge区别

现在我们可以看一下用合并(merge)和用 rebase 所产生的历史的区别,git rebase 如下:

47_git rebase.png

git merge 如下:

48_git rebase.png

当我们使用 git log 来参看 commit 时,其 commit 的顺序也有所不同。假设 C3 提交于 9:00 AM, C5 提交于10:00AM, C4 提交于11:00AM,C6 提交于 12:00AM, 对于使用 git merge 来合并所看到的 commit 的顺序(从新到旧)是:C7 ,C6,C4,C5,C3,C2,C1。

对于使用 git rebase 来合并所看到的 commit 的顺序(从新到旧)是:C7 ,C6‘,C5’,C4,C3,C2,C1,因为 C6’ 提交只是 C6 提交的克隆,C5’ 提交只是 C5 提交的克隆。

从用户的角度看使用 git rebase 来合并后所看到的 commit 的顺序(从新到旧)是:C7 ,C6,C5,C4,C3,C2,C1。

另外,我们在使用 git pull 命令的时候,可以使用 --rebase 参数,即 git pull --rebase,这里表示把你的本地当前分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到 “.git/rebase” 目录中),然后把本地当前分支更新为最新的 “origin” 分支,最后把保存的这些补丁应用到本地当前分支上。

合并分支

语法

git rebase branchName

案例

我们首先,使用 git checkout 基于远程分支 “origin”,创建一个叫 “mywork” 的分支,具体命令如下:

git checkout -b mywork origin

假设,远程分支 “origin” 已经有了 2 个提交,如下图所示:

49_git rebase.png

现在我们在这个分支做一些修改,然后生成两个提交(commit),但是与此同时,有些人也在 “origin” 分支上做了一些修改并且做了提交了,这就意味着 “origin” 和 “mywork” 这两个分支各自 “前进” 了,它们之间 “分叉” 了,如下图所示:

50_git rebase.png

在这里,我们可以用 git pull 命令把 “origin” 分支上的修改拉下来并且和你的修改合并; 结果看起来就像一个新的 “合并的提交”(merge commit):

51_git rebase.png

但是,如果你想让 “mywork” 分支历史看起来像没有经过任何合并一样,你也许可以用 git rebase,具体命令如下:

git checkout mywork git rebase origin

这些命令会把你的 “mywork” 分支里的每个提交(commit)取消掉,并且把它们临时保存为补丁(patch)(这些补丁放到 “.git/rebase” 目录中),然后把 “mywork” 分支更新为最新的 “origin” 分支,最后把保存的这些补丁应用到 “mywork” 分支上:

52_git rebase.png

当 ‘mywork’ 分支更新之后,它会指向这些新创建的提交(commit),而那些老的提交会被丢弃。如果运行垃圾收集命令(pruning garbage collection),这些被丢弃的提交就会删除。

53_git rebase.png

git rebase详解总结

git rebase 命令用于把一个分支的修改合并到当前分支。