如果我提交併更改了文件foo
,我可以通過git checkout foo
撤消這些更改。如果我對foo
進行更改並將它們與git add foo
相加,那麼git checkout foo
不會做任何事情(也不會說什麼)爲什麼「git checkout <filename>」僅適用於非暫存文件?
這是什麼原因?
如果我提交併更改了文件foo
,我可以通過git checkout foo
撤消這些更改。如果我對foo
進行更改並將它們與git add foo
相加,那麼git checkout foo
不會做任何事情(也不會說什麼)爲什麼「git checkout <filename>」僅適用於非暫存文件?
這是什麼原因?
因爲你可以unstage它,然後看看:)
git reset <file>
git checkout <file>
沒有檢查出來,以及背後的原因是因爲如果你在本地修改文件,然後要更新到主分支例如,您的工作和分段文件應該被覆蓋。
當你說
git checkout foo
無需額外的參數,你告訴混帳更換foo
在索引中的foo
您worktree。因此,如果你已經對add
進行了編輯(即分段,即更新了索引)所有對foo
的更改,那麼當然對於這個checkout
命令沒有任何改變。
正常的程序備份出來的變化將是第一reset
(更新從HEAD
索引提交)和然後使用checkout
更新工作版本。
再然後,你可以使用來checkout
從之前獲得的foo
版本提交
git checkout HEAD foo
該作品一樣好;這兩步方法可能只是更廣泛的瞭解,因爲它使用git status
建議的命令進行卸載和不做修改。
我很困惑,你說正常的程序是兩個步驟,當結帳實際上可以做我想要的一步。結賬解決方案的缺點是什麼? – Bananach
沒有缺點。這只是因爲git用戶界面恰好會推薦一些命令,每個命令都只能執行兩個步驟中的一個,所以即使我需要同時執行這兩個步驟(並且我認爲許多用戶)傾向於使用雙命令方法,也是出於習慣。澄清了這一點。 –
我認爲如果一個文件已經保存在提交中,你應該簽出提交。 – lilezek
您現在的答案是正確的,但是這裏的關鍵洞察是,任何時候都沒有一個,而不是兩個,而是任意一個文件的* 3 *活動版本:在當前或「HEAD」提交中,一個索引和工作樹中的一個。 'git checkout'將*副本*複製到工作樹,但它可以從另外兩個副本中*或者從其他任何提交中複製*。還有一個奇怪的地方:從*任何提交複製*(不論是否爲HEAD)都將*寫入索引*和*工作樹,替換*兩個*版本。 *爲什麼*回答大部分是「因爲這很容易實現。」 – torek