`

理解分支(转)

 
阅读更多

git在创建分支的时候,实际上是从整个提交历史里的某个起点开始(该起点被记录为分支的祖先,标识分支的起始位置),创建提交历史树的枝干。

由于git每次提交的时候均会记录当次提交的校检和,配合将数据打包存储,记录当前仓库相对于前一版本的变化。所以git的分支,实际上只是一串包含对象校检和(SHA-1)的文件。通过这个校检和,得出分支在提交历史树上的走向。

git里创建删除分支变得非常简单。这一点不像svn那样每创建一个分支就需要整个目录拷贝一份。在git上非常推荐频繁使用分支。

甚至可以一个issue(bug)一个分支,解决完切回主分支合并;没解决完就让分支继续走,主分支继续正常任务。

基本操作

创建和销毁

分支列表:

$: git branch
* master
  prepub
  product

创建分支:

$: git branch prepub

切换已有分支:

$: git checkout prepub
Switched to branch 'prepub'

创建并切换分支:

$: git checkout -b issue1234
Switched to branch 'issue1234'

删除分支:

$: git branch -d issue1234
Deleted branch issue1234 (was b904c07).

合并和冲突

合并前要先切回要并入的分支。

以下表示issue1234分支合并入master分支

$: git checkout master
$: git merge issue1234
Merge made by recursive.
 README |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

冲突的时候,git会报出哪些文件冲突,这时候需要手动解决完冲突方可提交。

$: git merge issue1234
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

通过git status查看冲突文件。

$: git status
index.html: needs merge
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#	unmerged:   index.html
#

打开index.html,git会在冲突位置做上标示。

<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
  please contact us at support@github.com
</div>
>>>>>>> iss53:index.html

解决完冲突,这时候需要手动标识该冲突已经解决,类似svn的resolved

$: git add index.html
$: git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#	modified:   index.html
#

这时候就可以提交了。

$: git commit -m "合并issue1234"
[master e3ece67] 合并issue1234
 1 files changed, 1 insertions(+), 0 deletions(-)

管理多个分支

前面提到,git非常推荐频繁使用分支,在大量分支的情况下,我们需要对分支做好管理(曾经一次上线,开了13个分支= =

通过-v可以看到最后一次提交日志。

$: git branch -v
* master          b904c07 把丘迟的产品搜改动合并一下
  p4popt          8b93380 p4p加上refpid,开发给出来的配置是 P4P_refpid
  prepub          a6cc66b P4P解析参数少一次替换,顺便解决/!失效的问题
  product         301ae4e rankbar图片换成data uri

通过--merged--no-merged来查看分支是否已经合并完成。

$: git branch --merged
* master
  p4popt
$: git branch --no-merged
  prepub
  product

未合并的分支,在删除时会提示分支未合并。

$: git branch -d product
warning: deleting branch 'product' that has been merged to
         'refs/remotes/s/product', but it is not yet merged to HEAD.
Deleted branch product (was 301ae4e).

分支管理流程

一般情况下,分支可以划分为长分支和短分支两种。

长分支

  • 长期任务
    • prepub:上线前合并,根据上线列表,从各个分支中集中到该分支,统一部署提测
    • master:上线后合并,长期保留一个稳定可用的分支应付紧急任务
  • 项目
  • 较难解决的bug
  • 新特性试验田
  • 重构

长分支,经常会落后其他分支一大截,需要养成习惯,适时从其他重要分支进行合并,尤其是项目分支

短分支

  • 临时需求
  • 小bug

分支可视化

git本身的log提供--gragh选项,可以提供字符界面的分支可视化视图。

$: git log --graph --pretty=oneline
| *   50cc7a78b7f2704a2014afa3667f6ac5b5b47374 merging refs/remotes/origin/prepub into HEAD
| |/  
| | * 8f685bd1be3757effe32d6ff37f86bd07dd2b549 又被无情地冲掉了代码
| * | 75a17b4ad610327a9b0e1eecfc6c4bf9cade7359 修改icon
| |/  
| *   146a0990de450c854b1a7d9995e12979fff2d537 merging refs/remotes/origin/prepub into HEAD
| |/  
| | *   93b379680796eb443961bb8c59008f8ae5678be4 Merge branch 'prepub' of search.ued.taobao.net:projects/search into prepub
| | |/  
| | * | 8b93380ccfb9020bf8f8e1e8a4a553601de3c788 p4p加上refpid,开发给出来的配置是 P4P_refpid
| * | | 08201de89834f6fecb195c2b7c3546b5cafccc85 秒杀折扣浮动层样式
| | |/  
| |/|   
| * | 0f4d1df17f79c7aa3ca3d36ab848c10b78029010 修改icon
| * | ae719fc29cc550321f284323db06a294b97c1398 p4p创意优化
| |/  
| * a6d4501e1456589d30ab1a5800b651876629c8ca 修改icon

git还有很多GUI工具,可以提供可视化地分支走势图,比如gitkqgitGitX等等。

远程分支

至今为止,前面所有提到的概念都是直接本地操作的,并不需要任何网络连接。

而git本身是一个分布式代码管理工具(DVCS),所以分支管理上,存在本地分支和远程分支两种概念。

可以简单的理解,远程分支就是别人的本地分支push到服务器上的时候产生的。比如master就是一个最典型的远程分支(默认)。

$: git push origin master

除了master之外,我们还可以随便创建分支,然后push到服务器上去。

$: git push origin prepub
Counting objects: 27, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (15/15), 7.30 KiB, done.
Total 15 (delta 10), reused 0 (delta 0)
To git@search.ued.taobao.net:projects/search.git
   1b95a57..779dbe1  prepub -> prepub

远程分支的标识形式为{remote/branch},比如origin/product

$: git branch -a
  master
  p4popt
* prepub
  product
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/p4popt
  remotes/origin/prepub
  remotes/origin/product

远程分支和本地分支需要区分,所以,在从服务器上拉取特定分支的时候,需要指定本地分支名字。

$: git branch product origin/product
Branch product set up to track remote branch product from origin.

而1.6.2以上版本的git,可以通过--track选项,简化这一过程。这也是为什么直接执行git clone的时候,会自动创建本地master分支的原因。(实际上,pull操作相当于fetch+merge。)

$: git checkout --track origin/product
Branch product set up to track remote branch refs/remotes/origin/product.
Switched to a new branch "product"

远程分支和本地分支是松散的结构,可以把任意远程分支合并到任意本地分支里;同样,也可以把任意本地分支push到任意远程分支上。

# THIS WILL MESS UP YOUR REPO!!
$: git branch
  master
* prepub
  p4popt
  product
$: git pull origin product
$: git push origin master

同步本地远程分支。

$: git fetch origin

删除远程分支。

$: git push origin :p4popt
To git@search.ued.taobao.net:projects/search.git
 - [deleted]         p4popt

References

分享到:
评论

相关推荐

    图像处理分支介绍.docx

    图像分割的目的是将图像中重要的特征、信息提取出来,完成对图像进行进一步的关键信息的识别、分析和理解的基础。图像关键的特征包括关键对象的边缘等。 (5)图像分析。对图像中不同对象进行分割、分类、识别、描述...

    一种基于分支条件的对象状态机自动提取方法

    摘 要:对象行为协议对于辅助其他开发者理解并正确使用对象所提供的外部行为具有十分重要的意义。然而相关文档 却常常缺失或存在不一致,需要通过逆向分析的方法进行恢复。针对这一问题,本文提出了一种基于驱动执行...

    2020年9月Python青少年软件编程二级真题

    2. 掌握程序的单分支结构,理解二分支、多分支结构语句; 3. 理解循环结构语句的功能和写法,能够完成简单循环结构的 程序;理解for循环、while循环、break和continue循环控制 结构语句; 4. 理解range类型的概念,...

    少儿编程Python电子学会二级课件

    本套PPT根据全国青少年软件编程等级考试标准(Python)语言二级标准相关的知识...2.掌握程序的单分支结构,理解二分支、多分支结构语句; 3.理解循环结构语句的功能和写法,能够完成简单循环结构的 程序;理解for循环、

    01 JavaScript基本语法.ppt

    理解变量、数据类型和运算符 JavaScript 中声明变量:var 变量名 "+"可以用于两个数相加,还可以用于连接字符串 parseInt() 和 parseFloat() 函数将字符串分别转换为整型和小数 运算符号分为算术运算符、比较运算符...

    02 函数与事件.ppt

    理解变量、数据类型和运算符 JavaScript 中声明变量:var 变量名 "+"可以用于两个数相加,还可以用于连接字符串 parseInt() 和 parseFloat() 函数将字符串分别转换为整型和小数 运算符号分为算术运算符、比较运算符...

    深入Java虚拟机(原书第2版).pdf【附光盘内容】

     作者以易于理解的方式深入揭示了java虚拟机的内部工作原理,深入理解这些内容,将对读者更快速地编写更高效的程序大有裨益!  本书共分20章,第1-4章解释了java虚拟机的体系结构,包括java栈、堆、方法区、执行...

    自然语言在智能信息检索中的应用

    自然语言处理是人工智能领域的一个分支。它主要研究计算机对输入的自然 语言文本的分析、理解和生成,旨在建立人与计算机之间友好交流的通道,实现 高层次的信息转换,是实现自然语言理解的核心基础。自然语言处理...

    基于Lagrange显式算法的井壁侧钻过程动态破碎规律

    在煤层气多分支水平井裸眼悬空侧钻过程中,理解并掌握井眼连接段在地应力及钻具作用下的破碎及稳定机理对指导钻井过程尤为重要。结合Z1井岩芯样品的三轴抗压实验数据,运用Lagrange显式算法建立钻头-井壁-钻井液相互...

    学习《深入理解程序设计 使用Linux汇编语言》的代码.zip

    - **无高级抽象**:缺乏高级语言中的类、对象、函数库等高级抽象概念,所有编程结构如循环、条件分支等都需要手工实现。 - **依赖特定硬件**:汇编程序直接依赖于特定处理器的指令集、寄存器组织和寻址模式,更换...

    2小时玩转Git:日常使用到根本理解

    为什么人人都要学Git?Git的由来可不简单,最初是由Linux...3)分支管理 4)标签管理 5)解决冲突 6)Git信息存储原理 7)深入理解Git三大分区 ---------------------------------------------------------------

    tcpser:Jim Brain的tcpser程序的分支

    这是Jim Brain的tcpser串行到IP调制解调器仿真程序的又一个分支。 原始源代码可以在这里找到: : 我的更改是基于09年3月11日的rc12归档文件。 我修复了无法连接到真正的telnet服务器的错误。 我还使调制解调器...

    红黑二叉树详细简介以及使用

    1.引言 ...来判断)的大小来判断插入到哪一个分支的,如下图所示: (备注:大写字母代表每个节点相当于每个节点的名字没有实际意义在本文中方便文字说明,数字代表每个节点的 关键字的大小有实际意义)

    代数分支

    操纵数学表达式的工具,受的论文... 理解:将整个推导作为一个步骤呈现的系统无法提供有关如何实现此转换的任何见解。 除了教育优势外,将推导表示为简单步骤的透明链,还可以深入了解可推广性,数值稳定性,物理意义等

    使用Subversion进行版本控制(针对 Subversion 1.4)

    理解地区 Subversion对区域设置的支持 使用外置比较工具 外置 diff 外置 diff3 8. 嵌入Subversion 分层的库设计 版本库层 版本库访问层 客户端层 进入工作拷贝的管理区 条目文件 原始拷贝和属性文件 使用API Apache...

    SVN使用手册中文版快速入门

    分支背后的关键概念 在分支间拷贝修改 拷贝特定的修改 合并背后的关键概念 合并的最佳实践 手工追踪合并 预览合并 合并冲突 关注还是忽视祖先 常见用例 合并一条分支到另一支 取消修改 找回删除的项目 常用分支模式 ...

    rasa_nlu_gq:将自然语言转换为结构化数据(支持中文,自定义了N种模型,支持不同的场景和任务)

    Rasa NLU(自然语言理解)是一个自然语义理解的工具,举个官网的例子如下: “我正在镇中心寻找一家墨西哥餐厅” 并返回结构化数据,例如: intent: search_restaurant entities: - cuisine : Mexican - ...

Global site tag (gtag.js) - Google Analytics