2011-07-13 32 views

回答

239

git reset --soft HEAD^應該做你想做的。在此之後,您將在索引中進行第一次更改(可見於git diff --cached),並且您的最新更改不會上演。然後git status看起來就像這樣:

# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  modified: foo.java 
# 
# Changes not staged for commit: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
#  modified: foo.java 
# 

你可以再做git add foo.java並立即提交這兩個改變。

+0

這兩個變化在哪裏? –

+0

我編輯了答案:「要提交的更改」進行了第一次更改,並且「更改未提交進行提交」進行了第二次更改。 – Antti

+2

在這個答案中描述的實際是'git commit --amend'確實是什麼;但是工作流程要複雜得多。儘管給了一個好的方向('git reset'),但這並不回答OP問的問題。 –

35

用途:

git reset HEAD^ 

,做了「混」在默認情況下復位,這將做你的要求;將foo.java放入不分區,刪除最近的提交。

+0

你介意向我解釋什麼是「混合」復位「軟」復位和「硬」復位? –

+1

@Kit Ho - git reset manual對這些有很好的描述。 – manojlds

+3

@Kit,@manojlds:那麼http://stackoverflow.com/questions/2530060/can-you-explain-to-me-git-reset-in-plain-english(無恥插件) – Cascabel

34

git reset --soft只是爲了它:它就像git reset --hard,但不接觸文件。

+4

這是我聽到的最容易理解的解釋(僅用11個字)!謝謝! – phreakhead

+2

這個答案是錯誤的。 'git reset'「就像'git reset --hard',但不會觸及這些文件。」不是'git reset --soft'。 'git reset --soft'將會改變這些變化,所以如果你想提交它們,你不需要將它們添加到分級中,但是你必須'重新設置'它們(是的,第二次,沒有' - soft「),以防你不這樣做。所以答案很簡短,但不正確。 –

17

要我下面總是更可讀(因此更好)的方式來做到這一點:

git reset HEAD~1 

在地方1可以有任意數量的承諾要unstage。

1

對於unstaging在上次提交的所有文件 -

git reset HEAD~

相關問題