前言
该文章只是记录了一些自己的见解,可能并不准确,只是为了学习时的一些记录,不喜勿喷,谢谢
该文章,只要记录一些关于分支的使用笔记
1. 什么是分支
当我们每次commit之后,就会生成一个提交节点,而多个提交节点组成的链路,就叫做一个分支。每一个提交节点上都记录上了父节点唯一id,通过链表的形式从最后一个节点一直向前找,当我们创建好一个仓库后,就会给我们创建一个master分支,而master分支跟普通分支没有什么区别,只是在生产环境中,通常都作为线上分支。而我们的master作为一个指针,指向最后一个提交的提交节点,通过父id的方式,可以一直回溯到第一个提交节点。
在当前分支中,有一个特殊的指针,叫做 HEAD,该指针通常指向当前分支的最后一个提交节点,可以说HEAD指向当前分支,也可以说HEAD指向master,因为如果是通过正常版本回退命令,或者新提交记录等方式,HEAD和master指针都会同步移动,两者指向同一点,但是如果使用checkout commit_id 的方式,HEAD就会执行一个游离的节点,此时 master和HEAD就不再是同一个节点了。
假设现在在master上有多个提交节点,master执行最后一次提交,现在创建了新的分支dev,则此时,只是新创建了一个指针,指向了当前的节点,几乎没有任何成本,所以效率非常高。
下面我们来看看,分支的一些列操作
2. 如何查看分支列表,以及当前所处分支
使用 git branch 命令
使用 git branch 命令可以看到当前git中存在的所有分支,而且,可以通过 * 所处的分支行看到当前所处哪个分支。如下图
[root@huangzb mygit]# git branch
* master
[root@huangzb mygit]#
由上图可知,当前git中只有一个分支,就是 master,而且 master前面还有一个 * 号,标识着当前所处分支为 master分支。
3. 如何创建新分支
使用命令 git branch 分支命 的方式来创建新分支
master是在我们创建的时候,git给我们创建的一个分支,我们现在来创建一个新的分支dev,来看看如何操作。如下图:
[root@huangzb mygit]# git branch dev
[root@huangzb mygit]# git branch
dev
* master
[root@huangzb mygit]#
从上图中,可以看到,通过 git branch 分支名 的方式创建了一个 新的 dev分支,然后通过 git branch后可以清晰的看到新添加的dev分支,且更加分明的看到当前所处的分支为 master
4. 如何切换分支
使用命令 git checkout 分支名 来进行切换分支
可以使用命令 git checkout 分支名来进行分支的切换,操作如下图:
[root@huangzb mygit]# git branch
dev
* master
[root@huangzb mygit]#
[root@huangzb mygit]# git checkout dev
Switched to branch 'dev'
[root@huangzb mygit]# git branch
* dev
master
[root@huangzb mygit]#
从上图可以看出,我们通过 git checkout dev 命令,将分支切换到了 dev分支
注意,这里要注意点,虽然这里有多个分支,但是如果在其余分支修改了文件,且没有提交的话,那么修改的文件在所有分支皆可见
什么意思呢,假设现在有两个分支,master和dev,dev实在master最新的节点中创建的,所以两者从数据上来说是一致的,那么现在在dev分支中修改一个文件,没有提交,那么在我们的认知里,就算没有提交,但也是在dev分支修改的,master上分支的文件应该不会受到影响。事实上,真的如此吗?我们来试试,操作如下图
[root@huangzb mygit]# git checkout dev
Switched to branch 'dev'
[root@huangzb mygit]# git branch
* dev
master
[root@huangzb mygit]# echo 'a' > a.txt
[root@huangzb mygit]# git status
# On branch dev
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: a.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
[root@huangzb mygit]# git checkout master
M a.txt
Switched to branch 'master'
[root@huangzb mygit]# git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: a.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
[root@huangzb mygit]#
[root@huangzb mygit]# cat a.txt
a
由上图可知,我们在dev分支修改了 a.txt 文件,但是切换到master分支后,同样的可以看到 master也感知到了变化,且文件也修改了。这是为什么呢?
我们只要记住,不管在哪里分支修改文件,其实都是对工作空间的副本进行操作,在没有提交commit之前,所有的操作都是共享的,只有提交后,才可以区分。
注意,不是什么情况都可以切换分支成功,如果在不同分支中同一个文件内容不一样,如果修改了该文件,则不允许切换分支
下面,我们来演示一下,如下图:
[root@huangzb mygit]# git branch
dev
* master
[root@huangzb mygit]# cat a.txt
hello master
[root@huangzb mygit]# git checkout dev
Switched to branch 'dev'
[root@huangzb mygit]# cat a.txt
a
[root@huangzb mygit]# echo 'hello dev' > a.txt
[root@huangzb mygit]# cat a.txt
hello dev
[root@huangzb mygit]# git checkout master
error: Your local changes to the following files would be overwritten by checkout:
a.txt
Please, commit your changes or stash them before you can switch branches.
Aborting
[root@huangzb mygit]#
由上图可知,在master和dev分支上都有一个文件,a.txt,但是两个分支的相同文件内容不一样,在dev分支中修改了该文件,没有提交,此时,再次切换分支,提示切换失败,必须操作后才可以切换,要么提交,要么还原,要么使用 stash命令暂存,否则不允许切换。
5. 如何删除分支
使用 git branch -d 分支名 的方式来删除指定分支
我们可以通过 git branch -d 的方式来删除指定分支,但是有以下疑问?
- 是否可以删除当前所处分支
下面我们来验证后,看看结果
5.1 是否可以删除当前所处分支
我们当前所处master分支,我们来看看能否删除所处分支,操作如下:
[root@huangzb mygit]# git branch
dev
* master
[root@huangzb mygit]# git branch -d master
error: Cannot delete the branch 'master' which you are currently on.
[root@huangzb mygit]#
从上图中,我们可以看出,删除当前所处分支是不允许的,因为如果删除了当前分支,git 不知道设置使用哪个分支,所以 git 是不允许删除当前所处分支的。