git分支的衍合

把一个分支中的修改整合到另一个分支的办法有两种:merge和rebase,

当开发进程分叉到两个不同的分支,又各自提交了更新。

最容易的整合分支的方法是merge, 它会把两个分支最新的快照以及两者的共同祖先进行三方合并,合并的结果是产生一个新的提交对象。

其实还有另外一个选择,可以在一个分支里发生的变化补丁在另一个分支重新打一遍,这种操作叫做衍合,

rebase的作用就是把在一个分支里提交的改变放到另一个分支里重放一遍。

$ git checkout experiment
$ git rebase master

它的原理是回到两个分支最近的共同祖先,根据当前分支(也就是要进行衍合的分支experiment)后续的历次提交对象,生成一系列文件补丁,然后以基线分支(也就是主干分支master)最后一个提交对象为新的出发点,逐个应用之前准备好的补丁文件,最后会生成一个新的合并提交对象,从而改写experiment的提交历史,使它成为master分支的直接下游。

衍合最后生成的快照,其实和普通的三方合并的快照内容一模一样。虽然最后整合得到的结果没有任何区别,

但是衍合能产生一个更为整洁的提交历史。如果观察一个衍合过的分支的历史记录,看起来会更清楚:仿佛所有修改都是在一跟线上先后进行的,尽管实际上他们原本是同时并行发生的。

一般我们使用衍合的目的,是想要得到一个能在远程分支上干净应用的补丁,比如某些项目你不是维护者,但是想帮点忙的话,最好使用衍合:先在自己的一个分支里进行开发,当准备向主项目提交补丁的时候,根据最新的origin/master进行一次衍合操作然后再提交,这样维护者就不需要做任何工作(实际上是把解决分支补丁同最新主干代码之间冲突的责任,转化为由提交补丁的人来解决),维护者只需要根据你提供的仓库地址进行一次快进合并,或者直接采纳你提交的补丁。

======== 衍合的风险=========

一旦分支的提交对象发布到公共仓库,就千万不要对该分支进行衍合操作。

进行衍合的时候,实际上抛弃了一些显存的提交对象而创造了一些类似但不同的新的提交对象,

如果你把原来分支中的提交对象发布出去,并且其他人更新下载后在其基础上开展工作,而稍后你又用git rebase

抛弃这些提交对象,把新的重演后的提交对象发布出去的话,你的合作者就不得不重新合并他们的工作,这样当你再次从他们那里获取内容的时候,提交历史就会变得一团糟。

https://git-scm.com/book/zh/v1/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%9A%84%E8%A1%8D%E5%90%88

/workspace/xxx-xx-cms:the-channel-sort$ git push origin the-channel-sort
To [email protected]:xxx-xxx-cms/xxx-xx-cms.git
 ! [rejected]        the-channel-sort -> the-channel-sort (non-fast-forward)
error: failed to push some refs to ‘[email protected]:xxx-xxx-cms/xxx-xx-cms.git‘
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. ‘git pull‘) before pushing again.  See the
‘Note about fast-forwards‘ section of ‘git push --help‘ for details.
/workspace/xxx-xx-cms:the-channel-sort$ git fetch
remote: Counting objects: 13, done.
remote: Compressing objects: 100% (13/13), done.
remote: Total 13 (delta 9), reused 0 (delta 0)
Unpacking objects: 100% (13/13), done.
From bitbucket.org:xxx-xxx-xxx/xxx-xx-cms

 * [new branch]      production-deployment -> origin/production-deployment
 * [new branch]      staging    -> origin/staging
/workspace/xxx-xx-cms:the-channel-sort$ git rebase origin/the-channel-sort
First, rewinding head to replay your work on top of it...
Applying: 重构代码
/workspace/xxx-xx-cms:the-channel-sort$ gitg
/workspace/xxx-xx-cms:the-channel-sort$ git push
Counting objects: 35, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (18/18), done.
Writing objects: 100% (18/18), 2.29 KiB, done.
Total 18 (delta 14), reused 0 (delta 0)
remote:
remote: View pull request for the-channel-sort => master:
remote:   https://bitbucket.org/xxx-xxx-cms/xxx-xx-cms/pull-requests/21?t=1
remote:
To [email protected]:xxx-xxx-cms/xxx-xx-cms.git
   841dda2..95cdf0d  the-channel-sort -> the-channel-sort
时间: 2024-10-14 00:53:44

git分支的衍合的相关文章

Git详解之三 Git分支

相关文档 — 更多 Git 基础培训.ppt GIT 使用经验.ppt GIT 介绍.pptx GIT 分支管理是一门艺术.docx Eclipse上GIT插件EGIT使用手册.docx git/github学习笔记.doc git 版本控制系统.docx Git开发管理之道.pdf Git内部培训资料.pptx Git权威指南-第5篇-第32章-Gerrit.pdf Gitolite 构建 Git 服务器.pdf 版本控制之道 - 使用Git.pdf Git使用指南(中文).pdf Git-C

