`
pure
  • 浏览: 354257 次
社区版块
存档分类
最新评论

转:git rebase(也即衍合)

阅读更多
git rebase,顾名思义,就是重新定义(re)起点(base)的作用,即重新定义分支的版本库状态。要搞清楚这个东西,要先看看版本库状态切换的两种情况:

   1. 我们知道,在某个分支上,我们可以通过git reset,实现将当前分支切换到本分支以前的任何一个版本状态,即所谓的“回溯”。即实现了本分支的“后悔药”。也即版本控制系统的初衷。
   2. 还有另一种情况,当我们的项目有多个分支的时候。我们除了在本地开发的时候可能会“回溯”外,也常常会将和自己并行开发的别人的分支修改添加到自 己本地来。这种情况下很常见。作为项目管理员,肯定会不断的合并各个子项目的补丁,并将最新版本推送到公共版本库,而作为开发人员之一,提交自己的补丁之 后,往往需要将自己的工作更新到最新的版本库,也就是说把别的分支的工作包含进来。

举个例子来说吧!假设我们的项目初期只有一个master分支,然后分支上作过两次提交。这个时候系统只有一个master分支,他的分支历史如下:

    master0(初始化后的版本)
    ||
    v
    master1(第一次提交后的版本)
    ||
    v
    master2(第二次提交后的版本)

这个时候,我们可以通过git reset将master分支(工作目录、工作缓存或者是版本库)切换到master1或者master0版本,这就是前面所说的第一种情况。
假设我们这里把master分支通过git reset回溯到了master1状态。那么这个时候系统仍然只有一个master分支,分支的历史如下:

    master0(初始化后的版本)
    ||
    v
    master1(第一次提交后的版本)

然后,我们在这里以master1为起点,创建了另一个分支test。那么对于test分支来说,他的第一个版本test0就和master1是同一个版本,此时项目的分支历史如下:

    master0(初始化后的版本)
    ||
    v
    master1(第一次提交后的版本)===test0(test分支,初始化自master分支master1状态)

这个时候,我们分别对master分支、test分支作两次提交,此时版本库应该成了这个样子:

    master0(初始化后的版本)
    ||
    v
    master1===test0==>test1===>test2
    ||
    v
    master2===>master3

   1. 这个时候,通过第一种git reset的方式,可以将master分支的当前状态(master3)回溯到master分支的master0、master1、master2状态。 也可已将test分支当前状态(test2)回溯到test分支的test0、test1状态,以及test分支的父分支master的master0、 master1状态。
   2. 那么。如果我要让test分支从test0到test2之间所有的改变都添加到master分支来,使得master分支包含test分支的所有修改。这个时候就要用到git rebase了。

首先,我们切换到master分支,然后运行下面的命令,即可实现我们的要求:

1
git rebase test

这个时候,git做了些什么呢?

   1. 先将test分支的代码checkout出来,作为工作目录
   2. 然后将master分支从test分支创建起的所有改变的补丁,依次打上。如果打补丁的过程没问题,rebase就搞定了
   3. 如果打补丁的时候出现了问题,就会提示你处理冲突。处理好了,可以运行git rebase –continue继续直到完成
   4. 如果你不想处理,你还是有两个选择,一个是放弃rebase过程(运行git rebase –abort),另一个是直接用test分支的取代当前分支的(git rebase –skip)。

此外,rebase还能够让你修订以前提交,这个功能日后再说。
分享到:
评论

相关推荐

    pro_git_中文版本(Git使用教程)

    7. **合并与衍合**:`git rebase`是另一种合并策略,它将你的分支修改应用到最新的上游分支上,保持提交历史的线性。 8. **图形化界面**:虽然Git主要是命令行工具,但也有许多图形化客户端如SourceTree、GitHub ...

    Git-2.16.2-64-bit客户端安装程序,适合64位操作系统

    同时,熟悉`git branch`(管理分支)、`git merge`(合并分支)和`git rebase`(衍合分支)等高级功能能帮助提高团队协作效率。 总的来说,Git-2.16.2-64-bit客户端安装程序是64位操作系统开发者必备的工具,它提供...

    Git-2.20.1-64-bit.rar

    此外,还有许多高级命令,如交互式暂存(`git add -i`)、衍合(`git rebase`)和解决合并冲突。 总之,Git-2.20.1-64-bit是开发者在Windows环境中进行高效协作和版本控制的强大工具。通过熟练掌握Git,可以显著...

    git学习-20210224

    - 衍合(rebase):用于平滑分支历史,将分支的变更合并到主分支时保持线性历史。 4. Git的使用场景: - 开源项目:GitHub、GitLab等平台广泛使用Git托管项目。 - 团队协作:通过远程仓库,团队成员可以同步代码...

    progit中文版

    - **更多有趣的衍合**:通过`git rebase -i`进入交互模式,可以进一步调整提交历史。 - **衍合的风险**:如果操作不当,可能会导致历史记录丢失。 #### 七、Git服务器部署 - **协议**:Git支持多种传输协议,...

    progit-zh git官方文档-中文版

    - **更多有趣的衍合**:使用`git rebase -i`命令可以实现衍合。 - **衍合的风险**:衍合会改变提交历史,因此在公共仓库中应谨慎使用。 **3.7 小结** - 本章深入探讨了Git中的分支管理和工作流程,特别是如何利用...

    git-learn:git学习

    - **合并与衍合**:`git merge`用于合并分支,`git rebase`则可以将一个分支的更改应用到另一个分支的历史之上,使历史更简洁。 - **远程操作**:`git push`将本地更改推送到远程仓库,`git pull`则用来拉取远程...

    pro git 完整、完美中文版...

    **3.6 衍合** - **概念**: 当合并时出现冲突,Git无法自动解决时的操作。 - **解决步骤**: - 手动解决冲突。 - 添加解决冲突后的文件: `git add <file>` - 完成合并: `git commit` **3.7 小结** - **总结**: ...

    git_cheat_sheet:Git作弊表:page_facing_up::laptop_computer:

    10. **衍合(rebase)**:`git rebase`将你的提交应用到另一个分支的历史之上,使历史线更清晰。 11. **标签(Tag)**:`git tag`用于给特定的提交打上标签,通常用于标记重要的里程碑。 12. **解决冲突**(Resolving ...

    gitpractice:git。 实践

    `git fetch`可以获取远程仓库的更新但不合并,`git rebase`则可以将本地分支基于最新的远程分支进行衍合,保持提交历史的线性。 此外,Git还支持标签(tag)功能,常用于标记重要版本。例如,`git tag -a v1.0`可以...

    git学习资料大全

    - **衍合(Rebase)**: `git rebase` - 将本地分支的提交移到最新的上游分支之上,保持提交历史的线性。 - **标签(Tag)**: `git tag` - 给特定提交打标签,便于标记重要版本。 **5. Git工作流** - **Git Flow**:...

    Pro Git(中文版).pdf

    - **基本的衍合操作**:通过`git rebase`重新排列提交顺序。 - **有趣的衍合**:通过衍合解决复杂的合并场景。 - **衍合的风险**:可能导致历史记录混乱,需谨慎使用。 **3.7 小结** - 本章详细讲解了如何使用分支...

    progit手册

    **衍合**(Rebase): - **衍合基础**:了解衍合的基本原理和用途。 - **更多有趣的衍合**:探索更复杂的衍合应用场景。 - **衍合的风险**:了解衍合可能带来的问题及其解决方案。 #### 五、Git服务器配置 **协议...

    掘金 - Git 原理详解及实用指南

    3. **衍合(Rebase)**:`git rebase`将你的分支上的提交移动到另一个分支的历史之上,使分支历史更加简洁。 4. ** Cherry-pick**:选择并应用另一个分支的特定提交到当前分支。 以上只是Git庞大功能集的一部分,...

    Gitest:git功能测试

    2. 理解分支管理,如 `git branch`(创建/切换分支)、`git merge`(合并分支)和 `git rebase`(衍合分支)。 3. 掌握解决冲突的方法,因为测试可能模拟了合并时可能出现的冲突情况。 4. 学习如何回退和恢复,使用 ...

    probando_git:Probando Git

    12. **合并与衍合**:除了简单的 `git merge`,还有衍合 (`git rebase`) 作为另一种合并策略,它可以将一个分支的变更应用到另一个分支的历史之上,使得历史线更加清晰。 描述中的 "Probando Git" 暗示这是一个初学...

    ProGit.pdf

    - **更多有趣的衍合**:通过 `git rebase -i` 选择性地应用衍合。 - **衍合的风险**:使用不当可能会导致丢失提交历史。 **3.7 小结** - 分支管理是 Git 中非常重要的一部分,它能够有效支持多人协作,并有助于组织...

Global site tag (gtag.js) - Google Analytics