这篇文章将介绍Git分支. 首先, 看看如果创建分支, 这就像是request一个新的项目历史. 接着, 来看看git checkout是如果能被用来选择一个分支的. 最后, 学习用git merge来合并分支.

git branch

我们可以把分支看作是request一个全新的工作目录, 缓存区, 项目历史的方法. 新的commit会在当前分支的历史中被纪录下来.

git branch命令可以用来创建, 查看, 重命名, 删除分支.

用法

git branch

列出你仓储的所有的分支.

git branch <branch>

创建一个新分支. 不会自动switch到这个新分支中.

git branch -d <branch>

删除指定的分支. 这是一个安全的操作. 因为当你的分支没有被merge时, Git会阻止你删除这个分支.

git branch -D <branch>

强行删除指定的分支, 不管他有没有被merge.

git branch -m <branch>

修改你当前分支的名字为<branch>.

讨论

在Git世界里, branch是一个很通常的部分, 你可以在你开发过程中的每一天都使用他. 当你想加一个新特性或者修复一个bug-不管是大是小-你都可以开一个branch来封装你这次修改.  这能保证你不会将不稳定的代码提交到主代码中去, 还可以在merge到主branch前清理你的feature历史.

上图有两个分离的开发线, 一个是litte feature, 一个是longer-running feature.  你不止能同时开发这两个feature branch, 你还可以继续开发你的主分支, 并且保持你的主分支不受feature分支的影响.

小贴示

Git branch的实现比SVN的model更轻量级一些. 他不是把文件从一个目录拷贝到另外一个目录, Git将branch做为一个到commit的引用存储. 因此, branch代表一系列的commit--而不是一个commit的容器.

SVN的merge是基于文件的, Git基于一个抽象的commit.

例子

创建branch

这对于理解branch是指向commit的非常重要. 当你创建一个branch, Git需要做的是只是创建一个指针. 如果一开始你的仓储如下:

然后, 你使用下面的命令创建一个branch:

git branch crazy-experiment

仓储你的历史依然没有发生任何变化. 你所得到的仅仅是一个指向当前commit的指针:

注意你现在只是创建了一个branch, 还没有switch到这个新的branch下面工作. 你需要使用git checkout来选在这个新的branch, 才能切换到这个新的branch下工作.

删除branch

一旦你在一个branch中的工作完成了, 并且已经把他merge到了主branch, 你就可以删除这个branch, 而且不用担心丢失任何历史了:

git branch -d crazy-experiment

如果这个branch没有merge到主分支, 上面的命令会输出如下错误信息:

error: The branch 'crazy-experiment' is not fully merged.
If you are sure you want to delete it, run 'git branch -D crazy-experiment'.

这个保护了你在未merge的时候就删除branch, 从而不小心丢失历史. 如果你真的想删除这个branch, 可以使用-D标记:

git branch -D crazy-experiment

用这个删除branch不会有任何警告.

git checkout

git checkout命令能让你导航到你想要的branch中去. checkout 一个分支, 更新工作目录的文件已匹配这个branch, 告诉git纪录这个branch中的所有的新的commit. 可以将这个看成是选择开发线(line of development)的一种方式.

在之前的文章, 我们讲过了如何使用checkout来查看老的commit. checkout branch是将你的工作目录更新到你选择的branch的状态. 新的修改都会被保存在项目历史中--这不是一个只读的操作.

用法

git checkout <existing-branch>

checkout指定的branch, 这个branch必须是已经存在了的. 这个命令会切换<existing-branch>为你的当前branch, 并更新你的工作目录为这个branch的状态.

git checkout -b <new-branch>

创建&&checkout到<new-branch>. -b标记告诉Git在git checkout <new-branch>之前先运行git branch <new-branch>

git checkout -b <new-branch> <existing-branch>

基于<existing-branch>来创建<new-branch>, 而不是基于当前branch来创建.

讨论

git checkout和git branch是一对好基友. 当你想开发一个新特性的时候, 你通过git branch来创建一个branch, 然后使用git checkout切换到这个branch下. 你可以在一个仓储中在多个branch下工作, 只要使用checkout切换到你想要的branch下就行了.

Detached HEADs

git checkout更新HEAD指向你指定的branch或commit. 当你checkout一个commit, 会转为一个detached HEAD状态.

detached状态意味着你做的所有的状态和项目发展的其它部分都是分离的. 在detached HEAD状态中开发的东西不能被merge.

你应该在一个branch下开发--永远不要在一个detached HEAD状态中开发.

例子

下面的例子演示了一个branch的基本的开发流程. 当你开发一个新特性的时候, 你首先创建一个branch然后switch到这个branch下:

git branch new-feature
git checkout new-feature

然后, 你可以commit新快照了:

# Edit some files
git add <file>
git commit -m "Started work on a new feature"
# Repeat

new-feature里面的纪录、历史都完全是和master隔离的. 当你想回到master的时候可以运行以下命令:

git checkout master

git merge

当前的branch会被更新,merge. 目标branch不会有任何影响. git merge经常是和git checkout一起配套使用的, git branch -d 用来删除目标branch.

用法

git merge <branch>

merge<branch>到当前的branch. Git会自动决定merge的算法.

git merge --on-ff <branch>

merge<branch>到当前的branch, 不同的是会生成一个merge commit(甚至他是一个fast-forward merge).

讨论

一旦你在一个隔离的branch中开发的新特性完成了, 你将把他们merge到你的主branch中去.  基于你仓储的结构, Git有几种算法: fast-forward merge或3-way merge.

fast-forward merge

3-way merge

解决冲突

如果你在merge的时候两个branch同一文件的同一行都有修改, Git无法分辨出那一个版本是你想要的. 当这种情况出现的时候, 你得手动解决冲突然后才能merge.

