1. 程式人生 > >mzy git學習, 保留現場,恢復現場,以及bug分支處理(七)

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中的內容])