Git入门之分支管理
分支就是创建一个分支指针,并改变HEAD的指针指向,其工作区内容不会发生变化
实战
-
创建
dev
分支,然后切换到
dev
分支
$ git checkout -b dev # git checkout 加上 -b 表示创建并切换
以上命令等同于下面这两句命令
$ git branch dev $ git checkout dev
查看当前分支
git branch
, 当前分支前面会标一个
*
号
此时就可以在
dev
分支上正常提交
$ git add <file> $ git commit -m 'msg'
切换回
master
分支
$ git checkout master
此时会发现刚才添加的文件不见了,dev分支上的操作,而master指针指向的提交节点没有变化
下面将
dev
分支的工作成果合并到
master
分支上
$ git merge dev
此时会发现在
dev
分支的操作出现在
master
分支中了
Git中会出现
Fast-forward
信息,即此时是“快进模式”,就是直接将
master
的指针指向
dev
最新提交的节点上,所以速度非常快.
下面可以删除
dev
分支了
$ git branch -d dev
查看
branch
,会发现只剩
master
分支了
-
git switch
切换分支:
git checkout <branch>
撤销修改:
git checkout -- <file>
我们发现
git checkout
有两种作用,实际上,用
switch
命令切换分支更科学
创建并切换到
dev
分支
$ git switch -c dev
直接切换到
master
分支
$ git switch master
-
分支管理策略
前面提到了
Fast forward
模式,这种模式下删除分支会丢掉分支信息强制使用这种模式,Git会在
merge
时生成新的
commit
,即可从分支历史上看到分支信息
下面实战一下
--no-ff
方式的
git merge
: 创建并切换
dev
分支
*$ git switch -c dev
提交新的
commit
$ git add <file> $ git commit -m 'msg'
切换回
master
$ git switch master
准备合并分支,请注意
--no-ff
参数,表示禁用
Fast forward
$ git merge --no-ff -m "merge with no-ff"
合并后使用
git log
查看分支历史
$ git log --graph --pretty=online --abbrev-commit
-
分支策略
分支管理的基本原则:
-
master
分支是稳定的,是用来发布新版本的,平时不在上面干活 -
在
dev
上干活,即
dev
分支是不稳的,版本发布时,会将
dev
分支合并到
master
上,并由
master
分支发布 -
团队合作的分支如图所示:
-
-
bug分支
每个分支都可以通过一个新的临时分支来修复,修复后合并分支,然后将该临时分支删除
比如:你接到一个修复101的
bug
任务时,你想要创建一个分支
issue-101
来修复它,但是此时你正在
dev
上进行的工作还没有完成,无法提交(
git status
可以查看当前状态)这时就要用到
stash
功能了,可以将工作现场“储藏起来”,等以后回复现场后继续工作$ git stash
此时用
git status
查看工作区是干净的,就可以放心的创建分支来修复
bug
了先确定在哪个分支上修bug,假定是在
master
分支上修复,就从
master
创建临时分支:$ git checkout master $ git checkout -b issue-101
将
bug
修复后提交$ git add <file> $ git commit -m "fix bug 101" # [issue-101 8842ff5] fix bug 101 # 1 file changed, 1 inserion(+), 1 deletion(-)
修复完成,切换到
master
分支,并合并,最后将
issue-101
分支删除:$ git switch master $ git merge --no-ff -m "merged bug fix 101" issue-101
此时
bug
就修好了,可以回到
dev
分支继续干活了$ git switch dev $ git status
此时工作区是干净的,查看工作现场:
$ git stash list # stash@{0}: WIP on dev: f52c633 add merge
下面将工作现场恢复一下,有两种方法:
-
用
git stash apply
恢复,这种方法不会删除
stash
,需要单独用
git stash drop
删除 -
用
git stash pop
,恢复的同时把
stash
内容也删除了
$ git stash pop
再用
git stash list
就看不到任何
stash
内容了:$ git stash list
你可以多次
stash
,恢复时先用
git stash list
查看,然后恢复指定的
stash
:$ git stash apply stash@{0}
dev
分支是从
master
分支上分出来的,所以该分支上也同样存在
bug
,重复操作一次太麻烦了,我们可以将
8842ff5 fix bug 101
这个提交过的修改复制到
dev
分支(注意:只复制做出的修改,而不是将整个
master
分支
merge
过来)Git提供了一个
cherry-pick
命令,帮助我们将一个特定的提交到当前分支$ git branch # * dev # master $ git cherry-pick 8842ff5 # 8842ff5这个编号可以通过git reflog查到(HEAD前面的字符串) # [dev 0944c8c] fix bug 101 # 1 file changed, 1 insertion(+), 1 deletion(-)
此时自动
commit
了一个
0944c8c
除此之外,我们也可以直接在
dev
分支上修复
bug
,然后重放到
master
分支上,但是也需要先用
git stash
保存现场,才能切换到
master
分支。 -
用
-
feature分支
主要用于新功能的添加,为了不让一些实验性质的代码搞乱主分支,所以每添加一个新功能,最好新建一个
feature
分支,开发完成后合并,最后删除该分支。你接到了一个new task:开发代号为
Vulcan
的新功能,该功能计划用于下一代星际飞船:$ git switch -c feature-vulcan
开发完成后:
$ git add vulcan.md $ git status $ git commit -m "add feature vulcan"
切回
dev
准备合并:$ git switch dev
突发情况出现:因经费不足,上级临时通知新功能必须取消
$ git branch -d feature-vulcan # error: The branch 'feature-vulcan' is not fully merged. # If you are sure you want to delete it, run 'git branch -D feature-vulcan'.
销毁失败,提示分支还未合并,删除会丢掉修改,强行删除需要使用
-D
$ git branch -D feature-vulcan #Deleted branch feature-vulcan (was d12cf23).
删除成功。