2012-03-06 60 views
311

通常情況下,放棄對文件的修改已刪除的文件,你會怎麼做:Unstage在混帳

git checkout -- <file> 

如果我要放棄時刪除該文件的變化?以上行會給出錯誤:

error: pathspec '<file>' did not match any file(s) known to git. 

什麼命令將恢復該單個文件而不撤消其他更改?

獎勵積分:另外,如果我要放棄的變化添加什麼文件?我想知道如何取消這種變化。

+1

放棄更改和暫停是兩個不同的事情,你試圖做什麼? – 2012-03-06 20:35:24

+0

這是一篇文章中的兩個不同的問題和問題。這使得答案太多,不必要的混淆。 – 2017-01-26 19:28:34

回答

457

假設你想撤消其次是「混帳RM」或'RM「混帳添加-A」或類似的效果:

# this restores the file status in the index 
git reset -- <file> 
# then check out a copy from the index 
git checkout -- <file> 

要撤消「git的補充」,第一假設你還沒有犯下,上面的行就足夠了。

+1

完美答案! – 2016-02-18 14:44:49

+21

' - '是關鍵。 'git reset '不起作用,這是什麼使我在這裏。 – 2016-10-18 11:12:10

+0

完美地工作。這可以凝聚成一個命令嗎? – 2017-08-08 13:04:58

38

這兩個問題都在git status回答。

要unstage添加一個新的文件中使用git rm --cached filename.ext

# Changes to be committed: 
# (use "git rm --cached <file>..." to unstage) 
# 
# new file: test 

要unstage刪除文件使用git reset HEAD filename.ext

# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# deleted: test 

在另一方面,git checkout --從未unstage,它只是丟棄非暫存的變更。

+3

我在Debian的git 1.7.2.5中看不到已刪除文件的提示。 – tripleee 2015-09-21 10:55:02

7

你的兩個問題的答案是相關的。我會與第二啓動:

一旦你已經上演了文件(常與git add,而其他一些命令隱階段的變化,以及像git rm),你可以背出這種變化與git reset -- <file>

在你的情況下,你必須使用git rm刪除文件,這相當於簡單地用rm刪除它,然後暫存該更改。如果你第一次用git reset -- <file>取消它,你可以用git checkout -- <file>恢復它。

0

如果它已經上演,並承諾,那麼下面將重置文件:

git reset COMMIT_HASH file_path 
git checkout COMMIT_HASH file_path 
git add file_path 

這將所發生多次提交以前缺失的工作。