2012-11-01 62 views
2

有時,當有局部變化工作目錄,切換分支失敗,但下面的流程工作:爲什麼git需要存儲save-pop來切換分支?

  • 藏匿保存
  • 開關分支
  • 藏匿彈出

怎麼來的?不知道如何將本地工作目錄更改應用到目標分支?什麼樣的設計選擇使這個過程成爲必需有沒有一個標誌可以用來避免這個稍長的程序?

UPDATE:
假設我要保持局部變化的局部變化當我切換分支。有時候這是實際情況下...

回答

4

有兩種情況,噹噹前分支是骯髒和嘗試切換分支:

  1. 你忘了提交更改。

    在這種情況下,git會警告您切換到另一個分支將導致您丟失所做的更改 。這基本上是默認的 假設,這就是爲什麼錯誤消息按照原樣寫入的原因。

  2. 您的更改是暫時的,您仍然想要切換。

    在這種情況下,您需要存儲更改,然後在 切換後重新應用。 Git從來不認爲這是你想要的。如果我不得不猜測 爲什麼它可能是因爲Linus不經常這樣做。

因爲git無法讀取您的想法,所以它會等待您告訴它提交或存儲。雖然通過錯誤信息,我會說,如果git試圖讀取你的思想,它會猜測你想要提交而不是隱藏 - 但這在你的情況下是錯誤的猜測。


附加應答

對不起,我的答覆,但我今天的長延時注意到你更新的問題。

對於本地更改,我的策略是創建本地更改分支。然後從所有功能分支中取代主分支。這是可行的,因爲本地更改通常適用於所有工作分支。

但是這樣做使得重新設計與主有點繁瑣,因爲你基本上需要兩次重新綁定 - 一次local_changes,然後從local_changes到主題分支。但是你可以很容易地寫出這樣的shell腳本:

# rebase_master.sh 
git rebase master local_changes 
git rebase local_changes 

的這另一個優點是,如果你需要重新配置你的環境,然後改變local_changes將變更傳播到所有特性分支。

要合併回主,您可以使用git rebase master在合併之前從主題分支中刪除local_changes。

+0

另一種常見的情況是,你開始在錯誤的分支什麼工作,後來想之前切換到正確的分支完成並做出改變。 – qqx

2

爲了掩飾你的問題的最後一部分,如果你這樣做了很多,你可以創建一個別名來縮短這個過程:

switch = !f() { git stash && git checkout $1 && git stash pop; }; f 

用法:git switch branchName

+0

這是一個非常有用的別名。謝謝 – slebetman

+2

您可能想要小心別名。即使沒有任何東西被隱藏(你有一棵乾淨的樹),'git stash'也會返回成功,最後的'git stash pop'可能會從你的堆棧中彈出其他東西。 – jszakmeister

2

與開關分支只要您未修改當前的HEAD與目標提交之間不同的任何文件,髒工作樹就會成功。如果情況並非如此,則需要合併這些文件的更改,並且git checkout未能警告您,您正在嘗試做一些不容易顛倒的操作。如果您無論如何要做到這一點,你可以使用的git checkout--merge-m選項:

git checkout -m branchName