当你遇到了一个merge冲突的时候, 运行git status来显示你需要处理哪些文件. 例如, 如果两个branch都修改了hello.py的同一处, 你将看到如下的信息:

# On branch master
# Unmerged paths:
# (use "git add/rm ..." as appropriate to mark resolution)
#
# both modified: hello.py
#

现在你可以去hello.py文件里面选择哪个版本是你想要的. 当你准备结束这个merge, 你需要使用git add这些冲突的文件来告诉git冲突已经解决了. 然后, 你可以使用git commit生成一个merge commit.

注意了merge冲突只会出现在3-way merge这种情况. 在fast-forward merge中不可能会有冲突.

例子

fast-forward merge

# Start a new feature
git checkout -b new-feature master # Edit some files
git add <file>
git commit -m "Start a feature" # Edit some files
git add <file>
git commit -m "Finish a feature" # Merge in the new-feature branch
git checkout master
git merge new-feature
git branch -d new-feature

3-way merge

# Start a new feature
git checkout -b new-feature master # Edit some files
git add <file>
git commit -m "Start a feature" # Edit some files
git add <file>
git commit -m "Finish a feature" # Develop the master branch
git checkout master # Edit some files
git add <file>
git commit -m "Make some super-stable changes to master" # Merge in the new-feature branch
git merge new-feature
git branch -d new-feature

  

[译]使用branch的更多相关文章

  1. [译]关于.NET Core1.1的通告

    以下翻译可能会有不准确的地方, 想看原文的童鞋移步到Announcing .NET Core 1.1, 微软的开源真心喜欢, 希望有更多的童鞋关注微软, 关注.NET Core 我们很兴奋地宣布.NE ...

  2. [转]Git教程【译】

    [转]Git教程[译] http://www.cnblogs.com/zhangjing230/archive/2012/05/09/2489745.html 原文出处:http://www.voge ...

  3. git 入门教程之备忘录[译]

    备忘录[译] 创建 | Create 克隆一个已存在的仓库 | Clone an existing repository git clone git@github.com:snowdreams1006 ...

  4. 【译】ModSecurity

    Preface 本篇译ModSecurity 主页的自身介绍. ModSecurity is an open source, cross-platform web application firewa ...

  5. [译]Vulkan教程(31)加载模型

    [译]Vulkan教程(31)加载模型 Loading models 加载模型 Introduction 入门 Your program is now ready to render textured ...

  6. RxJS + Redux + React = Amazing!(译一)

    今天,我将Youtube上的<RxJS + Redux + React = Amazing!>翻译(+机译)了下来,以供国内的同学学习,英文听力好的同学可以直接看原版视频: https:/ ...

  7. Entity Framework 6 Recipes 2nd Edition 译 -> 目录 -持续更新

    因为看了<Entity Framework 6 Recipes 2nd Edition>这本书前面8章的翻译,感谢china_fucan. 从第九章开始,我是边看边译的,没有通读,加之英语 ...

  8. RxJS + Redux + React = Amazing!(译二)

    今天,我将Youtube上的<RxJS + Redux + React = Amazing!>的后半部分翻译(+机译)了下来,以供国内的同学学习,英文听力好的同学可以直接看原版视频: ht ...

  9. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

随机推荐

  1. php 获取当前服务器 系统

    引子: 今天遇到一个问题,当执行文件操作是,不同系统之间的命令是不同的 , 所以需要判断当前系统. $is_win = strtoupper(substr(PHP_OS,0,3))==='WIN'?1 ...

  2. NOIP2011选择客栈[递推]

    题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均 ...

  3. Linux网卡配置及学习linux的注意事项

    一.网卡配置 1.ifconfig网卡信息,配置IP ifconfig eth0 192.168.2.102 2.修改网卡配置(连接不了可能是IP给占用了) 进入编辑界面命令:vi /etc/sysc ...

  4. MBR与GPT

    mrb用于win平台gpt主要用于mac(苹果),MBR分区表与GPT分区表的关系 与支持最大卷为2 TB(Terabytes)并且每个磁盘最多有4个主分区(或3个主分区,1个扩展分区和无限制的逻辑驱 ...

  5. Edit Distance

    Edit Distance Given two words word1 and word2, find the minimum number of steps required to convert  ...

  6. 搭建一套自己实用的.net架构(1)【概述】

    入园很久,一直默默的潜水,近来得空想写点什么. 思前想后,那就把自己平时没事干自己摘抄.引用.瞎写的一些东西写出来.帮助自己巩固一下,顺便请高手们指点一二. 我本人很懒 ,一些代码就是直接复制别人的劳 ...

  7. .net线程池

    线程池的作用线程池,顾名思义,线程对象池.Task和TPL都有用到线程池,所以了解线程池的内幕有助于你写出更好的程序.由于篇幅有限,在这里我只讲解以下核心概念: 线程池的大小 如何调用线程池添加任务 ...

  8. transformClassesWithDexForDebug

    转自:http://blog.sina.com.cn/s/blog_6f3828770102w30b.html

  9. C#-WebForm-WebForm开发基础、如何给控件注册事件?——事件委托写法、http无状态性、三层结构

    (小知识 - xml:可扩展的标记语言 html:超文本标记语言) 一.创建WebForm:新建→网站 此时文件夹中只有一个 config 文件,打开后 二.在项目下右键添加新项 在设计页面中打开 从 ...

  10. 理解 HTTPS 的工作原理

    目标读者:理解HTTP协议,对称和非对称加密,想要了解HTTPS协议的工作原理. 读完本文,你能明白 什么是HTTPS,TLS(SSL),TLS和HTTPS是什么关系? 什么是证书和数字签名,它们是如 ...