2017-09-20 64 views
1

如果我提交併更改了文件foo,我可以通過git checkout foo撤消這些更改。如果我對foo進行更改並將它們與git add foo相加,那麼git checkout foo不會做任何事情(也不會說什麼)爲什麼「git checkout <filename>」僅適用於非暫存文件?

這是什麼原因?

+0

我認爲如果一個文件已經保存在提交中,你應該簽出提交。 – lilezek

+0

您現在的答案是正確的,但是這裏的關鍵洞察是,任何時候都沒有一個,而不是兩個,而是任意一個文件的* 3 *活動版本:在當前或「HEAD」提交中,一個索引和工作樹中的一個。 'git checkout'將*副本*複製到工作樹,但它可以從另外兩個副本中*或者從其他任何提交中複製*。還有一個奇怪的地方:從*任何提交複製*(不論是否爲HEAD)都將*寫入索引*和*工作樹,替換*兩個*版本。 *爲什麼*回答大部分是「因爲這很容易實現。」 – torek

回答

0

因爲你可以unstage它,然後看看:)

git reset <file> 

git checkout <file> 

沒有檢查出來,以及背後的原因是因爲如果你在本地修改文件,然後要更新到主分支例如,您的工作和分段文件應該被覆蓋。

3

當你說

git checkout foo 

無需額外的參數,你告訴混帳更換foo在索引中的foo您worktree。因此,如果你已經對add進行了編輯(即分段,即更新了索引)所有對foo的更改,那麼當然對於這個checkout命令沒有任何改變。

正常的程序備份出來的變化將是第一reset(更新從HEAD索引提交)和然後使用checkout更新工作版本。

再然後,你可以使用checkout從之前獲得的foo版本提交

git checkout HEAD foo 

該作品一樣好;這兩步方法可能只是更廣泛的瞭解,因爲它使用git status建議的命令進行卸載和不做修改。

+0

我很困惑,你說正常的程序是兩個步驟,當結帳實際上可以做我想要的一步。結賬解決方案的缺點是什麼? – Bananach

+0

沒有缺點。這只是因爲git用戶界面恰好會推薦一些命令,每個命令都只能執行兩個步驟中的一個,所以即使我需要同時執行這兩個步驟(並且我認爲許多用戶)傾向於使用雙命令方法,也是出於習慣。澄清了這一點。 –

相關問題