mzy git學習, 保留現場,恢復現場,以及bug分支處理(七)
git stash
在git中有時候我們工作做了一半,但是有點急事需要離開一段時間,或者現在需要切換到另一個分支下,去維護和修改一些其它的東西,但是我們現在的工作還沒有完成,提交上去的話,並不是完整的,那麼該怎麼辦呢?
git提供了保留現場和恢復現場的操作。通過git stash操作,你可以把你當前的工作進度暫存起來(我認為其實就和git add類似,放到了git的暫存區中因為git status的話,你可以看見當前分支是clean的)
$ vim LICENSE $ git stash Saved working directory and index state WIP on dev: 47f7c9c 修改了readme.txt $ git status On branch dev nothing to commit, working tree clean
你可以多次儲存現場,但是現場之間並不是連貫的哦(意思是,你將當前狀態儲存了現場之後,你開啟你一個東西,是你儲存現場之前完全沒有修改的樣子!),所以我暫時覺得多次儲存現場沒有太大的意義。但是現場的儲存,你要知道的是,它是通過棧的方式儲存的,即其實你儲存現場和恢復現場遵循的都是,先進後出的!
上面說了儲存現場是:git bash,那麼恢復現場該怎麼辦?
彆著急先說如果你的現場存了很多個,怎麼檢視現場列表。
通過git stash list 就可以檢視你的現場列表了!
$ git stash list
[email protected] {0}: WIP on dev: 47f7c9c 修改了readme.txt
[email protected]{1}: WIP on dev: 47f7c9c 修改了readme.txt
[email protected]{2}: WIP on dev: 47f7c9c 修改了readme.txt
後面的"修改了readme.txt"是當前節點的commit -m註釋,因為我麼這三個現場都是對同一個節點的現場保留
那麼恢復現場該怎麼辦呢?
我說過現場儲存的資料結構是棧,那麼學過資料結構的人應該知道,棧有入棧(push)和出棧(pop),但是還有一種檢視棧頂元素(peek)但是不出棧的操作,那麼對應git的現場保留也應該有這樣的操作!
push:git stash 現場保留
pop:git stash pop 恢復現場,並且從現場列表中刪除棧頂現場
peek:git stash apply 恢復現場,但是不從現場列表中刪除現場
如果使用了git stash apply 又要刪除現場的話,就要額外使用一條命令:
git stash drop(但是此條命令也只能刪除棧頂的一個現場)
所以我這裡不建議多個現場!
如果多個現場,你又想要恢復特定的現場呢?其實git也有提供:
通過git stash apply [email protected]{0}[stash的id]
bug修復連貫案例:
如果你當前發現master分支有bug,隨即你在master分支上新建了一個分支issue-500,修改完了之後,你切換到master分支,通過git merge issue-500,之後master造成了修改!那麼你的其它分支應該馬上和master合一次(正常情況下是對dev修復bug之後,dev分支和個人分支合)
這裡合併,最好就使用禁用fast forward的普通合併:
merge --no-ff -m "合併master上改好的bug" dev
這裡復現一次這個過程:
先在master分支上新建一個LICENSE檔案,隨便寫點內容:
當前是在主分支(master上)
vim LICENSE:
hello,write by mzy.
...
wq
然後為master建立一個dev分支:
git branch dev
然後在master上建立並切換到一個issue-404分支:
git checkout -b issue-404
修改LICENSE
vim LICENSE
hello, write by mzy
在issue中的修改
...
wq
然後:
git add LICENSE
git commit -m "issue-404中修改了LICENSE"
切換回master分支:
合併issue分支:
$ git merge issue-404
Already up to date.
合併成功!
(注意:如果是沒有衝突的合併,git自動就提交到了版本庫,但是如果有衝突,記得先手動解決衝突之後,記得要git add、
git commit 到版本庫哦)
然後我們可以刪除這個修改問題的分支issue-404了:
$ git branch -d issue-404
Deleted branch issue-404(was 6488267).
(以上刪除issue-404分支,因為合併了,所有直接刪除成功,如果沒有合併的話,要強制刪除記得使用-D哦)
切換到我們的dev分支檢視LICENSE檔案:
發現master的改變,並沒有被推送給子分支dev,所以需要在當前的dev分支上合併一下master中的修改!
git merge --no-ff -m "合併master上改好的bug" master
cat LICENSE
發現之前的修改拿到了!
(這裡有個概念:upstream和downstream,up我理解是遠端的,較穩定的一端,比如master和dev比,master是主分支穩定的就算是up,相對於master來說它的down就是dev,因為master最後需要合併dev中的內容[拿到dev中的內容])