在git 上新建一个远程空的分支用来测试,本地创建readme.txt来进行修改。提交。
$ git init
$ git status
$ git add .
$ git commit “first create readme”
$ git remote add origin https://github.com/UserNamezhangxi/testgit.git
$ git push -u origin master
这样就创建了一个master分支,内容如下:
创建分支
$ git branch testbranch
创建名为 testbranch 的分支
创建分支的时候,会创建一个指向当前提交的新指针。 Git如何知道你当前处于哪一分支上?git通过一个名为HEAD的特殊指针实现的,在git中,HEAD是一个指向当前所在的本地分支的指针
切换分支
$ git checkout testbranch
Push 当前readme.txt 文件
$ git push origin testbranch
这样当前就有两个分支了
$ git checkout master
切换到master分支
使用
$ git log --oneline --decorate
查看分支指向的对象
可以看出master 和 testbranch都是指向同一个3f4f283地址。
那么现在远程仓的状态:
如果我切换到testbranch 然后修改readme的一些内容。
切换到testbranch后,HEAD由指向master指向了testbranch,HEAD是指向当前分支的.
OK, 现在在testbranch 上修改了一下readme 的内容,提交后地址显示d158844
$ git log --oneline --decorate 看看具体记录
根据记录,再来画一张图:
切换到testbranch分支有什么意义呢?
再次提交之后testbranch分支已经向前移动,但master分支还是指向之前执行git checkout testbranch切换分支时所在的提交
我们来看看github 上readme 记录
testbranch :
master:
这样就比较明了了
如果我们再切换master分支,它会把HEAD指针移回到master分支,还会把我们工作目录的文件恢复到master分支指向的快照的状态,也就是第1次commit后的状态,比如第2次commit是修改了readme内容,重新恢复到没有修改readme内容的版本。
请注意,当你在切换分支时,工作目录的文件会被改变。如果你切换到较旧的分支,工作目录会被恢复到该分支最后一次提交的状态。但如果在当前状态下无法干净地完成恢复操作,就不允许你切换分支。比如我在testbranch分支下修改了readme文件,没有commit,就不允许切换,要求我们先提交
当然这样的提示很友好,不然你修改了大半天,不小心切了一下分支,啥都没了很悲剧。
我们切回master 分支,修改readme 并且commit提交.来一张图:
在第三次提交commit之后,
$ git log --oneline --decorate --graph --all 看看具体记录
这个时候在master 进行 Commit后,项目历史就已经产生了分叉,就是你创建了新分支testbranch,在testbranch分支上做了一次修改并提交。然后切回到主分支master做了修改并提交。这两次提交是在master和testbranch上做出的,彼此相互分离,你可以在分支间自由切换,当你准备好之后就可以合并这些修改。