Git的分支,其实本质上仅仅是只想提交对象的可变指针
Git的默认分支名是master,在多次提交之后,你其实已经有一个执行最后那个提交对象的master分支。master分支会在每次提交时自动向前移动。而且Git 的master分支并不是一个特殊的分支。它就跟其他分支完全没有区别,之所以几乎每个仓库都有master分支,是因为 git init命令默认创建它,并且大多数人都懒得取改动它。
1.git的分支操作
1.1 分支创建
创建一个名称为branch_name的分支
git branch branch_name
查看各个分支当前所指向的对象 --decorate
git log --oneline --decorate
创建完成后我们执行上面一条命令发现,branch_name 和 master分支都指向了相同校验和的提交对象。
1.2 分支切换
要切换到一个已经存在的分支,使用git checkout 命令。
git checkout branch_name //切换到了branch_name分支,这样HEAD就指向了branch_name 分支了。
在切换分支之后,如果修改并提交了文件,那么分支的HEAD就会向前移动,而master分支并没有,依然指向git checkout时所指向的对象。当我们再次切回master的时候,git checkout master 这条命令做了两件事,其一是HEAD指回了master分支,二是将工作目录恢复成master分支所指向的快照内容。也就是说,刚刚切到分支上所做的修改,在master分支上不会体现。因为Git的分支实质上仅仅是包含所指对象校验和的文件(长度为40的SHA-1值字符串),所以它的创建和销毁都异常高效。创建一个新分支就相当于往一个文件中写入41个字节(40个字符和1个换行符),所以这两步过程并没有什么日志输出,但是确实已经恢复到了切换之前的状态。
现在这个项目的提交历史已经产生了分叉,因为刚刚新建了一个分支,并切换过去做了一些工作,我们可以在不同分支间来回切换和工作,并在时机成熟的时候将他们合并起来。
1.3 分支的合并
创建分支并切换到新建分支可以使用: git branch -b new_branch
它相当于 git branch new_branch
git checkout new_branch
假如下面一个场景,我想在项目添加一个功能,但是不知道能不能实现。此时可以新建一个分支,并在分支上进行开发测试,等到测试通过了,合并新建分支到master分支。可以进行如下操作:
1.3.1.git branch -b new_branch
1.3.2.在new_branch 上进行开发,测试通过后提交 git add ... git commit ...
· 1.3.3.合并new_branch到master:
首先切换到master分支:
git checkout master
合并分支
git merge new_branch
1.3.4.此时如果有冲突,git会给出提示,这就需要我们手动合并冲突(手动修改冲突文件),然后再进行
· git add ...git commit ..
1.3.5.如果一个分支完成了它的使命,可以使用下面的命令删除
git branch -d new_branch
1.4 拉取服务器的分支
对于已经存在的分支,在拉取了服务器代码[git clone <url>]之后,我们使用git branch -a 就可以看到所有的分支了,如果需要在某一个分支上进行操作,只需要直接切换过去即可: [git checkout branch_name ] 然后就可以重复前面的操作了。
1.5 创建自己的分支并提交到服务器端:
创建分支: git branch branch_name(仅仅创建) 或者使用 git checkout -b branch_name(创建并切换到该分支)。
推送分支到远程:(branch_name是分支名)
git push --set-upstream origin branch_name
创建分支仅仅是在本地创建了一个分支,并没有服务器端与之对应,需要使用上面的命令进行提交。
1.6 删除一个远程的分支,下面命令的branch_name是分支名
git push --delete origin branch_name
git push origin --delete branch_name