📜  Git Rebase

📅  最后修改于: 2020-12-13 15:28:33             🧑  作者: Mango

Git Rebase

重定基调是在另一个基本行程之上重新应用提交的过程。它用于将来自不同分支的一系列提交应用于最终提交。它是git merge命令的替代方法。这是合并的线性过程。

在Git中,术语rebase被称为将一系列提交或移动到新的基本提交中的过程。重定基非常有益,它可以在功能分支工作流程的环境中可视化该过程。

合并分支之前,最好先对其分支进行基础设置。

通常,它是git merge命令的替代方法。合并始终是向前更改的记录。相对而言,rebase是git中令人信服的历史记录重写工具。它一一合并不同的提交。

假设您在master分支中进行了三次提交,在另一个名为test的其他分支中进行了三次提交。如果将其合并,则它将一次合并所有提交。但是,如果您重新设置基础,则它将以线性方式合并。考虑下图:

上图描述了git rebase的工作方式。 master分支的三个提交与test分支的提交线性合并。

合并是集成分支机构的最直接方法。它在两个最新的分支提交之间执行三向合并。

如何调整基准

当您在功能分支(测试分支)上进行某些提交,而在主分支中进行某些提交时。您可以将任何这些分支作为基准。使用git log命令跟踪更改(提交历史记录)。签出到要重新设置基准的所需分支。现在执行rebase命令,如下所示:

句法:

$git rebase 

如果分支中有一些冲突,请解决它们,然后执行以下命令以继续更改:

$ 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.'

现在您在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(+)
HiMaNshU@HiMaNshU-PC MINGW64 ~/Desktop/GitExample2 (master)

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

$ git log --oneline

输出:

正如我们在日志历史记录中看到的那样,master分支中有一个新的提交。如果我想重新建立test2分支的基础,该怎么办?请参阅下面的rebase分支方案:

重新设置分支

如果我们有来自不同分支的许多提交,并希望将其合并到一个。为此,我们有两个选择,要么可以合并它,要么对其重新设置基础。重新设置分支机构很好。

从上面的示例中,我们已提交到master分支,并希望将其基于test2分支。让我们看下面的命令:

$ git checkout test2

此命令将使您从主服务器切换到test2分支。

输出:

Switched to branch 'test2.'

现在您在test2分支上。因此,您可以使用master分支为test2分支重新设置基础。请参阅以下命令:

$ git rebase master

此命令将为test2分支重新设置基础,并显示为Applying:test2分支上的新提交。考虑以下输出:

输出:

Git互动基础

Git借助Interactive Rebase促进了工作;它是一个强大的工具,允许对现有提交执行各种操作,例如编辑,重写,重新排序等。 Interactive Rebase只能在当前签出的分支上进行操作。因此,在侧边栏设置本地HEAD分支。

可以使用rebase命令调用Git交互式rebase,只需将-i和rebase命令一起输入即可。在这里代表互动。该命令的语法如下:

句法:

$ git rebase -i

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

输出:

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

输出:

当我们执行git Interactive rebase命令时,它将使用上述输出打开默认的文本编辑器。

它包含的选项在下面列出:

  • 改写
  • 编辑
  • 壁球
  • 修理
  • 执行力
  • 打破
  • 下降
  • 标签
  • 重启
  • 合并

以上选项使用git-rebase执行其特定任务。让我们简要地了解每个选项。

选择(-p):

Pick站在这里,其中包括提交。提交的顺序取决于变基期间的pick命令的顺序。如果您不想添加提交,则必须删除整行。

改写(-r):

改写与pick命令非常相似。 reword选项暂停了rebase过程,并提供了更改提交消息的机会。它不会影响提交所做的任何更改。

编辑(-e):

编辑选项允许修改提交。修改方式是,可以完全添加或更改提交。我们还可以在rebase继续命令之前进行其他提交。它允许我们将大型提交拆分为较小的提交。此外,我们可以删除在提交中所做的错误更改。

壁球(-s):

squash选项允许您将两个或多个提交合并为一个提交。它还允许我们编写新的提交消息来描述更改。

修正(-f):

它与壁球命令非常相似。它丢弃了要合并的提交消息。较早的提交消息用于描述这两个更改。

执行(-x):

exec选项允许您对提交运行任意的Shell命令。

中断(-b):

break选项将重新定位停止在正好位置。稍后将继续使用“ git rebase –continue ”命令重新设基。

掉落(-d):

drop选项用于删除提交。

标签(-l):

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

重置(-t):

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

GitMerge与Rebase

对于git用户来说,什么时候使用merge命令以及什么时候使用rebase是最常见的令人困惑的问题。这两个命令是相似的,并且都用于合并由存储库的不同分支进行的提交。

不建议在共享分支机构中使用重定基,因为重定基过程将创建不一致的存储库。对于个人而言,重新合并比合并更有用。如果要查看完整的历史记录,则应使用合并。合并跟踪整个提交的历史记录,而重新基准则重写新的提交历史。

Git rebase命令说是git merge的替代方法。但是,它们有一些主要区别:

Git Merge Git Rebase
Merging creates a final commit at merging. Git rebase does not create any commit at rebasing.
It merges all commits as a single commit. It creates a linear track of commits.
It creates a graphical history that might be a bit complex to understand. It creates a linear history that can be easily understood.
It is safe to merge two branches. Git “rebase” deals with the severe operation.
Merging can be performed on both public and private branches. It is the wrong choice to use rebasing on public branches.
Merging integrates the content of the feature branch with the master branch. So, the master branch is changed, and feature branch history remains consistence. Rebasing of the master branch may affect the feature branch.
Merging preserves history. Rebasing rewrites history.
Git merge presents all conflicts at once. Git rebase presents conflicts one by one.