学习 Git Rebase

有问题为什么不问问神奇的 man 呢?

rebase 也算是我比较常用的一个指令了,但是很长时间以来,对这个指令的认识还是不够深刻,于是就找了个时间认真地读了一下 git rebase 的文档。这份文档不需要在网络上查找,在自己的电脑上直接使用 man git-rebase 就可以查看了。在这份文档中,被提到的几个重要的 rebase 参数就是 newbaseupstreambranch。除此之外,-i 也是一个能够极大的提升使用体验的选项,允许我们交互式的选取需要操作的提交。

git rebase [-i | --interactive] [<options>] [--exec <cmd>] [--onto <newbase>]
        [<upstream> [<branch>]]

三个参数

在执行 git rebase 的之前,如果我们指定了 branch 这个参数,那么 git 会在开始 rebase 操作之前签出到 branch

接着,git 会把所有在当前分支但不在 upstream 分支的提交保存到一个临时区域。如果想要在 rebase 开始之前了解哪些提交会被移到临时区域,可以使用 git log <upstream>..<branch> 查看。

然后,如果我们设置了 newbase,那么 git 会把当前分支重置到 newbase ,否则,就重置到 upstream ,这里的效果就相当于 git reset <newbase>

接下来,git 会将之前存放到临时区域内的提交逐个按顺序地重新作用到当前分支上。

根据上面介绍的执行过程,我们可以总结出以下几个知识点:

  1. branch 分支或者执行 git rebase 的当前分支,最终会被移动到 upstream 或者 newbase 分支上
  2. branch 与 upstream 构成了一个选择器,可以通过这两个参数来把 branch..upstream 之间的提交移动跟随 branch 移动到新的地方

这样看来,rebase 做的事其实是使用 upstream 以及 branch 选取一段提交,然后在把这段提交从原先的分支上剪下来,然后嫁接到 upstream 或者 newbase 上去。

接着结合一个简单的例子来熟悉一下 rebase 中这三个参数的作用,例如,我们有这样一个仓库:

  A---B<start>---C---D<feature><HEAD>
 /
E---F---G<master>

我们目前位于 feature 分支,现在我们需要使用 rebase 将 feature 分支上的 C、D 两个提交移植到 master 上面。因为最终的目的地是 master 分支,所以可以确定 newbase 参数的值是 master;为了选中 C、D 两个提交,我们可以使用 feature 分支作为 branch 参数,使用 start 分支作为 upstream 参数。最终,我们需要执行的指令就是:

git rebase --onto master start feature

因为,我们目前就在 feature 上面,所以 branch 参数可以省略掉:

git rebase --onto master start

最终我们得到的结果如下所示:

          C'---D'<feature><HEAD>
         /
E---F---G
   A---B<start>

交互式操作后可能会遇到的问题

在交互式 rebase 中,我们可以选取需要操作的提交,但这种可选择的操作有时候可能会给 git 新手造成一种令人慌乱的局面。例如,我们有这样一个仓库:

  A---B---C---D<feature><HEAD>
 /
D---E---F<master>

然后,我们执行下面的命令:

git rebase -i master

假设只有 B、C 被选取了,那么这个仓库接下来就会变成:

          B'---C'<feature>
         /
D---E---F<master>

现在,你可能已经发现了一个问题,A 与 D 这两个提交“消失”了,这时候先不要慌,可以先想想办法研究出时光机器回到过去阻止自己。当然,这只是一个玩笑。这两个提交并没有真正的消失,他们只是没有被某个分支引用而已。要让它们重新回到分支树上,我们需要先查询这两个提交的 hash :

git reflog feature

reflog 可以帮助我们查看指定分支的操作历史,包括 commit、rebase 等操作。

查询到 hash 之后,只要在这些被历史遗忘的 commit 上创建新的分支,我们就可以在 git log 中重新见到他们了。

原文地址:https://www.cnblogs.com/JacZhu/p/12009953.html

时间: 2024-08-30 15:12:43

学习 Git Rebase的相关文章

使用git Rebase让历史变得清晰

当多人协作开发一个分支时,历史记录通常如下方左图所示,比较凌乱.如果希望能像右图那样呈线性提交,就需要学习git rebase的用法. “Merge branch”提交的产生 我们的工作流程是:修改代码→提交到本地仓库→拉取远程改动→推送.正是在git pull这一步产生的Merge branch提交.事实上,git pull等效于get fetch origin和get merge origin/master这两条命令,前者是拉取远程仓库到本地临时库,后者是将临时库中的改动合并到本地分支中.

