git高层命令(分支)
git branch :显示分支列表
git branch 分支名 :创建分支
git checkout 分支名 :切换分支
git log --oneline --decorate --graph --all :显示全部分支
git branch -d 分支名 :删除分支
git branch -D 分支名 :强制删除分支
git branch -v :查看每一个分支的最后一次提交
git branch 新分支名 对应哈希值 :新建一个新分支,并让新分支指向对应的提交对象
一,git分支概念
git 是版本控制工具,在一个团队中,每个人只是使用其中的一个分支。当你拿到一个分支,你还可以去拆分分支,因为你可以以此实现许多功能,每一个功能都可以开一个分支去操作。
这就意味着,可以把你个人的项目内容从开发主线中分离出来,以免影响开发主线。
例如,你已经写好了功能很稳定的一段代码,这时候需要新加一些功能,就没有必要冒险在原有代码上直接进行修改,而是可以基于原代码创建出一个新的分支,然后再修改之。
二,创建分支
我们项目的每一个版本都是一个提交对象,都只有哈希值暴露在外面,之前就说过,有一个外部的指针指向这个提交对象,这个指针就是新建分支时产生的。
当提交对象一直往前更新,这个指针也会一直跟着往前更新。
这个master是默认就有的分支,这叫主分支
当我们不断提交新版本的时候,这个master就会一直跟着我们走。那这么看来,分支不就是可以理解为给提交对象命名嘛。
即:
分支是指针,指向最新的提交对象
创建分支:git branch :为你创建一个可以移动的新指针。
例如:创建一个testing 分支,git branch testing 这会在当前所在的提交对象上创建一个指针。
就会发现这里多了一个指针:
但是此时head还是指向这个master主分支。要想切换成testing还需要:
此时,就指向这个testing了。
假如此时的master已经是稳定的代码了,而我想要新添加功能,那么就让master留在这个稳定的版本上,然后只在testing上进行修改。如果testing写得很差,就直接返回master,但若是写得好,就让master直接调到testing上来。
1,在testing分支中写代码:
2,有提交,说明head需要往前走:
由上图可以看出来,master留在之前的版本中,而head指向新分支(新的提交对象)
2.再修改代码:
可以看到,head始终指向最新创建的分支的最新的提交对象。
三,删除分支
需要注意的是,不能删除当前指针指向的那个分支,而应该先把指针指向欲保留的分支之后,再删除分支。
于是删除分支时,若此时当前指针指向欲删除分支,则先切换分支,再删除分支。
2-1,当前指针指向testing分支,而我恰好需要删除testing分支。则先把指针指向tmaster分支。
此时,共有两个分支,当前指针已经指向主分支master了。
而注意到此时git log --oneline只是显示主分支,没有显示全部了,如果想要全部分支显示出来:
2-2删除不要的分支:
git branch -d 分支名
注意到,第一次用d删除时,因为testing里面有多个版本,没有被合并,所以不让删除,需要用D来强制删除。
2-3 查看每一个分支的最后以此提交:
这两个功能都可以看。
2-4 新建一个分支,并使分支指向对应的提交对象
git branch 新分支名 对应哈希值
例如说我现在想要把v2创建成一个新的分支:
需要注意的是,此时创建的新分支仅仅是指向了对应的 提交对象,而当前的指针实际并未指向它。
现在再让指针切换过去:
查看文件的内容,会发现此时工作区中的文件,变成了v2版本的内容了:
再切换回去看看最新版本的文件内容:
也就是说,一旦指针指向哪个分支(指向哪个提交对象或者说是项目版本),工作区的文件内容会瞬间切换成那个版本。
也就是说,有了这种分支的机制,你想要看过往哪个版本的就可以在此版本上创建一个分支然后查看了,如果查看完毕,就可以让指针切回主分支,再删除这个创建的分支(不会删除对应版本的,放心)。