Git – rebase命令

Rebase 是一个在另一个基础行程上重新应用提交的过程。它用于将不同分支的提交序列应用到一个最终提交中。它是git merge命令的一个替代方案。它是一个线性的合并过程。

在Git中,术语rebase指的是将一连串的提交移动或合并到一个新的基础提交的过程。重置是非常有益的,它在特性分支工作流程的环境下将这个过程可视化。

在合并分支之前,将其重新归位是很好的做法。

Git Rebase

一般来说,它是git merge命令的一个替代品。合并总是一个向前变化的记录。相对而言,rebase是git中一个引人注目的历史重写工具。它将不同的提交逐一合并。

假设你在主分支做了三个提交,在另一个名为test的分支做了三个提交。如果你合并这个分支,那么它将在一个时间内合并所有的提交。但如果你重新建立分支,则会以线性方式进行合并。请看下面的图片。

Git Rebase

上图描述了git rebase的工作方式。主分支的三个提交与测试分支的提交进行了线性合并。

合并是整合各分支最直接的方式。它在两个最新的分支提交之间进行三向合并。

如何做Rebase

当你在特性分支(测试分支)上做了一些提交,在主分支上做了一些提交。您可以对这些分支中的任何一个进行重定位。使用 git log 命令来跟踪这些修改(提交历史)。签出到你想重新建立的分支。现在执行 rebase 命令,如下所示。

语法:

$git rebase <branch name>

如果分支中存在一些冲突,解决它们,然后执行下面的命令,继续进行修改。

$ git status

它用于检查状态。

$git rebase --continue

上面的命令是用来继续进行你所做的修改的。如果你想跳过修改,你可以按以下方式跳过。

$ git rebase --skip

当重新发布完成后。推送版本库到原点。考虑下面的例子来理解git merge命令。

假设你有一个分支,例如 test2,你正在工作。你现在在test2分支上,对项目的文件newfile1.txt做了一些修改。

把这个文件添加到资源库。

$ git add newfile1.txt

现在,提交这些变化。使用下面的命令。

$ git commit -m "new commit for test2 branch."

输出将看起来像。

[test2 a835504] new commitfor test2 branch
 1 file changed, 1 insertion(+)

将该分支切换到主干。

$ git checkout master

输出:

Switched to branch 'master.'
Your branch is up to date with 'origin/master.'

现在你在主分支上了。我已经把这些修改添加到我的文件中,说是newfile.txt。下面的命令用来在版本库中添加该文件。

$ git add newfile.txt

现在提交该文件的修改。

$ git commit -m " new commit made on the master branch."

输出:

[master 7fe5e7a]  new commit made on master
 1 file changed, 1 insertion(+)
stash MINGW64 ~/Desktop/GitExample2 (master)

要检查日志历史,请执行以下命令。

$ git log --oneline

输出:

Git Rebase

正如我们在日志历史中所看到的,主分支有一个新的提交。如果我想重新建立 test2 分支,应该怎么做?请看下面的rebase分支方案。

Rebase分支

如果我们有许多来自不同分支的提交,并希望将其合并为一个分支。要做到这一点,我们有两个选择,一是合并,二是重写。重置分支是个好办法。

从上面的例子来看,我们已经提交到了主分支,并想在test2分支上重新建立基地。让我们看看下面的命令。

$ git checkout test2

这条命令将把你从主分支切换到test2分支。

输出:

Switched to branch 'test2.'

现在你在 test2 分支上了。因此,你可以将 test2 分支与 master 分支重合。请看下面的命令。

$ git rebase master

这条命令将重新建立 test2 分支,显示为 Applying: new commit on test2 branch。请看下面的输出。

输出:

Git Rebase

Git交互式Rebase

Git为交互式重做提供了便利;它是一个强大的工具,允许对现有的提交进行各种操作,如编辑、重写、重排序等等。交互式重做只能在当前签出的分支上操作。因此,请在侧边栏中设置你的本地HEAD分支。

Git 的交互式 rebase 可以用 rebase 命令来调用,只需在 rebase 命令中输入 -i。这里i代表交互式。该命令的语法如下。

语法:

$ git rebase -i

它将列出所有可用的互动选项。

输出:

Git Rebase

在给定的输出后,它将打开一个带有可用选项的编辑器。考虑一下下面的输出。

输出:

Git Rebase

当我们执行git交互式rebase命令时,它将打开你的默认文本编辑器,并有上述输出。

它所包含的选项列举如下。

  • Pick
  • Reword
  • Edit
  • Squash
  • Fixup
  • Exec
  • Break
  • Drop
  • Label
  • Reset
  • Merge

上述选项在git-rebase中执行它们特定的任务。让我们简单了解一下这些选项中的每一个。

Pick (-p):

在这里,pick代表提交被包括在内。提交的顺序取决于重建过程中pick命令的顺序。如果你不想增加一个提交,你必须删除整个行。

Reword (-r):

reword与pick命令很相似。reword选项暂停了rebase的进程,并提供了一个修改提交信息的机会。它并不影响提交所做的任何修改。

Edit (-e):

编辑选项允许修改提交。修改的意思是,可以增加或完全改变提交内容。我们也可以在rebase continue命令之前做额外的提交。它允许我们将一个大的提交分割成小的提交;此外,我们还可以删除一个提交中的错误修改。

Squash (-s):

squash选项允许你将两个或多个提交合并为一个提交。它还允许我们写一个新的提交信息来描述这些变化。

Fixup (-f):

它和squash命令很相似。它舍弃了要合并的提交的信息。旧的提交消息被用来描述这两个改动。

Exec (-x):

exec选项允许你对一个提交文件运行任意的shell命令。

Break (-b):

break选项在刚刚的位置停止了重塑。它将在以后用’git rebase –continue’命令继续重新发布。

Drop (-d):

删除选项用于删除提交。

Label (-l):

标签选项用于用一个名称来标记当前头部位置。

Reset (-t):

重置选项用于将标头重置为一个标签。

Git Merge 和 Rebase 对比

对于git用户来说,什么时候使用merge命令,什么时候使用rebase,是一个最常见的疑惑。这两个命令是相似的,都是用来合并一个仓库的不同分支的提交。

在共享分支中不推荐重放,因为重放过程会产生不一致的仓库。对于个人来说,重放可能比合并更有用。如果你想看到完整的历史,你应该使用合并。合并跟踪整个提交历史,而rebase重写一个新的提交。

Git rebase命令被认为是git merge的替代品。然而,它们有一些关键的区别。

Git Merge Git Rebase
合并时创建一个最终提交 Git的rebase在rebasing时不会创建任何提交
它将所有的提交合并为一个单一的提交 它创建了一个提交的线性轨迹
它创建了一个图形化的历史,可能有点复杂,难以理解 它创造了一个线性的历史,可以很容易地理解
合并两个分支是安全的 Git的 “rebase “处理了严重的操作
合并可以在公共和私有分支上进行 在公共分支上使用重定位是错误的选择
合并将feature分支的内容与主分支整合在一起。因此,主干分支被改变了,而feature分支的历史保持一致 主分支的重新发布可能会影响到feature分支
merge保留了历史 rebase改写了历史
Git合并一次呈现所有冲突 Git重新建立了一个又一个的冲突

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程