Git Rebase

住儿
• 阅读 289

什么是 git rebase

git rebase 是将更改从一个分支合并到另一个分支的两个 git 过程之一 (另一个是git merge)。

虽然 merge 总是可以简单的地合并分支,但是 rebase 可以更强大(也更危险) ,因为它允许我们重写历史。

为什么需要使用 git rebase 呢?

rebase 是将一系列提交移动或组合(即压缩)到一个新 base 的提交过程。

想象一下,你现在正在处理一个 feature 分支,过了一段时间,你意识到 main (有时候也叫“master”)分支,已经被其他人的更新了。这意味着你的分支现在已经偏离了主分支。在某些时候,你可能希望在 feature 分支中包含 main 分支上的更改。常见做法是简单地从 main 中进行一个 git pull,这样将会在 feature 分支添加一个 commit 记录。

这种方法的问题可能是:

  • 合并提交可能非常模糊,在 git 树中提供的信息非常少,这使得调试变得更加困难

  • 多次通过pull/merge更新一个分支可以得到类似下面这样的 git 历史记录

Git Rebase

rebase 的目标是保持一个干净、清晰的项目历史记录。因此,我们可以告诉分支将其提交移动到最新更改的顶部,而不是 pull main 分支更改并添加合并提交。

通过将 feature 分支的 rebasemain 分支的顶部,我们可以在获取最新的 main 更新时保持所有更改和提交不变。为了实现这一点,我们可以在 feature 分支中执行以下命令:

$ git rebase main

这将启动 rebase 过程。如果没有发现任何冲突,你应该会看到一条成功消息,并且你的 feature 分支现在与 main 分支保持同步,这样我们离类似于以下内容的项目历史记录又近了一步:

Git Rebase

交互式 rebase

交互式 rebase 带来的力量,可以让 rebase 到一个全新的阶段!它允许我们以不同的方式交互式地更改多个提交。

您可以通过执行 rebase 命令,后跟-i 参数和我们想要修改的提交来启动交互式 rebase:

$ git rebase -i <commit hash | HEAD position>

Git Rebase

通过查看 CLI 中显示的命令列表,我们可以知道这个工具有多么强大!我们可以编辑提交, squash 它们,delete 它们,edit 它们,等等。我们甚至可以永久地更改提交顺序!

squash

squash 允许我们指定要组合的提交,以帮助维护干净的历史记录。

像这样的东西看起来很熟悉吗?

Git Rebase

如果你喜欢在工作时提交很多东西,你可能不喜欢考虑对每一条提交消息都进行详细的描述。在这些情况下,squash 可能非常有用,因为启动交互式 rebase,然后您可以告诉 git 哪些提交将被“合并”为一个(或多个),然后编辑其提交消息。

请记住,我们必须始终将一个提交 squash 到另一个提交中。

因此,假设我们有 6 个提交,我们认为其中只有两个是必需的,我们可以压缩其他 4 个,如下所示:

$ git rebase -i HEAD~

Git Rebase

在这种情况下,我们说我们要合并提交 2 - 5,并将它们包含在第一个(77497f5)中,并保持最后一个提交不变。

接下来,git 将每个提交重新定位到他们的新 base(77497f5),如果没有冲突,你将能够更改他们的最终提交消息,瞧!总共只有 2 次提交!

我们可能发生的错误

冲突

与 git 合并时发生的情况类似,用另一个分支更新分支可能会导致代码冲突。

rebase 冲突的一大区别在于,我们处理的不是一个合并提交,而是(可能)移动多个提交。

这意味着解决冲突的 rebase 是一个迭代过程,通过每个提交被 rebase

Git Rebase

在一个有两次提交的 feature 分支中,如果在 rebase 提交 A 的基础时发现了冲突,我们就修复它,告诉 git 继续进程到下一次提交,修复提交 B 上的新冲突。

rebasepush 本地分支

rebase 本地 feature 分支的 base 意味着我们正在重写历史,所以这实际上意味着我们没有选择提交给新基础的特性分支。尽管看上去像是一切都是相同的 git 在目标分支上创建了新的提交。

在我们的交互式 rebase 的任何时候,如果事情变得太混乱,我们不再知道如何修复它们,我们可以中止整个进程在终端和交互式 rebase :

$ git rebase --abort

结论

