• git 分支branch


    转:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001375840038939c291467cc7c747b1810aab2fb8863508000

    https://www.jianshu.com/p/819354c035a4

    每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向mastermaster才是指向提交的,所以,HEAD指向的就是当前分支。

    一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:

    git-br-initial

    每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长:

    当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:

    git-br-create

    你看,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!

    不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:

    git-br-dev-fd

    假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:

    git-br-ff-merge

    所以Git合并分支也很快!就改改指针,工作区内容也不变!

    合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:

    git-br-rm

    下面开始实战。

    首先,我们创建dev分支,然后切换到dev分支:

    $ git checkout -b dev
    Switched to a new branch 'dev'
    

    git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

    $ git branch dev
    $ git checkout dev
    Switched to branch 'dev'
    

    然后,用git branch命令查看当前分支:

    $ git branch
    * dev
      master
    

    git branch命令会列出所有分支,当前分支前面会标一个*号。

    然后,我们就可以在dev分支上正常提交,比如对readme.txt做个修改,加上一行:

    Creating a new branch is quick.
    

    然后提交:

    $ git add readme.txt 
    $ git commit -m "branch test"
    [dev b17d20e] branch test
     1 file changed, 1 insertion(+)
    

    现在,dev分支的工作完成,我们就可以切换回master分支:

    $ git checkout master
    Switched to branch 'master'
    

    切换回master分支后,再查看一个readme.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变:

    git-br-on-master

    现在,我们把dev分支的工作成果合并到master分支上:

    $ git merge dev
    Updating d46f35e..b17d20e
    Fast-forward
     readme.txt | 1 +
     1 file changed, 1 insertion(+)
    

    git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。

    注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。

    当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并。

    合并完成后,就可以放心地删除dev分支了:

    $ git branch -d dev
    Deleted branch dev (was b17d20e).
    

    删除后,查看branch,就只剩下master分支了:

    $ git branch
    * master
    

    因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

    创建与合并分支

    Reads: 999298 Edit

    版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向mastermaster才是指向提交的,所以,HEAD指向的就是当前分支。

    一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:

    git-br-initial

    每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长:

    当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:

    git-br-create

    你看,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!

    不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:

    git-br-dev-fd

    假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:

    git-br-ff-merge

    所以Git合并分支也很快!就改改指针,工作区内容也不变!

    合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:

    git-br-rm

    真是太神奇了,你看得出来有些提交是通过分支完成的吗?

    下面开始实战。

    首先,我们创建dev分支,然后切换到dev分支:

    $ git checkout -b dev
    Switched to a new branch 'dev'
    

    git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

    $ git branch dev
    $ git checkout dev
    Switched to branch 'dev'
    

    然后,用git branch命令查看当前分支:

    $ git branch
    * dev
      master
    

    git branch命令会列出所有分支,当前分支前面会标一个*号。

    然后,我们就可以在dev分支上正常提交,比如对readme.txt做个修改,加上一行:

    Creating a new branch is quick.
    

    然后提交:

    $ git add readme.txt 
    $ git commit -m "branch test"
    [dev b17d20e] branch test
     1 file changed, 1 insertion(+)
    

    现在,dev分支的工作完成,我们就可以切换回master分支:

    $ git checkout master
    Switched to branch 'master'
    

    切换回master分支后,再查看一个readme.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变:

    git-br-on-master

    现在,我们把dev分支的工作成果合并到master分支上:

    $ git merge dev
    Updating d46f35e..b17d20e
    Fast-forward
     readme.txt | 1 +
     1 file changed, 1 insertion(+)
    

    git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。

    注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。

    当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并。

    合并完成后,就可以放心地删除dev分支了:

    $ git branch -d dev
    Deleted branch dev (was b17d20e).
    

    删除后,查看branch,就只剩下master分支了:

    $ git branch
    * master
    

    因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

    小结

    Git鼓励大量使用分支:

    查看分支:git branch

    创建分支:git branch <name>

    切换分支:git checkout <name>

    创建+切换分支:git checkout -b <name>

    合并某分支到当前分支:git merge <name>

    删除分支:git branch -d <name>

    什么情况下需要用到git创建分支

    1. 在本地使用分支。本来在master分支上开发的,如果我没实现一个小的功能,就进行一次commit的话?那么分支上不就有很多的commit的吗?推送上去,您会看见服务器上有很多不必要的提交,这样子就不简洁了,版本历史也不清楚.但是使用分支,完成一个完整的功能,然后主分支使用 git merge --squash branchName 合并分支,做一个整的提交推送,那么服务器上的历史只有这一个commit的了,这不就简洁了吗?
    2. 在服务端,我有多个小组,每个小组是一个分支,因为master是保持最稳定代码的版本,所以我要审查过每个分支上的代码再合并,而不是立刻将他们分支上的合并到master上面,一来保证了代码的质量,而来在小组方面可以更快发现bug,然后通知修改。比如稳定的版本放在master 供大家用 在开发的版本放在test 等test完成后 合并到master test上继续下一步的版本开发

    分支有如下几条:

    1. Master 主分支
    2. Develop 分支
    3. Feature 功能分支
    4. Release 预发布分支
    5. Hotfix(或者Fixbug) 分支

    以上各分支之间的逻辑关系见下图;

     

    其中对于 Feature 功能分支有;

    • 从哪个分支分离开来:develop
    • 必须要合并到哪个分支上:develop
    • 分支的命名规范:除了 master,develop,release-,或者 hotfix- 以外的名字都可以比如可以用 feature-*的方式命名。

    其中对于 Release 预发布分支有;

    • 从哪个分支分离开来: develop
    • 必须要合并到哪个分支上:develop 与 master
    • 分支的命名规范: release-*

    其中对于 Hotfix(或者 Fixbug) 分支有;

    • 从哪个分支分离开来:master
    • 必须要合并到哪个分支上:develop 与 master
    • 分支的命名规范:hotfix-* 或者 fixbug-*

    主分支

    Master 主分支

    首先,代码库应该有一个、且仅有一个主分支。所有提供给用户使用的正式版本,都在这个主分支上发布。Git 主分支的名字,默认叫做 Master。它是自动建立的,版本库初始化以后,默认就是在主分支在进行开发。

     

    Develop 分支

    主分支只用来分布重大版本,日常开发应该在另一条分支上完成。我们把开发用的分支,叫做 Develop。

     

    创建分支

    git branch develop              #只创建分支
    git checkout develop  #创建并切换到 develop 分支
    

    合并分支

    git checkout master         #切换到主分支
    git merge --no-ff develop   #把 develop 合并到 master 分支,no-ff 选项的作用是保留原分支记录
    git branch -d develop       #删除 develop 分支       
    

    这里稍微解释一下,上一条命令的--no-ff参数是什么意思。默认情况下,Git执行"快进式合并"(fast-farward merge),会直接将Master分支指向Develop分支。

     
     
     

    次分支

    除了 master 与 develop 这两个主分支,在开发时还可以创建一些次分支,目的是让团队不同的成员之间可以平行开发,更容易跟踪功能,准备为生产的发行版,快速修复生产上的问题等等。这些分支生命周期有限,可以在用完以后删掉他们。

    Feature 功能分支

    Feature(功能) 分支,有时候也叫 Topic 分支。在这种分支上去开发新的功能。当开发功能的时候,这个功能属于哪个目标发行还不知道。功能如果一直在开发,对应的这个功能分支就可以一直存在,不过到最后还是要合并到 develop 分支上,或者如果不想要开发的这个功能了,可以直接扔掉它。

     

    功能名字的命名已经在上文中有提到。
    创建一个功能分支:

    git checkout -b feature-x develop
    

    开发完成后,将功能分支合并到develop分支:

    git checkout develop        
    git merge --no-ff feature-x    
    

    删除feature分支:
    git branch -d feature-x## Release 预发布分支

    它是指发布正式版本之前(即合并到Master分支之前),我们可能需要有一个预发布的版本进行测试。预发布分支是从Develop分支上面分出来的,预发布结束以后,必须合并进Develop和Master分支。它的命名,可以采用release-*的形式。
    创建一个预发布分支:

    git checkout -b release-1.2 develop  
    

    确认没有问题后,合并到master分支:

    git checkout master          
    git merge --no-ff release-1.2    
    #对合并生成的新节点,做一个标签    
    git tag -a 1.2    
    

    再合并到develop分支:

    git checkout develop   
    git merge --no-ff release-1.2    
    

    最后,删除预发布分支:

    git branch -d release-1.2     
    

    Fixbug 修补bug分支

    最后一种是修补bug分支。软件正式发布以后,难免会出现bug。这时就需要创建一个分支,进行bug修补。 修补bug分支是从Master分支上面分出来的。修补结束以后,再合并进Master和Develop分支。它的命名,可以采用fixbug-*的形式。
    创建一个修补bug分支:

    git checkout -b fixbug-0.1 master    
    

    修补结束后,合并到master分支:

    git checkout master    
    git merge --no-ff fixbug-0.1   
    git tag -a 0.1.1    
    

    再合并到develop分支:

    git checkout develop     
    git merge --no-ff fixbug-0.1    
    

    最后,删除"修补bug分支":

    git branch -d fixbug-0.1
    
    举一个例子,假设我是一名PingHackers网站的开发者,已经把源仓库fork了,并且clone到了本地。现在要开发PingHackers网站的“讨论”功能。我在本地仓库中可以这样做:

    step 1: 切换到develop分支
    >>> git checkout develop
    step 2: 分出一个功能性分支
    >>> git checkout -b feature-discuss
    step 3: 在功能性分支上进行开发工作,多次commit,测试以后...
    step 4: 把做好的功能合并到develop中
    >>> git checkout develop
    # 回到develop分支
    >>> git merge --no-ff feature-discuss
    # 把做好的功能合并到develop中
    >>> git branch -d feature-discuss
    # 删除功能性分支
    >>> git push origin develop
    # 把develop提交到自己的远程仓库中

    这样,就完成一次功能的开发和提交。

    常见任务

    增加新功能

    (dev)$: git checkout -b feature/xxx            # 从dev建立特性分支
    (feature/xxx)$: blabla                         # 开发
    (feature/xxx)$: git add xxx
    (feature/xxx)$: git commit -m 'commit comment'
    (dev)$: git merge feature/xxx --no-ff          # 把特性分支合并到dev
    复制代码

    修复紧急bug

    (master)$: git checkout -b hotfix/xxx         # 从master建立hotfix分支
    (hotfix/xxx)$: blabla                         # 开发
    (hotfix/xxx)$: git add xxx
    (hotfix/xxx)$: git commit -m 'commit comment'
    (master)$: git merge hotfix/xxx --no-ff       # 把hotfix分支合并到master,并上线到生产环境
    (dev)$: git merge hotfix/xxx --no-ff          # 把hotfix分支合并到dev,同步代码
    复制代码

    测试环境代码

    (release)$: git merge dev --no-ff             # 把dev分支合并到release,然后在测试环境拉取并测试
    复制代码

    生产环境上线

    (master)$: git merge testing --no-ff          # 把testing测试好的代码合并到master,运维人员操作
    (master)$: git tag -a v0.1 -m '部署包版本名'  #给版本命名,打Tag
    复制代码
    添加版本

    创建一个release分支

    Release分支是从develop分支创建的。例如,当前产品的发行版本号为1.1.5,同事我们有一个大的版本即将发行。develop 分支已经为下次发行做好了准备,我们得决定下一个版本是1.2(而不是1.1.6或者2.0)。所以我们将Release分支分离出来,给一个能够反映新版本号的分支名。

    1
    2
    3
    4
    5
    6
    7
    $ git checkout -b release-1.2 develop
    Switched to a new branch "release-1.2"
    $ ./bump-version.sh 1.2
    Files modified suc<a href="http://www.wuseyun.com/htmldata/tag/11/CES.html">CES</a>sfully, version bumped to 1.2.
    $ git commit -a -m "Bumped version number to 1.2"
    [release-1.2 74d9424] Bumped version number to 1.2
    1 files changed, 1 insertions(+), 1 deletions(-)

    创建新分支以后,切换到该分支,添加版本号。这里,bump-version.sh 是一个虚构的shell脚本,它可以复制一些文件来反映新的版本(这当然可以手动改变目的就是修改一些文件)。然后版本号被提交。

    git checkout -b -newbranch [<start_point>]
    这样用可以创建新的分支并切换到新分支上去,b代表branch的意思,newbranch 是新分支的名称,如果没有指定提交点(start_point),默认从HEAD指向的提交创建分支。

    git branch <branchname> [<start_point>]
    创建新的分支,但是不会切换到新建的分支上,如果没有指定start_point,默认从HEAD指向的提交创建分支。


    作者:程咸菜
    链接:https://www.jianshu.com/p/7c30a4ff061c
  • 相关阅读:
    【jQuery】用jQuery给文本框添加只读属性【readOnly】
    解决embed标签显示在div上层【转藏】
    width:100% 和 max-width:100%; 有区别吗【转藏】
    一位资深程序员的独白
    jQuery 取值、赋值的基本方法【转藏】
    js判断手机端操作系统(Andorid/IOS)
    PhpStrom 和 wamp 配置 xdebug
    php 中 ?? 和 empty 的 区别
    phpSpreadSheet 中 使用的 一些坑
    html td 限制 高度 和 宽度
  • 原文地址:https://www.cnblogs.com/twoheads/p/9504335.html
Copyright © 2020-2023  润新知