`
oywl2008
  • 浏览: 1069184 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

git-rebase(认真看,分析很到位)

 
阅读更多

命令格式

我们先来看看git-rebase的命令格式:

git rebase [-i | --interactive] [options] [--onto ]  []
git rebase [-i | --interactive] [options] –onto   –root []
git rebase –continue | –skip | –abort

从命令格式,可以看到git-rebae命令至少需要一个参数,那就是,这个参数可以是一个分支名称,也可以是一次有效的commit。

一个小地方

在你决定学习这个命令,首先有一个小地方你应该注意,那就是如果git-rebase后面加上了参数<branch>,那么 git-rebase会在任何其他动作之前先执行git checkout ,如果没有加参数,那么git-rebase会针对当前分支来做动作。

命令用处

git-rebase命令主要用在从上游分支获取最新commit信息,并有机的将当前分支和上游分支进行合并

这是只言片语的介绍,可能读者并不能了解它的用途和好处。

还是要用例子说话。我们假设主分支为master,在开发过程中生成一个新分支topic。master称为topic的上游分支。

例子开始:

[rocrocket@abc git-study]$ cd rebase
[rocrocket@abc rebase]$ ls
[rocrocket@abc rebase]$ vi roc.c
[rocrocket@abc rebase]$ cat roc.c
int main()
{
printf(“master:001″);
return 0;
}
[rocrocket@abc rebase]$ git init
Initialized empty Git repository in /rocrocket/career/programming/git-study/rebase/.git/
[rocrocket@abc rebase]$ git add .
[rocrocket@abc rebase]$ git commit -m “master:001″
Created initial commit 2d89602: master:001
1 files changed, 5 insertions(+), 0 deletions(-)
create mode 100644 roc.c
[rocrocket@abc rebase]$ git log
commit 2d89602d0c9955824df0d2c023e447f5d98d863a
Author: rocrocket <abc@gmail.com style="word-wrap: break-word;">
Date:   Mon Nov 17 15:26:40 2008 +0800

master:001
[rocrocket@abc rebase]$

到此,我们已经在master分支完成了一个commit。

[rocrocket@abc rebase]$ vi roc.c
[rocrocket@abc rebase]$ git commit -a -m “master:002″
Created commit 41b3d1c: master:002
1 files changed, 1 insertions(+), 0 deletions(-)
[rocrocket@abc rebase]$ cat roc.c
int main()
{
printf(“master:001″);
printf(“master:002″);
return 0;
}
[rocrocket@abc rebase]$ git log
commit 41b3d1cfaae0184bb8e5f27a165d51cc23867413
Author: rocrocket <wupengchong@gmail.com style="word-wrap: break-word;">
Date:   Mon Nov 17 15:28:01 2008 +0800

master:002

commit 2d89602d0c9955824df0d2c023e447f5d98d863a
Author: rocrocket <abc@gmail.com style="word-wrap: break-word;">
Date:   Mon Nov 17 15:26:40 2008 +0800

master:001
[rocrocket@abc rebase]$

到此为止,我们已经在master分支完成了两次commit的提交。

现在的分支结构是这样的,请读者记清楚:

master:001 — master:002   (master)

好,我们继续要做的事情就是建立一个新的分支topic。

[rocrocket@abc rebase]$ git branch
* master
[rocrocket@abc rebase]$ git branch topic
[rocrocket@abc rebase]$ git branch
* master
topic
[rocrocket@abc rebase]$ git checkout topic
Switched to branch “topic”
[rocrocket@abc rebase]$ git branch
master
* topic
[rocrocket@abc rebase]$

好了,我们已经成功建立了topic分支,并且已经转移到了topic分支。

接下来,topic上面的开发情况如下:

[rocrocket@abc rebase]$ vi roc.c
[rocrocket@abc rebase]$ git commit -a -m “topic:001″
Created commit d599b54: topic:001
1 files changed, 1 insertions(+), 0 deletions(-)
[rocrocket@abc rebase]$ vi roc.c
[rocrocket@abc rebase]$ git commit -a -m “topic:002″
Created commit 3f4b17f: topic:002
1 files changed, 1 insertions(+), 0 deletions(-)
[rocrocket@abc rebase]$ cat roc.c
int main()
{
printf(“topic :002″);
printf(“topic :001″);
printf(“master:001″);
printf(“master:002″);
return 0;
}
[rocrocket@abc rebase]$ git log
commit 3f4b17fe3b5d277771770c0515e75f04e783ad14
Author: rocrocket <abc@gmail.com style="word-wrap: break-word;">
Date:   Mon Nov 17 15:49:24 2008 +0800

topic:002

commit d599b54336ad96b8e09ef92e371a09a25e6d0c11
Author: rocrocket <abc@gmail.com style="word-wrap: break-word;">
Date:   Mon Nov 17 15:48:58 2008 +0800

topic:001

commit 41b3d1cfaae0184bb8e5f27a165d51cc23867413
Author: rocrocket <abc@gmail.com style="word-wrap: break-word;">
Date:   Mon Nov 17 15:28:01 2008 +0800

master:002

commit 2d89602d0c9955824df0d2c023e447f5d98d863a
Author: rocrocket <abc@gmail.com style="word-wrap: break-word;">
Date:   Mon Nov 17 15:26:40 2008 +0800

master:001
[rocrocket@abc rebase]$

可知,自从建立并切换到topic分支后,topic又进行了两次commit提交,每次分别加入了一行代码。

此时,分支结构应该是这样的:

    topic:001 --- topic:002 (topic) / master:001 --- master:002   (master)

这个图已经很清晰了,可以看出分支的走向。

接下来,master分支也有自己的进度,如下:

[rocrocket@abc rebase]$ git checkout master
Switched to branch “master”
[rocrocket@abc rebase]$ git branch
* master
topic
[rocrocket@abc rebase]$ vi roc.c
[rocrocket@abc rebase]$ git commit -a -m “master:003″
Created commit 91a7ffc: master:003
1 files changed, 1 insertions(+), 0 deletions(-)
[rocrocket@abc rebase]$ vi roc.c
[rocrocket@abc rebase]$ git commit -a -m “master:004″
Created commit b81fbc3: master:004
1 files changed, 1 insertions(+), 0 deletions(-)
[rocrocket@abc rebase]$ cat roc.c
int main()
{
printf(“master:001″);
printf(“master:002″);
printf(“master:003″);
printf(“master:004″);
return 0;
}
[rocrocket@abc rebase]$ git log
commit b81fbc3be5c7bd1fdef72820c29e2c67590f4b03
Author: rocrocket <wupengchong@gmail.com style="word-wrap: break-word;">
Date:   Mon Nov 17 15:55:23 2008 +0800

master:004

commit 91a7ffc73e6320a86b10849061efd672f47fd5bd
Author: rocrocket <abc@gmail.com style="word-wrap: break-word;">
Date:   Mon Nov 17 15:55:06 2008 +0800

master:003

commit 41b3d1cfaae0184bb8e5f27a165d51cc23867413
Author: rocrocket <abc@gmail.com style="word-wrap: break-word;">
Date:   Mon Nov 17 15:28:01 2008 +0800

master:002

commit 2d89602d0c9955824df0d2c023e447f5d98d863a
Author: rocrocket <abc@gmail.com style="word-wrap: break-word;">
Date:   Mon Nov 17 15:26:40 2008 +0800

master:001
[rocrocket@abc rebase]$

可以看到,master分支也完成了两次commit提交,每次分别添加了一行代码。

截止此时,分支结构为:

   topic:001 --- topic:002 (topic) / master:001 --- master:002 --- master:003 --- master:004 (master)

在这个时候,我们的实验样本已经基本搭建完毕,git-rebase就要派上用场了!
我们假设topic和master是一个项目的两个分支,master当然是主分支,而topic是旁路分支。在软件开发的大部分情况中,旁路分支是要遵 从主分支的。所以说,现在topic分支想将master分支开发的最新代码导入到topic分支中,而且要求此动作不影响master主分支的开发,也 就是说要暗中完成。git-rebase上场了:
[rocrocket@abc rebase]$ git checkout topic
Switched to branch “topic”
[rocrocket@abc rebase]$ git branch
master
* topic
[rocrocket@abc rebase]$ git rebase master
First, rewinding head to replay your work on top of it…
Applying topic:001
error: patch failed: roc.c:1
error: roc.c: patch does not apply
Using index info to reconstruct a base tree…
Falling back to patching base and 3-way merge…
Auto-merged roc.c
Applying topic:002
[rocrocket@abc rebase]$

我们使用了git rebase master来完成我们的需求。如果你心细的话,你会看到它输出了一些error,意思是说“补丁失败”,这个error没有关系,不影响git-rebase的正常工作的。

让我们来看看git-rebase的魔力吧:

[rocrocket@abc rebase]$ git branch
master
* topic
[rocrocket@abc rebase]$ git log
commit 05de9849078541c86cf5182cd8c15fa22bd00f77
Author: rocrocket <abc@gmail.com style="word-wrap: break-word;">
Date:   Mon Nov 17 15:49:24 2008 +0800

topic:002

commit 7e5a744ef9e0740b4a091e9c8baa859b14800b0b
Author: rocrocket <abc@gmail.com style="word-wrap: break-word;">
Date:   Mon Nov 17 15:48:58 2008 +0800

topic:001

commit b81fbc3be5c7bd1fdef72820c29e2c67590f4b03
Author: rocrocket <abc@gmail.com style="word-wrap: break-word;">
Date:   Mon Nov 17 15:55:23 2008 +0800

master:004

commit 91a7ffc73e6320a86b10849061efd672f47fd5bd
Author: rocrocket <abc@gmail.com style="word-wrap: break-word;">
Date:   Mon Nov 17 15:55:06 2008 +0800

master:003

commit 41b3d1cfaae0184bb8e5f27a165d51cc23867413
Author: rocrocket <abc@gmail.com style="word-wrap: break-word;">
Date:   Mon Nov 17 15:28:01 2008 +0800

master:002

commit 2d89602d0c9955824df0d2c023e447f5d98d863a
Author: rocrocket <abc@gmail.com style="word-wrap: break-word;">
Date:   Mon Nov 17 15:26:40 2008 +0800

master:001

[rocrocket@abc rebase]$ cat roc.c
int main()
{
printf(“topic :002″);
printf(“topic :001″);
printf(“master:001″);
printf(“master:002″);
printf(“master:003″);
printf(“master:004″);
return 0;
}
[rocrocket@abc rebase]$

看到了吧!master分支刚才开发的master:003和master:004也已经悄悄的进入了topic分支的日志里了。而在roc.c文件中也已经有了相应的开发代码。

这下,你是不是有一种豁然开朗的感觉?呵呵 来,看一下分支结构图:

master:001 --- master:002 --- master:003 --- master:004---topic:001 --- topic:002 (topic)

master:001 --- master:002 --- master:003 --- master:004(master)

这就是git-rebase的魔力!看出神奇之处了么?
如果忘了,就对比一下。这是执行git-rebase之前的分支结构图:

      topic:001 --- topic:002 (topic) / master:001 --- master:002 --- master:003 --- master:004 (master)

 

 

http://blog.chinaunix.net/uid-27714502-id-3436696.html

 

 

 

 

分享到:
评论

相关推荐

    git-rebase-reword:修改任何git commit不仅要持续

    git-rebase-reword git-rebase-reword是一个简单的git命令,以与修改相同的方式来更改一个提交(最后一个或更旧的提交) 文献资料 它是基于对rebase交互操作的名称来命名的,以补充提交“ reword”。 参见和 -...

    Git-2.33.1-64-bit和Git-2.28.0-64-bit.exe

    Git-2.33.1-64-bit和Git-2.28.0-64-bit.exe

    Git-2.37.3-64-bit_3Git-2.37.3-64-bit_3Git-2.37.3-64-bit_3Git-2.3

    Git-2.37.3-64-bit_3是Git的特定版本,适用于64位操作系统。这个版本号表明它是Git的第2.37.3次更新,通常会包含错误修复、性能提升和新功能。在Windows系统中,Git的安装程序通常以.exe结尾,如Git-2.37.3-64-bit_3...

    Git-2.47.0.2-64

    Git-2.47.0.2-64Git-2.47.0.2-64Git-2.47.0.2-64Git-2.47.0.2-64Git-2.47.0.2-64Git-2.47.0.2-64Git-2.47.0.2-64Git-2.47.0.2-64Git-2.47.0.2-64Git-2.47.0.2-64Git-2.47.0.2-64Git-2.47.0.2-64Git-2.47.0.2-64Git-...

    git-rebase-i-playground:用于测试git rebase -i的不同用例的运动场

    入门克隆此git clone git@github.com:dmuth/git-rebase-i-playground.git : git clone git@github.com:dmuth/git-rebase-i-playground.git cd git-rebase-i-playground ./init.sh站立一组带有一些嵌套分支的Git存储...

    Git-2.28.0-64-bit.exeGit-2.28.0-64-bit.exe

    Git-2.28.0-64-bit.exe Git-2.28.0-64-bit.exe Git-2.28.0-64-bit.exe

    Git-2.30.1-64-bit

    Git-2.30.1-64-bit是Git的特定版本,适用于64位操作系统,它提供了稳定性和性能的保证,确保开发过程的可靠性和效率。这个版本是在Git的官方网站上发布的,因此可以确保其安全性和兼容性。 Git的核心功能包括: 1....

    git-2.41.0-64-bit window版本

    Git-2.41.0-64-bit window版本是针对Windows操作系统的一个特定构建,提供64位架构的支持。这个版本的发布,意味着用户可以在Windows环境下享受到Git的最新功能和性能优化。 Git的核心特性包括: 1. 分布式:每个...

    Git-2.28.0-64-bit git安装包windos64位官方下载

    Git-2.28.0-64-bit.exe 是适用于Windows 64位操作系统的Git官方安装程序,该版本为2.28.0,意味着它包含了最新的功能和性能改进。 **Git基础概念** 1. **版本控制**:Git的核心功能是版本控制,它能跟踪文件和目录...

    Git官方最新版下载 Git-2.18.0-64-bit 64位Windows版本

    Git-2.18.0-64-bit是Git官方发布的一个针对64位Windows系统的更新版本,旨在提供更稳定、高效和功能丰富的代码管理体验。 1. Git的基本概念: - 版本控制:Git的核心功能是版本控制,它记录了代码的每一次修改,...

    Git-2.42.0-64-bit-windows安装版

    Git是目前非常流行的分布式版本控制系统,由Linus Torvalds为Linux内核开发而创建,该资源包含 Git-2.42.0-64-bit-windows安装版,仅供学习,下载后请及时删除 Git是目前非常流行的分布式版本控制系统,由Linus ...

    git-lfs-windows-v3.2.0.exe

    git-lfs-windows-v3.2.0.exe

    Git-2.23.0-64-bit.zip

    这个“Git-2.23.0-64-bit.zip”压缩包显然包含了适用于64位操作系统的Git的2.23.0版本。这个版本是在2019年发布,引入了一些新特性、性能改进和错误修复。 在Git 2.23.0中,一些重要的更新包括: 1. **`git work...

    git-2.45.0-64bit.exe

    "git-2.45.0-64bit.exe" 是Git的特定版本,即2.45.0版本的64位Windows安装程序。这个文件是为Windows用户设计的,确保在64位操作系统上顺利运行Git。 Git的核心特性包括: 1. 分布式:每个开发者的本地仓库都包含...

    git-lfs-windows-v3.4.0.exe

    git-lfs安装包

    Git-2.13.2-64-bit

    Git-2.13.2-64-bit是Git的一个特定版本,适用于64位操作系统。在这个版本中,Git可能包含了各种性能优化、新特性和错误修复。 1. **Git的基本概念**: - **版本控制**:Git的核心功能是版本控制,它记录了代码的每...

    Git 官方原版 Git-2.34.1 32&64-bit 2022-07-12 Latest

    在下载并解压Git-2.37.1的32位和64位安装程序后,为了确保文件的完整性和安全性,你应该使用提供的校验文件(Git-2.37.1-32-bit.exe.txt和Git-2.37.1-64-bit.exe.txt)来验证Hash值。Hash值是一串唯一标识文件内容的...

    Git-2.15.1.2-64-bit.exe

    Git-2.15.1.2-64-bit.exe 是Git的特定版本,适用于64位操作系统。此版本发布于2017年,是当时Git的最新稳定版。在描述中提到,由于官方下载速度较慢,分享者考虑提供免费下载但未能找到实现方式,最终设置了最低2分...

    windows xp Git32 安装包 Git-2.10.0-32-bit

    这个“windows xp Git32 安装包 Git-2.10.0-32-bit”是专门为Windows XP 32位操作系统设计的Git版本,确保了即使在较旧的操作系统上也能顺利进行版本控制操作。 Git自诞生以来,其版本更新频繁,每个新版本通常包含...

    Git-2.42.0.2-64 Window64位安装包 - 最新版

    Git-2.42.0.2-64-bit.exe 是Git的最新64位Windows版安装程序,提供了在Windows操作系统上运行Git的功能。在这款安装包中,你可以找到Git的所有核心组件和工具,包括命令行界面、图形化界面(如Git Bash和Git GUI),...

Global site tag (gtag.js) - Google Analytics