修復(fù)bug色迂,需要在需要修復(fù)的節(jié)點(diǎn)創(chuàng)建分支霞捡,修復(fù)后合并蚀狰,手頭任務(wù)沒(méi)有完成先保存漆弄,回頭再弄
git stash
保存現(xiàn)在的工作區(qū),去修復(fù)bug去
git stash pop
彈出任務(wù)造锅,回到工作現(xiàn)場(chǎng),并刪除棧中內(nèi)容
git stash list
查詢(xún)緩存工作棧中保存的任務(wù)廉邑。
git stash apply stash@{0}
恢復(fù)指定的stash 哥蔚, 但是不會(huì)刪除棧中內(nèi)容,需要使用 git stash drop
來(lái)刪除
git branch -D <name> 強(qiáng)行刪除沒(méi)有被合并的分支
Bug分支
軟件開(kāi)發(fā)中蛛蒙,bug就像家常便飯一樣糙箍。有了bug就需要修復(fù),在Git中牵祟,由于分支是如此的強(qiáng)大深夯,所以,每個(gè)bug都可以通過(guò)一個(gè)新的臨時(shí)分支來(lái)修復(fù)诺苹,修復(fù)后咕晋,合并分支,然后將臨時(shí)分支刪除收奔。
當(dāng)你接到一個(gè)修復(fù)一個(gè)代號(hào)101的bug的任務(wù)時(shí)掌呜,很自然地,你想創(chuàng)建一個(gè)分支issue-101來(lái)修復(fù)它坪哄,但是质蕉,等等,當(dāng)前正在dev上進(jìn)行的工作還沒(méi)有提交:
$ 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)行到一半模暗,還沒(méi)法提交,預(yù)計(jì)完成還需1天時(shí)間念祭。但是兑宇,必須在兩個(gè)小時(shí)內(nèi)修復(fù)該bug,怎么辦棒卷?
幸好顾孽,Git還提供了一個(gè)stash功能,可以把當(dāng)前工作現(xiàn)場(chǎng)“儲(chǔ)藏”起來(lái)比规,等以后恢復(fù)現(xiàn)場(chǎng)后繼續(xù)工作:
$ git stash
Saved working directory and index state WIP on dev: f52c633 add merge
現(xiàn)在若厚,用git status查看工作區(qū),就是干凈的(除非有沒(méi)有被Git管理的文件)蜒什,因此可以放心地創(chuàng)建分支來(lái)修復(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)場(chǎng)存到哪去了磷雇?用git stash list命令看看:
$ git stash list
stash@{0}: WIP on dev: f52c633 add merge
工作現(xiàn)場(chǎng)還在,Git把stash內(nèi)容存在某個(gè)地方了躏救,但是需要恢復(fù)一下唯笙,有兩個(gè)辦法:
一是用git stash apply恢復(fù),但是恢復(fù)后盒使,stash內(nèi)容并不刪除崩掘,你需要用git stash drop來(lái)刪除;
另一種方式是用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$ git stash apply stash@{0}
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}
Feature 分支
軟件開(kāi)發(fā)中鞋拟,總有無(wú)窮無(wú)盡的新的功能要不斷添加進(jìn)來(lái)骂维。
添加一個(gè)新功能時(shí),你肯定不希望因?yàn)橐恍?shí)驗(yàn)性質(zhì)的代碼贺纲,把主分支搞亂了航闺,所以,每添加一個(gè)新功能猴誊,最好新建一個(gè)feature分支潦刃,在上面開(kāi)發(fā),完成后懈叹,合并乖杠,最后,刪除該feature分支澄成。
現(xiàn)在胧洒,你終于接到了一個(gè)新任務(wù):開(kāi)發(fā)代號(hào)為Vulcan的新功能畏吓,該功能計(jì)劃用于下一代星際飛船。
于是準(zhǔn)備開(kāi)發(fā):
$ git checkout -b feature-vulcan
Switched to a new branch 'feature-vulcan'
5分鐘后卫漫,開(kāi)發(fā)完畢:
$ git add vulcan.py
$ git status
On branch feature-vulcan
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: vulcan.py
$ git commit -m "add feature vulcan"
[feature-vulcan 287773e] add feature vulcan
1 file changed, 2 insertions(+)
create mode 100644 vulcan.py
切回dev菲饼,準(zhǔn)備合并:
git checkout dev
一切順利的話(huà),feature分支和bug分支是類(lèi)似的列赎,合并宏悦,然后刪除。
但是包吝!
就在此時(shí)肛根,接到上級(jí)命令,因經(jīng)費(fèi)不足漏策,新功能必須取消!
雖然白干了臼氨,但是這個(gè)包含機(jī)密資料的分支還是必須就地銷(xiāo)毀
$ 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小結(jié)
開(kāi)發(fā)一個(gè)新feature掺喻,最好新建一個(gè)分支;
如果要丟棄一個(gè)沒(méi)有被合并過(guò)的分支储矩,可以通過(guò)git branch -D <name>強(qiáng)行刪除感耙。 feature-vulcan'.
銷(xiāo)毀失敗。Git友情提醒持隧,feature-vulcan分支還沒(méi)有被合并即硼,如果刪除,將丟失掉修改屡拨,如果要強(qiáng)行刪除只酥,需要使用大寫(xiě)的-D參數(shù)。呀狼。
現(xiàn)在我們強(qiáng)行刪除:
$ git branch -D feature-vulcan
Deleted branch feature-vulcan (was 287773e).
終于刪除成功裂允!
小結(jié)
開(kāi)發(fā)一個(gè)新feature,最好新建一個(gè)分支哥艇;
如果要丟棄一個(gè)沒(méi)有被合并過(guò)的分支绝编,可以通過(guò)git branch -D <name>強(qiáng)行刪除。