[git]rebase和merge

转自:http://blog.csdn.net/wh_19910525/article/details/7554489

Git merge是用来合并两个分支的。

git merge b    # 将b分支合并到当前分支

git rebase b    # 把 b分支合并到当前分支

这个和svn有点类似,svn将branch合并到trunk上,也是在trunk的workcopy上,选择要合并过来的branch进行合并

-----------------------------------

他们的 原理 如下

假设你现在基于远程分支"origin",创建一个叫"mywork"的分支。[是不是应该理解origin是本地的master分支?不,这就是个远程分支,倒是可以理解mywork为本地master]

$ git checkout -b mywork origin

假设远程分支"origin"已经有了2个提交,如图

现在我们在这个分支做一些修改,然后生成两个提交(commit).

$ vi file.txt

$ git commit

$ vi otherfile.txt

$ git commit

...

但是与此同时,有些人也在"origin"分支上做了一些修改并且做了提交了. 这就意味着"origin"和"mywork"这两个分支各自"前进"了,它们之间"分叉"verbose了。

在这里,你可以用"pull"命令把"origin"分支上的修改拉下来并且和你的修改合并; 结果看起来就像一个新的"合并的提交"(merge commit):

但是,如果你想让"mywork"分支历史看起来像没有经过任何合并一样,你也许可以用 git rebase:

一、Rebase的使用

$ git checkout mywork

$ git rebase origin

这些命令会把你的"mywork"分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到".git/rebase"目录中),然后把"mywork"分支更新 为最新的"origin"分支,最后把保存的这些补丁应用到"mywork"分支上。

当‘mywork‘分支更新之后,它会指向这些新创建的提交(commit),而那些老的提交会被丢弃。 如果运行垃圾收集命令(pruning garbage collection), 这些被丢弃的提交就会删除. (请查看 git gc)

二、解决冲突

在rebase的过程中,也许会出现冲突(conflict). 在这种情况,Git会停止rebase并会让你去解决冲突;在解决完冲突后,用"git-add"命令去更新这些内容的索引(index), 然后,你无需执行 git-commit,只要执行:

$ git rebase --continue

这样git会继续应用(apply)余下的补丁。

在任何时候,你可以用--abort参数来终止rebase的行动,并且"mywork" 分支会回到rebase开始前的状态。

$ git rebase --abort

所有rebase过程中产生conflict,解决完conflict流程为, git本身会有提示:

  • git add filename
  • git rebase --continue

三、git rebase和git merge的区别

现在我们可以看一下用合并(merge)和用rebase所产生的历史的区别:

当我们使用Git log来参看commit时,其commit的顺序也有所不同。

假设C3提交于9:00AM,C5提交于10:00AM,C4提交于11:00AM,C6提交于12:00AM,

  • 对于使用git merge来合并所看到的commit的顺序是:C1,C2,C3,C5,C4, C6, C7
  • 对于使用git rebase来合并所看到的commit的顺序是:C1,C2,C3,C4,C5‘,C6‘,C7

因为C6‘提交只是C6提交的克隆,C5‘提交只是C5提交的克隆,

  • 从用户的角度看使用git rebase来合并后所看到的commit的顺序是:C1,C2,C3,C4,C5,C6,C7
时间: 2024-12-07 08:31:53

[git]rebase和merge的相关文章

git rebase和merge 区别和应用场景

对于两个分支而言,rebase和merge没有区别,但是rebase更干净,因为log hisitory是线性的,但commit不一定按日期先后排,而是local commit总在后面,merge之后history变得比较复杂,但是commit按日期排序,stackoverflow上有个图示很好: http://stackoverflow.com/questions/16666089/whats-the-difference-between-git-merge-and-git-rebase 这篇

git merge 及 git rebase的区别

