git-branch

Git 的分支模型可以称为它的”必杀技特性“,Git 鼓励在工作中要频繁的使用分支与合并,
Git 创建新分支几乎可以在瞬间完成,在不同的分支之间切换的速度也是非常快。

我们在进行提交操作时,Git 会保存一个提交对象(commit object),该提交对象包含我们在之前配置的user.name、user.email、
提交说明和指向它的父对象的指针。第一次提交对象没有父对象,普通提交对象有一个父对象,由多个分支合并产生的提交对象有多个父对象。

master 分支

Git 的默认分支名字是master。Git的master 并不是一个特殊的分支,它跟其他的分支并没有什么区别,
只是master 分支是git init 命令默认创建的分支名称。

都目前为止,我们一直在master分支上提交,此时master分支指向最后那个提交对象。

创建分支

创建名字为dev 的分支。

1
$ git branch dev

会在当前所在的提交对象上创建一个指针。

在Git 中HEAD 指针指向当前所在的分支,通过上图可以看到HEAD 指向了master 分支。

切换分支

通过git branch 仅仅是创建了dev 分支,并不会自动切换到分支中,
要切换到一个已存在的分支,可以使用git checkout 命令。

1
$ git checkout dev

这个时候HEAD 指针就指向dev了。

查看分支 git branch 命令后面不带任何参数,前面带*号的分支是当前所在分支

1
2
3
$ git branch
* dev
master

可以看到当前所在的是 dev 分支。

现在想要切回到master 分支,可以使用git checkout mastergit checkout -

1
2
$ git checkout -
Switched to branch 'master'

创建并切换分支

有时候我们想要创建一个分支并立即切换到新的分支上工作,Git 也提供了一个简单的方式实现创建并切换到某个分支,
使用 git checkout -b branch_name 命令(合并了上面两个命令)。

1
2
$ git checkout -b test
Switched to a new branch 'test'

合并分支

大多数情况下,在一个项目中的master 分支一般用于发布生产环境,dev 分支属于开发分支,
比如我们现在在dev 分支开发了一个小功能,并测试完毕。那么我们需要将dev分支合并到master分支,然后将新功能发布到生产环境。
开发过程如下:
我们在dev 分支下新添加一个 world.txt 文件,作为新功能的演示。

1
2
$ vim world.txt
hi,我是新功能

  • 添加到暂存区

    1
    $ git add world.txt
  • 提交

    1
    2
    3
    4
    $ git commit -m "add world.txt" 
    [dev ef8a2b0] add world.txt
    1 file changed, 1 insertion(+)
    create mode 100644 world.txt

提交完毕,此时我们的dev 分支向前移动(指针右移)了,但是master 分支却没有,
它仍然指向执行git checkout dev 时所指的对象,如下图所示:

新功能开发并测试完毕,需要将dev 分支内容合并的到master 分支,首先要切换到master分支,
然后使用git merge dev 将dev分支合并到master分支。

  • 切换到master 分支
    如果dev 分支的工作目录和暂存区还有未提交的内容,它可能会和你即将切换到到master ß分支产生冲突从而阻止Git 切换到该分支,
    最好的办法是在你切换分支之前,保证当前分支是一个干净到状态,当然Git 也提供了一些方法绕过这个问题,我们在后面会介绍。
1
$ git checkout master

这个命令做了两件事,第一个是HEAD 指回了master 分支,第二个是将工作目录恢复成master 分支所指向的内容。
也就是说,在切换到一个分支时,我们的工作目录的文件会改变成该分支的内容。

  • 执行合并操作
    1
    2
    3
    4
    5
    6
    $ git merge dev
    Updating 69da26e..ef8a2b0
    Fast-forward
    world.txt | 1 +
    1 file changed, 1 insertion(+)
    create mode 100644 world.txt

你可能已经注意到了Fast-forward 快进这个词,由于master 分支所指向的提交是dev 分支的直接父对象,
Git 只是简单的将指针向前移动,所以合并速度非常快。当然,也不是每次合并都能Fast-forward,我们后面会介绍其他方式到合并。

  • 查看master 分支上是否有world.txt 文件
    1
    2
    $ ls
    hello.txt world.txt

至此,合并操作完成。合并过程中,如果有Git处理不了的冲突,还需要开发人员手动合并,决定冲突的代码需要保留的部分。

删除分支

合并完成后,就可以放心的删除dev 分支了。注意删除分支的时候,不能删除当前所在的分支,需要先切换到别的分支上去。

1
$ git branch -d dev

git branch -D branch_name 强制删除

删除dev 分支后,查看分支

1
2
$ git branch
* master

此时,只剩下master 分支了。
因为在Git 中创建、合并和删除分支都非常快,所以Git 鼓励我们使用分支完成某个任务,合并后再删除分支,
这和直接在master 分支上工作效果上一样的,但过程更安全。

本章小结:
创建分支 git branch branch_name
切换分支 git checkout branch_name
查看分支 git branch
创建并切换分支 git checkout -b branch_name
合并某分支到当前分支 git merge branch_name
删除分支 git branch -d branch_namegit branch -D branch_name 强制删除

坚持原创技术分享,您的支持将鼓励我继续创作!