分支管理策略
合并分支時(shí),如果可能,Git會(huì)用Fast forward
模式捷泞,但這種模式下家卖,刪除分支后,會(huì)丟掉分支信息。
如果要強(qiáng)制禁用Fast forward
模式面哥,Git就會(huì)在merge
時(shí)生成一個(gè)新的commit
哎壳,這樣,從分支歷史上就可以看出分支信息尚卫。
下面我們實(shí)戰(zhàn)一下--no-ff
方式的git merge
:
首先归榕,仍然創(chuàng)建并切換dev分支:
$ git checkout -b dev
Switched to a new branch 'dev'
修改readme.txt
文件,并提交一個(gè)新的commit
:
$ git add readme.txt
$ git commit -m "add merge"
[dev f52c633] add merge
1 file changed, 1 insertion(+)
現(xiàn)在吱涉,我們切換回master
:
$ git checkout master
Switched to branch 'master'
準(zhǔn)備合并dev分支刹泄,請(qǐng)注意--no-ff
參數(shù),表示禁用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(+)
因?yàn)楸敬魏喜⒁獎(jiǎng)?chuàng)建一個(gè)新的commit
怎爵,所以加上-m
參數(shù)特石,把commit
描述寫進(jìn)去。
合并后鳖链,我們用git log
看看分支歷史:
$ git log --graph --pretty=oneline --abbrev-commit
* e1e9c68 (HEAD -> master) merge with no-ff
|\
| * f52c633 (dev) add merge
|/
* cf810e4 conflict fixed
...
可以看到姆蘸,不使用Fast forward
模式,merge
后就像這樣:
- 團(tuán)隊(duì)合作的分支策略
在實(shí)際開發(fā)中芙委,我們應(yīng)該按照幾個(gè)基本原則進(jìn)行分支管理:
master
分支應(yīng)該是非常穩(wěn)定的逞敷,也就是僅用來發(fā)布新版本,平時(shí)不能在上面干活灌侣;那在哪干活呢推捐?干活都在dev分支上,也就是說顶瞳,dev分支是不穩(wěn)定的玖姑,到某個(gè)時(shí)候,比如1.0版本發(fā)布時(shí)慨菱,再把dev分支合并到master上焰络,在master分支發(fā)布1.0版本;
你和你的小伙伴們每個(gè)人都在dev分支上干活符喝,每個(gè)人都有自己的分支闪彼,時(shí)不時(shí)地往dev分支上合并就可以了。
所以协饲,團(tuán)隊(duì)合作的分支看起來就像這樣:
小結(jié)
Git分支十分強(qiáng)大畏腕,在團(tuán)隊(duì)開發(fā)中應(yīng)該充分應(yīng)用。
合并分支時(shí)茉稠,加上--no-ff
參數(shù)就可以用普通模式合并描馅,合并后的歷史有分支,能看出來曾經(jīng)做過合并而线,而fast forward
合并就看不出來曾經(jīng)做過合并铭污。
Bug分支
當(dāng)你接到一個(gè)修復(fù)一個(gè)代號(hào)101的bug
的任務(wù)時(shí)恋日,很自然地,你想創(chuàng)建一個(gè)分支issue-101
來修復(fù)它嘹狞,但是岂膳,等等,當(dāng)前正在dev上進(jìn)行的工作還沒有提交:
$ git status
On branch dev
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: hello.py
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
并不是你不想提交磅网,而是工作只進(jìn)行到一半谈截,還沒法提交,預(yù)計(jì)完成還需1天時(shí)間涧偷。但是簸喂,必須在兩個(gè)小時(shí)內(nèi)修復(fù)該bug,怎么辦燎潮?
幸好娘赴,Git還提供了一個(gè)stash
功能,可以把當(dāng)前工作現(xiàn)場“儲(chǔ)藏
”起來跟啤,等以后恢復(fù)現(xiàn)場后繼續(xù)工作:
$ git stash
Saved working directory and index state WIP on dev: f52c633 add merge
現(xiàn)在,用git status
查看工作區(qū)唉锌,就是干凈的(除非有沒有被Git管理的文件)隅肥,因此可以放心地創(chuàng)建分支來修復(fù)bug。
首先確定要在哪個(gè)分支上修復(fù)bug袄简,假定需要在master
分支上修復(fù)腥放,就從master
創(chuàng)建臨時(shí)分支:
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 6 commits.
(use "git push" to publish your local commits)
$ git checkout -b issue-101
Switched to a new branch 'issue-101'
現(xiàn)在修復(fù)bug,需要把“Git is free software ...”
改為“Git is a free software ...”
绿语,然后提交:
$ git add readme.txt
$ git commit -m "fix bug 101"
[issue-101 4c805e2] fix bug 101
1 file changed, 1 insertion(+), 1 deletion(-)
修復(fù)完成后秃症,切換到master分支,并完成合并吕粹,最后刪除issue-101
分支:
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 6 commits.
(use "git push" to publish your local commits)
$ git merge --no-ff -m "merged bug fix 101" issue-101
Merge made by the 'recursive' strategy.
readme.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
太棒了种柑,原計(jì)劃兩個(gè)小時(shí)的bug修復(fù)只花了5分鐘!現(xiàn)在匹耕,是時(shí)候接著回到dev分支干活了聚请!
$ git checkout dev
Switched to branch 'dev'
$ git status
On branch dev
nothing to commit, working tree clean
工作區(qū)是干凈的,剛才的工作現(xiàn)場存到哪去了稳其?用git stash list
命令看看:
$ git stash list
stash@{0}: WIP on dev: f52c633 add merge
工作現(xiàn)場還在驶赏,Git把stash
內(nèi)容存在某個(gè)地方了,但是需要恢復(fù)一下既鞠,有兩個(gè)辦法:
用
git stash apply
恢復(fù)煤傍,但是恢復(fù)后,stash
內(nèi)容并不刪除嘱蛋,你需要用git stash drop
來刪除蚯姆;用
git stash pop
五续,恢復(fù)的同時(shí)把stash
內(nèi)容也刪了:
$ git stash pop
On branch dev
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: hello.py
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
Dropped refs/stash@{0} (5d677e2ee266f39ea296182fb2354265b91b3b2a)
再用git stash list
查看,就看不到任何stash
內(nèi)容了:
$ git stash list
你可以多次stash
蒋失,恢復(fù)的時(shí)候返帕,先用git stash list
查看,然后恢復(fù)指定的stash
篙挽,用命令:
$ git stash apply stash@{0}
小結(jié)
修復(fù)bug時(shí)荆萤,我們會(huì)通過創(chuàng)建新的bug分支進(jìn)行修復(fù),然后合并铣卡,最后刪除链韭;
當(dāng)手頭工作沒有完成時(shí),先把工作現(xiàn)場
git stash
一下煮落,然后去修復(fù)bug敞峭,修復(fù)后,再git stash pop
蝉仇,回到工作現(xiàn)場旋讹。