Git上合并代码有git merge 及 git rebase 两种方式. 前置知识点 Master分支:首先,代码库应该有一个.且仅有一个主分支.所有提供给用户使用的正式版本,都在这个主分支上发布.这个分支被称为Master分支: Develop分支:主分支只用来分布重大版本,日常开发应该在另一条分支上完成.我们把开发用的分支,叫做Develop分支.这个分支可以用来生成代码的最新隔夜版本(nightly).如果想正式对外发布,就在Master分支上,对Develop分支进行"合并"

闲谈 git merge 与 git rebase 的区别

前言 相信大部分使用 Git 的朋友都会遇见相同的疑问,并且也从网上搜索了不少资料.那么,为什么我还要写这篇文章呢?因为我想尝试从自己的角度解释这个问题,如果能给到大家灵光一闪的感悟,便善莫大焉啦.估计点进来的朋友也对 merge 和 rebase 有了一定了解,所以我也就不浪费篇幅再去详细介绍 merge 和 rebase,让我们直入主题吧. merge 与 rebase 的区别 merge 现在假设我们有一个主分支 master 及一个开发分支 deve,仓库历史就像这样:现在如果在 mas

使用Git中的Merge与Rebase与开源项目同步代码

基于开源项目的开发有两种主要工作模式.模式1是在从开源项目中拉出一个分支,在这个分支中开发新feature,完成后合并到upstream中.适用于本身是开源项目的developer.模式2是从开源项目中拉出分支后独立发展,但定期从upstream拉更新(如重要版本升级时).无论是哪种,都会面临本地分支与upstream同步代码的问题.为此,git主要提供了两种方式:一种是merge, 一种是rebase.下面通过例子简单过一下它们的基本流程. 假设开源项目的git地址为git://xxx.org

git rebase 与 git merge

Initial:new_branch     n1--n2                       |master    m1--m2--m3------------------------------------1. Merge $(master) git merge new_branchmaster m1--m2--n1--m3--n2--Merge branch new_branch 2. Rebase$(master) git rebase master new_branch执行过后

git各种命令 & git merge和git rebase的区别

git merge 和 rebase的区别: http://blog.csdn.net/jollyjumper/article/details/24743751 对于两个分支而言,rebase和merge没有区别,但是rebase更干净,因为log hisitory是线性的,但commit不一定按日期先后排,而是local commit总在后面,merge之后history变得比较复杂,但是commit按日期排序,stackoverflow上有个图示很好: http://stackoverflo

细说git merge & git rebase

git merge和git rebase两个都是用来合并两个分支用的,在使用过程中,这两个概念容易混淆. 在此,对这两个git技巧的用法进行详细描述,希望能帮助一些热爱git的朋友. ------------------------------------------------------------------------------------------------------ git merge是用来合并两个分支的. git merge b # 将b分支合并到当前分支 同样git re

关于Git中分支merge和rebase的适用场景及区别

最近刚接触Git,下面对一些基本的使用做一下总结. 本文是转载于CSDN:http://blog.csdn.net/rryqsh/article/details/8230560 几乎所有的版本控制工具都有branch功能,branch主要用于以下几个场景: 1,控制产品OEM. 基本上做产品,不同的客户都会提出多种不同特性需求,最简单的例子就是LOGO和标题完全不一样.但是可能产品自身的大部分功能和模块的代码一样的,这个时候如何管理多个客户定制的功能特性,并且不会干扰其他OEM版本的功能呢? 如

git rebase 和 git merge的区别

原文链接:http://zires.info/tag/git-merge/ git merge是用来合并两个分支的. # 将b分支合并到当前分支git merge b git cherry-pick可以选择某一个分支中的一个或几个commit(s)来进行操作.例如,假设我们有个稳定版本的分支,叫v2.0,另外还有个开发版本的分支v3.0,我们不能直接把两个分支合并,这样会导致稳定版本混乱,但是又想增加一个v3.0中的功能到v2.0中,这里就可以使用cherry-pick了. # 先在v3.0中查