git 学习(git fetch/ git pull/ git rebase/ git cherry-pick的区别)

使用git做开发管理: 1. Git clone  将远程代码克隆到本地: 2. Git branch  查看本地branch (git clone 时会创建 master) 3. git branch -a  查看本地和远程分支:(远程分支包括 remotes/origin/master 远程master分支) 4. Git remote -v 查看远程库对应的简短名称 (origin  ...) 5. Git checkout -b bug origin/master 创建本地开发分支 6.

深入理解学习Git工作流

一.译序 工作流其实不是一个初级主题,背后的本质问题其实是有效的项目流程管理和高效的开发协同约定,不仅是Git或SVN等VCS或SCM工具的使用. 这篇指南以大家在SVN中已经广为熟悉使用的集中式工作流作为起点,循序渐进地演进到其它高效的分布式工作流,还介绍了如何配合使用便利的Pull Request功能,体系地讲解了各种工作流的应用. 行文中实践原则和操作示例并重,对于Git的资深玩家可以梳理思考提升,而新接触的同学,也可以跟着step-by-step操作来操练学习并在实际工作中上手使用. 关

深入学习 Git 工作流

原文  https://github.com/xirong/my-git/blob/master/git-workflow-tutorial.md 个人在学习git工作流的过程中,从原有的 SVN 模式很难完全理解git的协作模式,直到有一天我看到了下面的文章,好多遗留在心中的困惑迎刃而解: 我们以使用SVN的工作流来使用git有什么不妥? git 方便的branch在哪里,团队多人如何协作?冲突了怎么办?如何进行发布控制? 经典的master-发布.develop-主开发.hotfix-不过修

深入理解学习Git常用工作流

个人在学习git工作流的过程中,从原有的 SVN 模式很难完全理解git的协作模式,直到有一天我看到了下面的文章,好多遗留在心中的困惑迎刃而解,于是我将这部分资料进行整理放到了github上,欢迎star查看最新更新内容, https://github.com/xirong/my-git/blob/master/git-workflow-tutorial.md - 我们以使用SVN的工作流来使用git有什么不妥? - git 方便的branch在哪里,团队多人如何协作?冲突了怎么办?如何进行发布

[转]深入理解学习GIT工作流

深入理解学习Git工作流 字数13437 阅读2761 评论3 喜欢70 个人在学习git工作流的过程中,从原有的 SVN 模式很难完全理解git的协作模式,直到有一天我看到了下面的文章,好多遗留在心中的困惑迎刃而解,于是我将这部分资料进行整理放到了github上,欢迎star查看最新更新内容, https://github.com/xirong/my-git/blob/master/git-workflow-tutorial.md 我们以使用SVN的工作流来使用git有什么不妥? git 方便

Git专题--系统的学习Git之一

本文为整理自:伯乐在线 1.Git详解之一:Git起步 2.Git详解之二:Git基础 3.Git详解之三:Git分支 4.Git详解之四:服务器上的Git 5.Git详解之五:分布式Git 6.Git详解之六:Git工具 7.Git详解之七:自定义Git 8.Git详解之八:Git与其他系统 9.Git详解之八:Git与其他系统 Git详解之一:Git起步 起步 本章介绍开始使用 Git 前的相关知识.我们会先了解一些版本控制工具的历史背景,然后试着让 Git 在你的系统上跑起来,直到最后配置

Git专题--系统的学习Git之二

本文为整理自:伯乐在线 1.Git详解之一:Git起步 2.Git详解之二:Git基础 3.Git详解之三:Git分支 4.Git详解之四:服务器上的Git 5.Git详解之五:分布式Git 6.Git详解之六:Git工具 7.Git详解之七:自定义Git 8.Git详解之八:Git与其他系统 9.Git详解之九:Git内部原理 Git详解之四:服务器上的Git 服务器上的 Git 到目前为止,你应该已经学会了使用 Git 来完成日常工作.然而,如果想与他人合作,还需要一个远程的 Git 仓库.

Git专题--系统的学习Git之三

本文为整理自:伯乐在线 1.Git详解之一:Git起步 2.Git详解之二:Git基础 3.Git详解之三:Git分支 4.Git详解之四:服务器上的Git 5.Git详解之五:分布式Git 6.Git详解之六:Git工具 7.Git详解之七:自定义Git 8.Git详解之八:Git与其他系统 9.Git详解之九:Git内部原理 Git详解之六:Git工具 Git 工具 现在,你已经学习了管理或者维护 Git 仓库,实现代码控制所需的大多数日常命令和工作流程.你已经完成了跟踪和提交文件的基本任务