Git分支

前面的话 几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着可以从开发主线上分离开来,然后在不影响主线的同时继续工作.在很多版本控制系统中,这是个昂贵的过程,常常需要创建一个源代码目录的完整副本,对大型项目来说会花费很长时间 有人把Git的分支模型称为“必杀技特性”,而正是因为它,将Git从版本控制系统家族里区分出来.Git有何特别之处呢?Git的分支可谓是难以置信的轻量级,它的新建操作几乎可以在瞬间完成,并且在不同分支间切换起来也差不多一样快.和许多其他版本控制系统不同,Git鼓励在工

Git分支Rebase详解

分支的衍合 把一个分支中的修改整合到另一个分支的办法有两种:merge 和 rebase(译注:rebase 的翻译暂定为"衍合",大家知道就可以了.).在本章我们会学习什么是衍合,如何使用衍合,为什么衍合操作如此富有魅力,以及我们应该在什么情况下使用衍合. 基本的衍合操作 请回顾之前有关合并的一节(见图 3-27),你会看到开发进程分叉到两个不同分支,又各自提交了更新. 图 3-27. 最初分叉的提交历史. 之前介绍过,最容易的整合分支的方法是 merge 命令,它会把两个分支最新的

3 Git 分支

几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作.在很多版本控制系统中,这是个昂贵的过程,常常需要创建一个源代码目录的完整副本,对大型项目来说会花费很长时间. 有人把 Git 的分支模型称为“必杀技特性”,而正是因为它,将 Git 从版本控制系统家族里区分出来.Git 有何特别之处呢?Git 的分支可谓是难以置信的轻量级,它的新建操作几乎可以在瞬间完成,并且在不同分支间切换起来也差不多一样快.和许多其他版本控制系统不同,Git

Git分支(远程)

1.远程分支的表示形式:远程仓库名称/分支名,如:origin/master: 2.一次Git克隆会建立你自己的本地分支:master和远程分支:origin/master,它们都指向origin/master分支的最后一次提交: 3.运行命令:git fetch origin来同步远程服务器上的数据到本地,该命令首先找到origin是哪个服务器,从上面获取你尚未拥有的数据,然后把origin/master的指针移动到它最新的位置上: 4.fetch下载好远程分支后,你仍然无法在本地编辑该远程仓

Git详解之Git分支

Git 分支 几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作.在很多版本控制系统中,这是个昂贵的过程,常常需要创建一个源代码目录的完整副本,对大型项目来说会花费很长时间. 有人把 Git 的分支模型称为“必杀技特性”,而正是因为它,将 Git 从版本控制系统家族里区分出来.Git 有何特别之处呢?Git 的分支可谓是难以置信的轻量级,它的新建操作几乎可以在瞬间完成,并且在不同分支间切换起来也差不多一样快.和许多其他版本控制系统

git 分支 合并

Git如何进行分支管理? 1.创建分支      创建分支很简单:git branch <分支名> 2.切换分支      git checkout <分支名>      该语句和上一个语句可以和起来用一个语句表示:git checkout -b <分支名> 3.分支合并      比如,如果要将开发中的分支(develop),合并到稳定分支(master),      首先切换的master分支:git checkout master.      然后执行合并操作:g

GIt分支管理策略

大纲: 1.前言 2.创建分支 3.切换分支 4.合并分支(快速合并) 5.删除分支 6.分支合并冲突 7.合并分支(普通合并) 8.分支管理策略 9.团队多人开发协作 10.总结 注,测试机 CentOS 5.5 x86_64,Git 服务器版本:git version 1.8.2.1,客户端版本:git version 1.9.2.msysgit.0.所有软件请到这里下载:http://msysgit.github.io/. 1.前言 在上一篇博客中我们主要讲解了Git 远程仓库,相信大家对

(转载)介绍一个成功的 Git 分支模型

介绍一个成功的 Git 分支模型 在这篇文章中,我提出一个开发模型.我已经将这个开发模型引入到我所有的项目里(无论在工作还是私人)已经一年有余,并且它被证明是非常成功的.我打算写这些已经很久了,但我一直找不到时间来做,现在终于有时间了.我不会讲任何项目的具体细节,仅是关于分支策略和释放管理相关内容. 它主要体现了Git对我们源代码版本的管理. 为何是Git? 对于Git与其他集中式代码管理工具相比的优缺点的全面讨论,请参见这里.这样的争论总是喋喋不休.作为一个开发者,与现今的其他开发工具相比较,