2013年12月19日 星期四

應用git stash 於多分枝之版本控制

本文是要說明git中stash指令的應用,基本需要先知道git 基本的add, commit,以及branch的功能。

使用git進行版本控制,branch是相當重要的功能,一般會建議要開發一個新的功能,就要先分出一個新的branch,開發好新的功能後再merge到master的版本內。
編按:雖然話是這麼說啦,可是筆者在實作時通常還是一個master branch一直commit下去XD。
當分枝一多的時候,就會出現一些問題,例如在一個分枝中修改到一半的內容,例如:「雷射彈幕」,這時有些點子想要切到另一個分枝中修改其他內容,但這個「雷射彈幕」的功能還沒達到可以commit的等級,就需要stash來暫存目前修改的內容。
--

下面是git stash的相關操作環境範例: 我們有個master branch跟開發中的feature branch,現在在feature branch中開發一個新的feature,加入並commit "featurefile"這個檔案
$ git checkout feature
$ git commit featurefile  <-注意一般是不這麼寫的,這裡是為了說明方便。
some modification on featurefile
$ git checkout master
這時候我們會得到一個:
error:
Your local changes to the following files would be overwritten by checkout: featurefile Please, commit your changes or stash them before you can switch branches.
Aborting
因為切到master branch會清掉已修改的內容,而git不會輕易讓你這麼做。

這時候就要先stash(暫存)它,stash有點像commit,不過沒有commit這麼正式,使用:
git stash (save)
git stash list
git stash pop
git stash drop
save: 存入一個暫存,可以不打,git stash預設
list: 列出目前有的stash
pop: 取出暫存
drop: 刪掉暫存

在這裡我們就直接git stash,這時候會看到所有還沒commit的修改都已經消失,用git stash list會看到:
stash@{0}: WIP on feature: ef9d050 feature initial commit
這裡重要的是“0”這個數字,這是stash的index;另外”feature initial commit”則是這個stash是這在哪個commit中分支出來的。
Git stash時還可以加上message來取代上面的ef9d050 feature initial commit這段
git stash save “this is temporary stash of master commit”
不過這在stash量很少的時候大概不太需要用到。

現在我們已經可以切回master的branch了。在master進行修改後,同樣不想commit的內容也可以用stash進行暫存,這時候git stash list會變成
stash@{0}: WIP on master: e194f69 master initial commit
 stash@{1}: WIP on feature: ef9d050 feature initial commit
分別標示了從master和featurecommit中暫存的內容。

--
要取出stash的內容,我們用git stash pop,這預設會取出stash index 0的內容,如果要取出其他stash的內容,就要用例如:
git stash pop stash@{1}
在後面打上stash完整名稱。
取出其他index的內容相當重要,像在例子中,如果我們先切回feature branch,再pop出在master branch中記錄的stash,這個效果和pull是類似的,若是有衝突的檔案就會要求merge,會很麻煩,個人是不建議在這種狀況下進行merge,畢竟當初就是不想記錄下來才用stash,現在要是merge就記錄進去了。

 如果要刪掉已經存入的暫存就用
git stash drop
刪去就行。

 祝大家git stash愉快
Related Posts Plugin for WordPress, Blogger...