1.关于git分支
git的“分支”乍一听是一个特别容易让人产生错觉的概念,以为它和树枝一样是分叉的枝节,其实Git中的分支本质上是个指向commit对象的指针,每次commit,git都把它们串成一条时间线,这条时间线就是一个分支。
2.直接切换分支的两种结果
一般我们在切换分支前,最好先提交commit(或者储藏stash)下在当前分支的修改。 多数情况我们没有提交(或者储藏)当前分支的修改是切换不了分支的,也有一些特殊情况下不提交修改依然可以成功切换分支。
当分支a和分支b在同一提交点时,(可能是刚互相合并完成也可能是a分支是基于b分支的当前提交点新建的),即使在某一个分支下修改了内容(修改文件、创建文件、删除文件)后不提交依然能成功切换分支(刚刚修改的内容会被带到新切换到的分支),于此同时git会提示:
bogon:weddingH5 jj$ git checkout a
D css/index.css(被删除的文件)
M index.html(被修改的文件)
Switched to branch 'a'
复制代码
此时你可以在随意切换a和b分支,并可选择在a和b任一分支上提交现在的修改。
否则会切换分支失败,与此同时git会提示:
error: Your local changes to the following files would be overwritten by checkout:index.html(你修改的文件)
Please commit your changes or stash them before you switch branches.
复制代码
3.切换分支先提交commit
4.切换分支前先储藏stash
使用git的时候,我们往往使用branch解决任务切换问题,例如,我们往往会建一个自己的分支去修改和调试代码, 如果别人或者自己发现原有的分支上有个不得不修改的bug,我们往往会把完成一半的代码 commit提交到本地仓库,然后切换分支去修改bug,改好之后再切换回来。这样的话往往log上会有大量不必要的记录。其实如果我们不想提交完成一半或者不完善的代码,但是却不得不去修改一个紧急Bug,那么使用’git stash’就可以将你当前未提交到本地(和服务器)的代码推入到Git的栈中,这时候你的工作区间和上一次提交的内容是完全一样的,所以你可以放心的修 Bug,等到修完Bug,提交到服务器上后,再使用’git stash apply’将以前一半的工作应用回来。当你多次使用’git stash’命令后,你的栈里将充满了未提交的代码,这时候你会对将哪个版本应用回来有些困惑,’git stash list’命令可以将当前的Git栈信息打印出来,你只需要将找到对应的版本号,例如使用’git stash apply stash@{1}’就可以将你指定版本号为stash@{1}的工作取出来,当你将所有的栈都应用回来的时候,可以使用’git stash clear’来将栈清空。
介绍地址
需要提醒的是,你可以在某一分支上储藏,然后在任一分支上应用这些储藏。git stash apply会默认应用当前储藏列表(用git stash list查看)中最新的储藏,要想指定应用某一储藏,可以用类似git stash apply stash@{2} 这样的命令。
5.什么时候会出现合并冲突
廖雪峰老师的网站地址 当两个分支出现下图这种情况时,合并两个分支可能会发生冲突
如何解决冲突? 只能手动解决冲突,如果涉及到其他开发者,最好和其他开发者当面商量后一起解决。
6. git tag
6.1 git tag是什么
tag , 翻译过来是标签的意思,顾名思义,标签是为了标记某种事物。 tag 是 Git 版本库的一个快照,指向某个 commit 的指针。
6.2 使用git tag的好处
tag 的存在,是因为我们需要这种标记的功能。目前的项目开发中,当发布版本时 tag 就派上用场了。例如 v1.0.1,v1.0.2… 另外,git 提供了 tag 的增删改查一系列操作,在 tag 的使用上,可谓非常之方便。
6.3 tag 和 branch 的区别以及使用场景
想到这里,你可能觉得 tag 和 branch 有点相似。没错,的确是有点像,但是它们的职责分工和本质都是不同的。 **tag 对应某次 commit, 是一个点,是不可移动的。 ** branch 对应一系列 commit,是很多commit点连成的一根时间线。
所以,两者的区别决定了使用方式,改动代码用 branch ,不改动只查看用 tag。
tag 和 branch 的相互配合使用,有时候起到非常方便的效果,例如 已经发布了 v1.0 v2.0 v3.0 三个版本,这个时候,我突然想不改现有代码的前提下,在 v2.0 的基础上加个新功能,作为 v4.0 发布。就可以 检出 v2.0 的代码作为一个 branch ,然后作为开发分支。