`

Git Rebase原理以及黄金准则详解

 
阅读更多

本文主要讲解下Git Rebase的基本概念用法、其内部原理以及我们在真实项目中使用Git Rebase应该遵循的原则以及为啥需要遵循这些原则。

Base of Rebase

相信对于rebase肯定不会陌生,就好像上图描述的过程一样,当你使用rebase命令的时候,即好像将你需要去rebase的分支拔下来然后重新插到另一个分支上。官方对于rebase的描述为:


“git-rebase: Forward-port local commits to the updated upstream head”— git doc

翻译一下,就是讲你在某个分支上的所有提交记录移花接木到另一个分支上。这边需要强调一个概念:reapply,使用rebase并不是简单地好像你用ctrl-x/ctrl-v进行剪切复制一样,rebase会依次地将你所要操作的分支的所有提交应用到目标分支上。也就是说,实际上在执行rebase的时候,有两个隐含的注意点:

  • 在重放之前的提交的时候,Git会创建新的提交,也就是说即使你重放的提交与之前的一模一样Git也会将之当做新的独立的提交进行处理。

  • Git rebase并不会删除老的提交,也就是说你在对某个分支执行了rebase操作之后,老的提交仍然会存放在.git文件夹的objects目录下。如果你对于Git是如何存放你的提交不太了解的话可以参考这篇文章:Understanding git for real by exploring the .git directory

基于以上表述,我们可以得出以下相对更准确的Git rebase的工作流程:

从上图可以看出,在对特征分支进行rebase之后,其等效于创建了新的提交。并且老的提交也没有被销毁,只是简单地不能再被访问或者使用。在对于分支的章节我们曾经提及,一个分支只是一个执行提交的指针。因此如果既没有分支或者Tag指向某个提交,该提交将无法再被访问使用,但是该提交会一直存在于你的文件系统中,占用着你的磁盘存储。

Golden Rule of Rebase

“No one shall rebase a shared branch” — Everyone about rebase

估计你也肯定看过这个原则,不过可能表述不一样罢了。本章节就是用实例的角度来探讨下,为啥不能再一个共享的分支上进行Git rebase操作。所谓共享的分支,即是指那些存在于远端并且允许团队中的其他人进行Pull操作的分支。假设现在Bob和Anna在同一个项目组中工作,项目所属的仓库和分支大概是下图这样:

现在Bob为了图一时方便打破了原则,正巧这时Anna在特征分支上进行了新的提交,此时的结构图大概是这样的:

当Bob打算推送自己的分支到远端的时候,它收到了如下的警告:

Git尝试着使用fast-forward来合并你的分支,具体的细节我们会在其他博客中进行讨论,这边只需要明白远端的Git Server被Bob搞得一头雾水,不知道应该如何去合并。此时Bob为了推送他的本地的提交,只能选择强行合并,即告诉远端:不要再尝试着合并我推送给你的和你已经有点提交,一切按照我推送过去的来。那么Git会进行如下操作:

然后呢,当Anna也进行推送的时候,她会得到如下的提醒:

这个消息很正常,没啥特殊的,只是Git提醒Anna她本地的版本与远程分支并不一致,在Anna提交之前,分支中的Commit序列是如下这样的:


A--B--C--D'   origin/feature // GitHub

A--B--D--E    feature        // Anna

在进行Pull操作之后,Git会进行自动地合并操作,结果大概是这样的:

这个第M个提交即代表着合并的提交,也就是Anna本地的分支与Github上的特征分支最终合并的点,现在Anna解决了所有的合并冲突并且可以Push她的代码,在Bob进行Pull之后,每个人的Git Commit结构为:

到这里,看到上面这个混乱的流线图,相信你对于Rebase和所谓的黄金准则也有了更形象深入的理解。这还只是仅有两个人,一个特征分支的项目因为误用rebase产生的后果。如果你团队中的每个人都对公共分支进行rebase操作,那还不得一团乱麻。另外,相信你也注意到,在远端的仓库中存有大量的重复的Commit信息,这会大大浪费我们的存储空间。如果你还觉得这么什么,那我们来假设下还有一哥们Emma,第三个开发人员,在他进行了本地Commit并且Push到远端之后,仓库变为了:

 

分享到:
评论

相关推荐

    git rebase 合并提交记录,学习代码

    本文将深入探讨`git rebase`的原理和使用方法。 ### Git Rebase 基本概念 `git rebase`主要用于将一个分支的提交历史移动到另一个分支的前面,通常用于在向主分支(如`master`或`main`)合并之前整理提交。这个...

    前端大厂最新面试题-git rebase_ git merge.docx

    git rebase 和 git merge 的理解与区别 Git 是一个版本控制系统,广泛应用于软件开发过程中。其中,git rebase 和 git merge 是两个常用的命令,都是用于合并分支,但是它们的实现机制和应用场景却有所不同。 git...

    详解git merge 与 git rebase的区别

    Git 是一个分布式版本控制系统,它提供了两种合并分支的策略:`git merge` 和 `git rebase`。两者都是为了整合不同分支的更改,但它们在处理合并的方式上有显著的差异。 ## Git Merge `git merge` 是最常见的合并...

    Git原理及范例详解

    Git 原理及范例详解 Git 是一个分布式版本控制系统,允许开发者在本地存储项目的所有版本记录,并且可以与远程仓库同步。Git 的核心思想是基于 snapshot,而不是基于差异(diff),这使得 Git 在版本控制方面具有...

    git rebase 将提交点放置在一条直线上,提交点根据合并时间排序

    git rebase 命令可以将提交点放置在一条直线上,并根据提交时间进行排序。这是 git rebase 的一个常见用途。 当使用 git rebase 时,Git 会从指定的提交开始,重新应用后续的提交。这样可以将一系列提交重新排列,形成...

    Node.js-Rebase-editor一个专门用于Git交互式rebase的简单CLI应用

    **Node.js - Rebase-editor: 为Git交互式rebase打造的CLI工具** Git作为一款强大的版本控制系统,其丰富的功能让开发者在管理代码历史时有了极大的灵活性。在这些功能中,`git rebase` 是一个非常有用的命令,它...

    Git原理详解与实操指南.zip

    Git原理详解与实操指南\pdf\01 版本控制系统介绍:为什么要使用git?-专栏. Git原理详解与实操指南\pdf\02 环境准备:在各系统中快速安装 git 环境-专栏. Git原理详解与实操指南\pdf\03 初识Git本地创建一个 Git ...

    vscode-git-rebase:⌥VSCode扩展,可使用热键快速设置交互式git rebase的操作

    Git Rebase(Visual Studio代码扩展) 使用键盘快捷键可以快速编辑交互式Git基准库的操作。 如何使用 按下与您所需的git rebase操作相对应的键。 此命令将应用于所有选定的行。 键盘快捷键: p将命令设置为“ ...

    Git 原理详解及实用指南.zip

    Git 原理详解: 1. **数据模型**:Git 的核心是基于内容寻址的文件存储系统。每个文件被哈希计算成一个唯一的ID(SHA-1),这个ID代表了文件的内容。每次提交时,Git 创建一个包含所有文件哈希的新快照,并保存一个...

    git rebase -i 修改历史提交的方法

    在Git的众多功能中,rebase是一种强大的工具,可以调整提交历史的顺序以及内容。这篇文章将详细探讨使用`git rebase -i`命令修改历史提交的方法,这对于初学者和专业开发者都具有一定的学习价值。 ### 什么是`git ...

    Sungq1990#blog#git rebase操作1

    merge主要发生在这样几个地方1 两个人同时开发一个分支,在拉取对方代码的时候2 要将代码合并到master的时候git pull origin master

    git rebase 成功之后撤销的操作方法

    然而,不当使用`git rebase`可能会导致问题,特别是当你已经完成了一个rebase操作后,可能需要知道如何撤销它。本文将详细介绍在`git rebase`成功后如何恢复到rebase前的状态。 `git rebase`的主要功能是将一个分支...

    git rebase -i合并多次提交的实现

    这时,`git rebase -i` 命令就显得非常有用。本文将详细介绍如何使用 `git rebase -i` 实现合并多次提交。 `git rebase` 是 Git 中的一个强大功能,主要用于调整提交历史,使其看起来更加线性和简洁。`-i` 参数是 `...

    git原理详解及实用指南(好书).rar

    Git是当今最流行的分布式版本控制系统,它被广泛用于软件开发和其他需要版本管理的项目。本指南将深入探讨Git的...无论你是初级开发者还是经验丰富的专家,这本"git原理详解及实用指南"都将是你提升Git技能的宝贵资源。

    Git实战IDEA操作

    Git实战IDEA操作详解 Git是一款分布式版本控制系统,它在软件开发中扮演着至关重要的角色,帮助团队协作和代码管理。IntelliJ IDEA(简称IDEA)是广受欢迎的Java集成开发环境,同样也提供了强大的Git集成功能。本文...

    Git 原理详解及实用指南.rar

    本教程“Git原理详解及实用指南”旨在帮助你深入了解Git的工作原理,并提供实用的操作指导,助你在工作中更加得心应手。 Git的核心原理基于三个基本概念:工作目录、暂存区和仓库。工作目录是你日常编辑代码的地方...

    git,修改commit,合并commit

    git rebase -i HEAD~n,n条commit进行rebase 将需要修改的commit信息,将pick命令改为 r 命令;ESC 输入 :wq 回车 开始修改commit信息,修改完,ESC 输入 :wq 回车 打印出成功 git log oneline -n,查看n条log信息,...

Global site tag (gtag.js) - Google Analytics