2014-09-23 165 views
1

我嘗試從一個本地分支轉到另一個分支。 Git告訴我,我不能這樣做,因爲我的local changes to the following files would be overwritten by checkoutgit-stash和git-checkout有什麼區別?

然後我得到一個「推薦」Please, commit your changes or stash them before you can switch branches

我知道我不需要對提到的文件進行更改。覆蓋它們是可以的。所以,我嘗試stash。我執行git stash file_name。因此我得到:

Usage: git stash list [<options>] 
    or: git stash show [<stash>] 
    or: git stash drop [-q|--quiet] [<stash>] 
    or: git stash (pop | apply) [--index] [-q|--quiet] [<stash>] 
    or: git stash branch <branchname> [<stash>] 
    or: git stash [save [--patch] [-k|--[no-]keep-index] [-q|--quiet] 
       [-u|--include-untracked] [-a|--all] [<message>]] 
    or: git stash clear 

好的。這是行不通的。然後我嘗試git checkout file_name。沒有抱怨git。然後我可以從一個分支切換到另一個分支。所以,似乎我得到了我需要的東西(轉到第二個分支而不保存對第一個分支的更改)。

但是,我想問一問,爲什麼stash不起作用,以及最終結果在不同情況下如何工作?

+1

'藏匿'沒有工作,因爲你用它錯了。請參閱'git help stash'。你所要求的區別是,如果你隱藏了這些變化,那麼它們就會被隱藏起來,但是現在你卻失去了這些變化。 – Biffen 2014-09-23 11:29:16

+0

「隱藏」更改意味着什麼?如果變化是「隱藏」,那麼他們是一種記憶?那麼「隱藏」和「添加」之間有什麼區別。如果我將這些更改「添加」到臨時區域,我會記住更改(在分支中)。 – Roman 2014-09-23 11:33:28

+0

'git help stash'會詳細解釋這一點。 – geoffspear 2014-09-23 11:35:02

回答

5

您不能顯式地存儲單個文件。如果你運行git-stash它會隱藏你所有的修改。

git checkout -- file在工作目錄中放棄對該文件的更改,並檢出當前提交(即HEAD指向的那個文件)記錄的該文件的版本。

+0

爲什麼git提供了隱藏所有內容但不是單個文件的可能性?不隱藏「放棄對工作目錄中文件的更改並檢出該文件的最新提交版本」? – Roman 2014-09-23 11:31:17

+1

@roman,你可以隱藏你想要的任何部分。類似於'git add -p',它可以讓你添加或者拒絕每個塊,你可以做'git stash -p'。請參閱[這裏](http://stackoverflow.com/a/5506483/912144) – Shahbaz 2014-09-23 11:39:55

+1

*最新*不太合適的詞,在這裏;它留下了誤解的餘地。相反,您應該正確:*當前提交記錄的版本*(即「HEAD」指向的版本)。 – Jubobs 2014-10-11 10:47:50

1

git stash將您的更改保存爲「存儲」 - 這看起來像是一堆臨時提交。可以看到git stash list
使用git stash可以隱藏某些文件甚至是大塊代碼。嘗試git stash save -p。它會交互式地詢問你想要保存的內容。
另一種方法是添加所有,但一個文件索引與git add。然後運行git stash save -k。它存儲更改的文件(在git status中爲紅色),沒有準備提交的文件(在git status中爲綠色)。

2

git stash工程分兩個步驟:

  1. 保存你的工作目錄和索引到一個安全的地方,
  2. 恢復你的工作目錄和索引到最近的提交。然後,您可以在其他分支上工作,進行提交等操作,當您準備好回到您所在的位置時,請鍵入git stash pop,然後您又回來了,全速工作。

彈出您的儲藏箱會從您的儲藏箱中移除更改並將其重新應用到您的工作副本。

或者,您可以將更改重新應用到您的工作副本,並將其保留在git stash apply的藏匿處。

git checkout -- file在工作目錄中放棄對該文件的更改,並檢出當前提交(即HEAD指向的那個文件)記錄的該文件的版本。