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).
删除成功。