作者简介:大家好,我是未央;
博客首页:未央.303
系列专栏:Git企业级开发
每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!!!
文章目录
前言
一、理解分支
二、创建、切换、合并分支
2.1 创建分支
2.2 切换分支
2.3 合并分支
三、删除分支
总结
前言
一、理解分支
分⽀就是科幻电影⾥⾯的平⾏宇宙,当你正在电脑前努⼒学习 C++ 的时候,另⼀个你正在另⼀个平⾏宇宙⾥努⼒学习 JAVA。
如果两个平⾏宇宙互不⼲扰,那对现在的你也没啥影响。不过,在某个时间点,两个平⾏宇宙合并了,结果,你既学会了 C++ ⼜学会了 JAVA!图片示例:
举例说明:
在版本回退⾥,你已经知道,每次提交,Git都把它们串成⼀条时间线,这条时间线就可以理解为是⼀个分⽀。截⽌到⽬前,只有⼀条时间线,在Git⾥,这个分⽀叫主分⽀,即 master 分⽀。
再来理解⼀下HEAD,HEAD 严格来说不是指向提交,⽽是指向master,master才是指向提交的,所以,HEAD 指向的就是当前分⽀。图片示例:每次提交,master分⽀都会向前移动⼀步,这样,随着你不断提交,master分⽀的线也越来越⻓,⽽HEAD只要⼀直指向master分⽀即可指向当前分⽀。图片示例:
通过查看当前的版本库,我们也能清晰的理出思路:代码示例:所以说HEAD指向的master分⽀是指向最新一次提交的;
二、创建、切换、合并分支
2.1 创建分支
Git ⽀持我们查看或创建其他分⽀,在这⾥我们来创建第⼀个⾃⼰的分⽀ dev ,对应的命令为:代码示例:
当我们创建新的分⽀后,Git 新建了⼀个指针叫 dev, * 表⽰当前 HEAD 指向的分⽀是 master 分⽀。另外,可以通过⽬录结构发现,新的 dev 分⽀:代码示例:hyb@139-159-150-152:~/gitcode$ ls .git/refs/heads/ #通过目录结构查看heads分支dev masterhyb@139-159-150-152:~/gitcode$ cat .git/refs/heads/*5476bdeb12510f7cd72ac4766db7988925ebd3025476bdeb12510f7cd72ac4766db7988925ebd302
发现⽬前 dev 和 master 指向同⼀个修改。并且也可以验证下 HEAD ⽬前是指向 master 的。代码示例:hyb@139-159-150-152:~/gitcode$ cat .git/HEADref: refs/heads/master
图示总结上述过程:
2.2 切换分支
那如何切换到 dev 分⽀下进⾏开发呢?使⽤ git checkout 命令即可完成切换,代码⽰例如下:hyb@139-159-150-152:~/gitcode$ git checkout dev #切换到dev分支Switched to branch 'dev'hyb@139-159-150-152:~/gitcode$ git branch #此时HEAD 指向的分⽀是dev分支* devmasterhyb@139-159-150-152:~/gitcode$ cat .git/HEAD # 验证下 HEAD⽬前是指向 masterref: refs/heads/dev
图示说明上述过程:
我们发现 HEAD 已经指向了 dev,就表示我们已经成功的切换到了 dev 上!
接下来,在 dev 分⽀下修改 ReadMe ⽂件,新增⼀⾏内容,并进⾏⼀次提交操作:代码示例:hyb@139-159-150-152:~/gitcode$ vim ReadMe #修改文件内容hyb@139-159-150-152:~/gitcode$ cat ReadMe #查看文件的内容hello bithello githello worldhello version1hello version2hello version3write aaa for new branch #发现在文件中新增了一行内容hyb@139-159-150-152:~/gitcode$ git add . #将工作区的文件添加到暂存区hyb@139-159-150-152:~/gitcode$ git commit -m"modify ReadMe"#将工作区的文件提交到本地库[dev 3740dce] modify ReadMe1 file changed, 1 insertion(+)
现在,dev 分⽀的⼯作完成,我们就可以切换回 master 分⽀:代码示例:hyb@139-159-150-152:~/gitcode$ git checkout master #切换回master分支Switched to branch 'master'hyb@139-159-150-152:~/gitcode$ cat ReadMe #查看ReadMe文件的内容hello bithello githello worldhello version1hello version2hello version3
切换回 master 分⽀后,发现ReadMe⽂件中新增的内容不⻅了!!!赶紧再切回 dev 看看:代码示例:hyb@139-159-150-152:~/gitcode$ git checkout dev #切换到dev分支Switched to branch 'dev'hyb@139-159-150-152:~/gitcode$ cat ReadMe #查看文件的内容hello bithello githello worldhello version1hello version2hello version3write aaa for new branch在 dev 分⽀上,内容还在。为什么会出现这个现象呢?我们来看看 dev 分⽀和 master 分⽀指向,发现两者指向的提交是不⼀样的:代码示例:hyb@139-159-150-152:~/gitcode$ cat .git/refs/heads/devbdaf528ffbb8e05aee34d37685408f0e315e31a4hyb@139-159-150-152:~/gitcode$ cat .git/refs/heads/master5476bdeb12510f7cd72ac4766db7988925ebd302看到这⾥就能明⽩了,因为我们是在dev分⽀上提交的,⽽master分⽀此刻的提交点并没有变,此时的状态如图如下所⽰。
图示状态说明:
当切换到 master 分⽀之时,HEAD 就指向了 master,当然看不到提交了!
2.3 合并分支
为了在 master 主分⽀上能看到新的提交,就需要将 dev 分⽀合并到 master 分⽀。代码⽰例如下:hyb@139-159-150-152:~/gitcode$ git branch* devmasterhyb@139-159-150-152:~/gitcode$ git checkout master # 切换到 master 上进行合并Switched to branch 'master'hyb@139-159-150-152:~/gitcode$ git merge dev # 合并 dev 分支Updating 16623e1..3740dceFast-forwardReadMe | 1 +1 file changed, 1 insertion(+)hyb@139-159-150-152:~/gitcode$ cat ReadMe # 此时我们再查看ReadMehello bithello githello worldhello version1hello version2hello version3write aaa for new branchgit merge 命令⽤于合并指定分⽀到当前分⽀。合并后,master 就能看到 dev 分⽀提交的内容 了。此时的状态如图如下所⽰
图示状态过程:
Fast-forward 代表“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度⾮常快。 当然,也不是每次合并都能 Fast-forward,我们后⾯会讲其他⽅式的合并。
三、删除分支
合并完成后, dev 分⽀对于我们来说就没⽤了, 那么dev分⽀就可以被删除掉,注意如果当前正处于此分⽀下,就不能删除当前分⽀,如:代码示例:hyb@139-159-150-152:~/gitcode$ git branch #查看本地分支情况* devmasterhyb@139-159-150-152:~/gitcode$ git branch -d dev #删除dev分支error: Cannot delete branch 'dev' checked out at '/home/hyb/gitcode'
⽽可以在其他分⽀下删除当前分⽀,如:hyb@139-159-150-152:~/gitcode$ git checkout master #切换到master分支Switched to branch 'master'hyb@139-159-150-152:~/gitcode$ git branch -d dev #删除dev分支Deleted branch dev (was bdaf528).hyb@139-159-150-152:~/gitcode$ git branch #查看本地分支情况* master #此时只有master分支了此时的状态如图如下所⽰。
图示状态示例:
因为创建、合并和删除分⽀⾮常快,所以Git⿎励你使⽤分⽀完成某个任务,合并后再删掉分⽀,这和直接在master分⽀上⼯作效果是⼀样的,但过程更安全。