Git Rebase命令
重定向(Rebasing)是将提交重新应用在另一个基础提交之上的过程。它用于将来自不同分支的一系列提交应用到最终提交中。它是git merge命令的替代方案。它是合并的一个线性过程。
在Git中,重定向一词被指的是将一系列提交移动或合并到一个新的基础提交的过程。重定向非常有益,它在特性分支工作流的环境中可视化了这个过程。
在合并分支之前对分支进行重定向是一个好习惯。
通常,它是git merge命令的一个替代方法。合并始终是一个向前改变的记录。相比之下,rebase是git中一个强大的历史重写工具。它逐个合并不同的提交。
假设你在主分支上做了三个提交,在另一个名为test的分支上也做了三个提交。如果你进行合并,则会将所有提交一次性合并。但如果你进行rebase,那么它将以线性方式合并。请参考下面的图片:
上面的图像描述了git rebase的工作原理。主分支的三个提交与测试分支的提交进行线性合并。
合并是集成分支的最直接的方法。它在最新的两个分支提交之间进行三向合并。
如何进行Rebase
当您在一个功能分支(测试分支)和主分支上进行了一些提交时,您可以对任何一个分支进行rebase操作。使用git log命令来跟踪变更(提交历史)。切换到您想要rebase的目标分支。现在执行以下rebase命令:
语法:
$git rebase <branch name>
如果分支中存在冲突,请解决冲突,并执行以下命令继续更改:
$ git status
它用于检查状态,
$git rebase --continue
上述命令用于继续进行您所做的更改。如果您想跳过更改,可以按照以下方式跳过:
$ git rebase --skip
当rebase完成后,请将仓库推送到远程仓库。请考虑下面的例子,以了解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(+)
HiMaNshU@HiMaNshU-PC MINGW64 ~/Desktop/GitExample2 (master)
要查看日志历史记录,请执行以下命令。
$ git log --oneline
输出:
如我们在日志历史中所见,主分支上有一个新的提交。如果我想将我的test2分支进行rebase,我应该怎么做?请看下面的rebase分支场景:
rebase分支
如果我们有许多来自不同分支的提交想要合并成一个,我们有两个选择:要么用merge,要么用rebase。rebase分支是很好的选择。
根据上面的例子,我们已经在主分支上进行了提交,现在想要将其rebase到test2分支。让我们看看下面的命令:
$ git checkout test2
这个命令将把您从主分支切换到测试2分支。
输出:
Switched to branch 'test2.'
现在你在test2分支上。因此,你可以将test2分支与master分支合并。参见以下命令:
$ git rebase master
此命令将rebase test2分支并显示为
应用中:test2分支上的新提交 。请考虑下面的输出:
输出:
Git 交互式变基
Git 通过交互式变基提供了一个强大的工具,允许对现有的提交进行编辑、重写、重新排序等各种操作。交互式变基只能在当前签出的分支上操作。因此,请在侧边栏设置您的本地 HEAD 分支。
通过 rebase 命令可以调用 Git 交互式变基,只需在 rebase 命令后加上 -i 即可。这里的 ‘ i ‘ 代表交互式(interactive)。该命令的语法如下:
语法:
$ git rebase -i
它将列出所有可用的交互选项。
输出:
在给定的输出之后,它将打开一个带有可用选项的编辑器。考虑以下输出:
输出:
当我们执行git交互式变基命令时,将打开您的默认文本编辑器,并显示以上输出。
它包含的选项如下:
- 挑选
- 改写
- 编辑
- 合并
- 修正
- 执行
- 中断
- 移除
- 标签
- 重置
- 合并
以上选项在git-rebase中执行特定任务。让我们简要了解每个选项。
挑选(-p):
挑选表示该提交项已包含在内。提交项的顺序取决于变基期间挑选命令的顺序。如果您不想添加一条提交,您必须删除整行。
改写(-r):
改写与挑选命令非常相似。改写选项暂停变基过程,并提供机会修改提交信息。它不会影响提交所做的任何更改。
编辑(-e):
编辑选项允许修改提交。修改意味着可以添加或完全更改提交。我们也可以在继续变基命令之前进行额外的提交。它允许我们将一个大提交拆分成较小的提交;此外,我们可以删除提交中的错误更改。
合并(-s):
合并选项允许将两个或多个提交合并为一个提交。它还允许我们编写新的提交信息以描述更改。
修正(-f):
它与合并命令非常相似。它丢弃了要合并的提交的消息。使用旧的提交消息来描述两个更改。
执行(-x):
执行选项允许您对提交运行任意shell命令。
中断(-b):
中断选项在某个位置停止变基。它将使用 ‘git rebase –continue’ 命令在以后继续变基。
移除(-d):
移除选项用于删除提交。
标签(-l):
标签选项用于将当前头位置标记为名称。
重置(-t):
重置选项用于将头重置为标签。
GitMerge vs. Rebase
对于git用户来说,什么时候使用合并命令,何时使用变基是一个最常见的困惑问题。两个命令非常相似,都用于合并仓库中不同分支的提交。
在共享分支中,不推荐使用变基,因为变基过程会创建不一致的仓库。对于个人而言,变基比合并更有用。如果您想查看完整的历史记录,应该使用合并。合并跟踪所有提交的完整历史记录,而变基则重写一个新的历史记录。
Git rebase命令是git merge的一种替代方案。然而,它们有一些关键的区别:
Git合并(Merge) | Git变基(Rebase) |
---|---|
合并会产生一个合并后的最终提交。 | 变基不会在变基时产生任何提交。 |
合并将所有提交合并为一个单独的提交。 | 变基会创建一个线性的提交轨迹。 |
合并会创建一个可能有些复杂的图形历史记录。 | 变基会创建一个易于理解的线性历史记录。 |
在两个分支上合并是安全的。 | Git “变基”是一个比较严厉的操作。 |
可以在公有分支和私有分支上执行合并。 | 在公有分支上使用变基是错误的选择。 |
合并将特性分支的内容与主分支整合在一起。因此,主分支会发生变化,而特性分支的历史记录保持一致。 | 对主分支进行变基可能会影响特性分支。 |
合并保留历史记录。 | 变基重写历史记录。 |
Git合并会一次显示所有冲突。 | Git变基会逐个显示冲突。 |