Git 分支问题
前瞻技能
Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch
创建+切换分支:git checkout -b
切换分支:git checkout
合并某分支到当前分支:git merge
合并某分支到当前分支:git merge –no-ff -m “描述”
; –no-ff参数,表示禁用Fast forward,合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。 删除分支:git branch -d
正文开始:
开始实战:
创建dev分支,然后切换到dev分支:
$ git checkout -b dev
Switched to a new branch 'dev'
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
然后,用git branch命令查看当前分支:
$ git branch
* dev
master
以在dev分支上正常提交,比如对readme.txt做个修改,加上一行:
Creating a new branch is quick.
然后提交:
$ git add readme.txt
$ git commit -m "branch test"
[dev fec145a] branch test
1 file changed, 1 insertion(+)
,dev分支的工作完成,我们就可以切换回master分支:
$ git checkout master
Switched to branch 'master'
把dev分支的工作成果合并到master分支上:
$ git merge dev
Updating d17efd8..fec145a
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
合并完成后,就可以放心地删除dev分支了:
$ git branch -d dev
Deleted branch dev (was fec145a).
删除后,查看branch,就只剩下master分支了:
$ git branch
* master
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。
关于分支管理策略
–no-ff方式的git merge
前面创建分支步骤和上面一样,关键在于合并分支的一步:
准备合并dev分支,请注意–no-ff参数,表示禁用Fast forward:
$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
readme.txt | 1 +
1 file changed, 1 insertion(+)
因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
合并后,我们用git log看看分支历史:
$ git log --graph --pretty=oneline --abbrev-commit
* 7825a50 merge with no-ff
|\
| * 6224937 add merge
|/
* 59bc1cb conflict fixed
...
stash(储存)功能
Git提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
软件开发中,bug就像家常便饭一样。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。
当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是!!当前正在dev上进行的工作还没有提交;
是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?
这个是时候就是 stash 登场了!
$ git stash
Saved working directory and index state WIP on dev: 6224937 add merge
HEAD is now at 6224937 add merge
现在,用git status查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。
用git stash list命令可以查看刚才你储存的工作现场:
$ git stash list
stash@{0}: WIP on dev: 6224937 add merge
然后我们要恢复现场有两个方法: 1. git stash apply恢复 > 但是恢复后,stash内容并不删除,你需要用git stash drop来删除; 2. git stash pop,恢复的同时把stash内容也删了
再用git stash list查看,就看不到任何stash内容了.
你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:
$ git stash apply stash@{0}