正如你所看到的,rebase 可以用于许多不同的目的,特别是使用交互式 rebase 功能。

如果在理解 git rebase 的遇到一些问题不要担心,这个理解起来本来就不是很容易,大家可以静下心慢慢去研究。

点赞
收藏
评论区
推荐文章
放学路上 放学路上
2年前
git常见合并冲突场景以及解决办法
git很好用,但是遇到合并冲突就会很痛苦!在此之前我一直都是个人开发者,因此对git的使用也不熟悉,本文将持续总结我在使用git合并过程中遇到的冲突的场景以及产生冲突后的解决办法。如果有不足的的地方还请各位大佬指正!一、第一种情况1、场景描述:当两人都拉取了同一个分支的代码,然后两人都对代码进行了修改,假设其中一人把他修改完的代码上传到master分支,这时
Stella981 Stella981
2年前
Git项目管理使用心得(个人笔记)
Git分支管理模式如下:!(https://oscimg.oschina.net/oscnet/29bc3d558581ef478cac65589db0912e1ff.jpg)(▲独家手绘,转载烦请注明来源)注解:git主要分master、dev这两个分支。1、master分支用于存储线上稳定、可运行、自以为无Bu
Stella981 Stella981
2年前
Git 使用教程—以 GitLab 上的 Django 项目为例
一、代码提交流程1\.clone代码到本地有两个命令,第一个是clonemaster主分支代码,第二个是clone某个branch分支代码。团队项目开发中,我一般是clone别人分支代码进行整合,master主分支代码很少动。gitclonehttp://www.xxx.xxx.git
Stella981 Stella981
2年前
Git本地分支和远程分支关联
转载:https://blog.csdn.net/cherishhere/article/details/52606884(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fblog.csdn.net%2Fcherishhere%2Farticle%2Fdetails%2F52606884
Stella981 Stella981
2年前
Git常用操作
本文(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Faicode.cc%2Farticle%2F429.html)并非讲解分支管理知识,而是记录了Git分支管理的一些命令使用方法,供使用时参考。以下使用<branch\_name表示用户需要替换的内容创建分支
Stella981 Stella981
2年前
Git详解之三 Git分支(第二部分)
3.3 分支的管理到目前为止,你已经学会了如何创建、合并和删除分支。除此之外,我们还需要学习如何管理分支,在日后的常规工作中会经常用到下面介绍的管理命令。gitbranch 命令不仅仅能创建和删除分支,如果不加任何参数,它会给出当前所有分支的清单:$ git branch iss53  master 
Stella981 Stella981
2年前
GitFlow原理浅析
一、Git优点分布式存储,本地仓库包含了远程仓库的所有内容.安全性高,远程仓库文件丢失了也不怕优秀的分支模型,创建/合并分支非常的方便方便快速,由于代码本地都有存储,所以从远程拉取和分支合并时都非常快捷当分支过多时,如何管理这些分支呢?我们团队采用了GitFlow的模式
小万哥 小万哥
1年前
Git分支教程:详解分支创建、合并、删除等操作
Git是一种强大的分布式版本控制系统,它的分支功能使得团队协作和代码管理变得更加灵活和高效。分支可以让开发人员在不影响主线开发的情况下进行并行开发和实验性工作。本篇博客将详解Git分支的创建、合并、删除等操作,帮助你更好地理解和使用Git的分支功能。分支的
绣鸾 绣鸾
8个月前
Fork for Mac(Git客户端)
是一款适用于Mac平台的Git客户端,它提供了一系列强大的功能,包括分支管理、代码比较、合并和冲突解决等。以下是Fork的一些特点和优点:直观的用户界面:Fork具有直观的用户界面和简单易用的操作,可以帮助用户快速地学习和使用Git。分支管理:该软件提供了
小万哥 小万哥
4个月前
Git 分支管理:优化版本控制与应急处理的关键策略
使用Git分支:轻松管理不同版本和应对紧急情况的最佳实践使用Git分支在Git中,分支是主仓库的新/独立版本。假设你有一个大型项目,需要对其进行设计更新。没有使用Git时:复制所有相关文件以避免影响实时版本开始进行设计工作,并发现代码依赖于其他文件中的代码
住儿
住儿
Lv1
明月却多情,随人处处行。
文章
3
粉丝
3
获赞
5