2012-08-26 60 views
154

是否有可能將git中的最後一個階段(未提交)更改取消?假設當前分支中有很多文件,有些是上演的,有些則不是。在某些時候,某些愚蠢的程序員無意中執行:你怎樣才能撤消最後的git add?

git add -- . 

...而不是:

git checkout -- . 

可以這樣程序員現在unstage他與一些神奇的混帳命令最後的變化?或者他應該在嘗試之前做出承諾?

+14

「呃,不是*我*你懂的。這是另一個傢伙。一些愚蠢的程序員。是的,那是票。另一個人。他。呵呵,呵呵。「[清除喉嚨] – Rap

+0

heh。我們得到了一個有用的問題和回答,但是這個雖然。 – steveha

+2

可能的重複[撤銷'git add'之前提交](http://stackoverflow.com/questions/348170/undo-git-add-before-commit) –

回答

260

您可以使用git reset。這將「暫停」你上次提交後添加的所有文件。

如果您只想取消某些文件的存儲空間,請使用git reset -- <file 1> <file 2> <file n>

此外,可以通過使用git reset -p來取消文件中的某些更改。

+2

有多難過。畢竟,我認爲我的犯罪行爲有問題。接受這個答案,因爲你提到'-p'開關。謝謝! :) – Septagram

+0

生成(對我來說)錯誤:致命:無法解析'HEAD'作爲有效的參考。我還沒有做任何事情(新的回購)剛做完git add。並對此表示遺憾。我不想重置整個添加,只有一個目錄。 git reset - dir /*.*生成上面的錯誤。 –

+0

...啊,我看到了我正在發生的事情。我沒有任何東西指向,所以git重置失敗(因爲它在HEAD上運行)。 –

35

你不能撤銷最新的 git add,但你可以撤消自上次提交以來所有的addgit reset沒有提交參數復位指數(unstages暫存的變更):

git reset 
+2

「您無法撤消_latest_ git add」:哇,這是令人驚訝和潛在的痛苦。有沒有一個明確的來源呢?另外,有沒有很好的理由呢?謝謝! –

+0

@AndrewMoylan:好吧,沒有辦法自動這樣做。您可以隨時「重置」一個文件,或者使用「reset -p」取消特定的大塊。 – knittl

0

根據難度的大小和規模,您可以創建一個臨時(臨時)分支並提交當前的工作。

然後切換到並檢出您的原始分支,並從臨時提交中選擇適當的文件。

至少你會有永久記錄的當前和以前的狀態工作(直到你刪除該臨時分支)。

13

所以,真正的答案

Can this programmer now unstage his last changes with some magical git command?

居然是:不,你不能unstage剛剛過去的git add

也就是說,如果我們的解釋了一個問題,在以下情況:隨後git add

void foo(int bar) { 
    print("$bar"); 
} 

main() { 
    foo(1337); 
} 

第二個變化:

初始文件:

void foo() { 

} 

main() { 
    foo(); 
} 

第一個變化之後git add

void foo(int bar, String baz) { 
    print("$bar $baz"); 
} 

main() { 
    foo(1337, "h4x0r"); 
} 

在這種情況下,git reset -p不會幫助,因爲它的最小粒度是線。git不知道中間狀態:

void foo(int bar) { 
    print("$bar"); 
} 

main() { 
    foo(1337); 
} 

以上。

2

在日期混帳提示:如果

  1. use "git rm --cached <file>..." to unstage文件沒有在回購協議。它將文件保留在那裏。
  2. use "git reset HEAD <file>..." to unstage如果文件在回購站中,並且您正在修改它們。它保持文件原樣,並將它們分開。

據我所知,你不能撤消git add --,但你可以取消上述文件列表。

2
  • 從索引中刪除該文件,但保持它的版本,並留下了工作副本提交的修改:

    git reset head <file> 
    
  • 文件重置爲從頭部,撤消更改並刪除它們最後的狀態從指數:

    git reset HEAD <file> 
    git checkout <file> 
    
    # If you have a `<branch>` named like `<file>`, use: 
    git checkout -- <file> 
    

    這是需要的,因爲git reset --hard HEAD將無法​​使用單個文件。從指數和版本,保持與修改未版本化的文件的工作拷貝

  • 刪除<file>

    git rm <file> 
    
1

git rm --cached <file> 
  • 從工作副本和完全版本刪除<file>

    如果你想刪除所有添加文件從git的承諾

    git reset 
    

    如果你想刪除一個單獨的文件

    git rm <file>