git 分支学习

1,分支指针指向的是该分支下的最近一次提交

首先git上现有一个readme.txt文件,存在如下一条主分支线:
                                    master
                                     /
C0 —- C1 —- C2 —- C3
master指向最近的一次提交(commit),即readme.txt的C3版本
readme.txt内容如下:

C0
C1
C2
C3

此时在git bash,输入如下命令,新建一个分支branch1,并切换到该分支下:

git branch branch1 #创建新分支branch1
git checkout branch1 #切换到分支branch1下

还可以用另一种方式创建并切换一个新分支下branch2

git checkout master #切换到master下创建新分支
git checkout -b branch2  #创建并切换到分支branch2下

建好后查看当前分支:

git branch

输出出结果如下:

 branch1
*branch2   
 master

其中branch2前有*标出,代表我们当前所处分支位置为branch2

这时,前面分支图实际上变成了:
                                    master
                                     /
C0 —- C1 —- C2 —- C3——branch1
                                     \
                                    branch2

这时候什么都没干就已经有了三个分支,接下来这几个分支会发挥什么样的作用呢?

现在既然在分支branch2下,就在branch2下用vi 在readme.txt文件中加入一句内容:

in branch2

这时分别用git checkout 命令切换到master和branch1分支下(有时会有提示信息不让切换,如果能切换时)可以查看readme.txt 文件会发现这两个分支下的readme.txt也加上了“in branch2”这句话,为什么在branch2下修改的文件也会影响到master和branch1了呢?

这是因为此时的修改改的是工作区中的文件,即本地文件readme.txt,这份在branch2下的修改并未提交(commit),只要不提交,工作区的变化还不能关联任何一个分支指针,此时master、branch1、branch2三个分支指针实际上还是都指向readme.txt的最近一次提交C3版,工作区中的变化和在哪个分支没有关系。分支指针只指向该分支下的最近一次提交(commit),与提交有关系。

既然提交就可以了,那把在branch2下的修改切换到branch3下进行提交可以吗?不可以,在branch2下发生修改未提交时,在branch3下也能看到,如果在branch3下提交就变成branch3跟踪下变化的版本了。

在branch2下使用下列命令提交修改“in branch2”:

git add readme.txt #将修改记录在暂缓区
git commit -m "change message:in branch2" #将暂缓区的修改全部提交

这时,如果在git checkout 到各个分支下查看就会发现,只有branch2 下的readme.txt里多了一句“in branch2”了,此时分支图已经变成了:

                                    master
                                     /
C0 —- C1 —- C2 —- C3——branch1
                                     \
                                    C4—-branch2
这里的C4就是最新提交的”change message:in branch2” 那一版。

2,冲突是发生在文件同一个位置的修改

参照上面的操作,git checkout 切换到branch1 下,也对readme.txt 进行修改,添加一句“in branch1”,并提交,此时分支图就成了:
                                    master
                                     /
C0 —- C1 —- C2 —- C3 —- C5——branch1
                                     \
                                    C4—-branch2

此时readme.txt在三个分支下有三个版本,
master分支下的C3版readme.txt内容如下:

C0
C1
C2
C3

branch1分支下的C5版readme.txt内容如下:

C0
C1
C2
C3
in branch1

branch2分支下的C4版readme.txt内容如下:

C0
C1
C2
C3
in branch2

  • 假如要将分支branch1合并到主分支master上,可以切换到master分支下输入命令:

     git merge branch1
    

    屏幕输出结果会显示

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

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

    合并后的分支图如下所示:
                                                   master
                                                   /
    C0 —- C1 —- C2 —- C3 —- C5——branch1
                                         \
                                        C4—-branch2

    此时master下的readme.txt内容就会与branch1下的readme.txt一样了。

  • 假如是branch1和branch2 先合并会发生什么?
    先git checkout 到branch2下输入分支合并命令:

    git merge branch1
    

    这时会告诉我们发生了冲突:

    Auto-merging readme.txt
    CONFLICT (content): Merge conflict in readme.txt
    Automatic merge failed; fix conflicts and then commit the result.
    

    为什么会发生冲突?因为C4版的readme.txt和C5版的readme.txt都在文件第5行添加了一句话,而且两句话的内容还不相同,这时用vi 打开readme.txt,会发现readme.txt文件内容已经成了:

    C0
    C1
    C2
    C3
    <<<<<<< HEAD
    in branch2
    \========
    in branch1
    >>>>>>> branch1

    Git用<<<<<<<,=======,>>>>>>>标记区分出不同分支的内容。在当前分支即branch2下对readme.txt直接修改,修改成自己想要的合并效果,如删除<<<<<<< HEAD、========、>>>>>>> branch1 这些行,将in branch2和in branch1 合并修改成一行为:in branch, 然后保存,提交(commit)即可。
    分支图如下所示:
                                         master
                                         /
    C0 —- C1 —- C2 —- C3 —- C5——branch1
                                         \        \
                                        C4—- C6—-branch2

    在branch2下使用如下图所示的命令可以查看分支合并的过程:

    $ git log --graph --pretty=oneline --abbrev-commit
    *   59bc1cb conflict fixed
    |\
    | * 75a857c AND simple
    * | 400b400 & simple
    |/
    * fec145a branch test
    

参考
Git merge 合并分区详解
Git 教程

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值