如何在进行本地提交后再次取消暂存我的文件?

Kit*_* Ho 227 git

我做了以下命令

git add <foo.java>
git commit -m "add the foo java"
Run Code Online (Sandbox Code Playgroud)

如何立即删除我的本地提交并使foo.java处于未暂停状态?

如果我输入git reset --hard,我发现它会将我的修改foo.java恢复为原始的.

Ant*_*tti 390

git reset --soft HEAD~1应该做你想做的事.在此之后,您将在索引中进行第一次更改(可见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
#
Run Code Online (Sandbox Code Playgroud)

然后git add foo.java,您可以立即执行并提交两个更改.

  • 做git reset --soft HEAD~1然后git reset HEAD (3认同)
  • 这个答案中描述的实际上是`git commit --amend`的作用; 但是工作流程要复杂得多.尽管给出了一个好方向(`git reset`),但这并没有回答OP问的问题. (2认同)
  • 不得不用'〜'替换'^'使它工作,所以它看起来像:`git reset --soft HEAD~` (2认同)

Rya*_*art 69

使用:

git reset HEAD^
Run Code Online (Sandbox Code Playgroud)

默认情况下会执行"混合"重置,这会按照您的要求执行; 把foo.java放在unstaged中,删除最近的提交.

  • 这实际上是唯一*正确的答案.另外两个答案将在提交后再次**文件**. (4认同)
  • @Kit,@ manojlds:http://stackoverflow.com/questions/2530060/can-you-explain-to-me-git-reset-in-plain-english(无耻插件) (3认同)
  • 你介意向我解释什么是“混合”重置、“软”重置和“硬”重置? (2认同)

And*_*eko 42

对我来说,以下总是更可读(因此更可取)的方式:

git reset HEAD~1
Run Code Online (Sandbox Code Playgroud)

代替1可能有任何数量的提交你想要取消.


wRA*_*RAR 37

git reset --soft只是为了它:它就像git reset --hard,但不触及文件.

  • 那是我听过的最容易理解的解释(仅用11个字)!谢谢! (4认同)
  • 答案是对的.`git reset`"就像`git reset --hard`,但不会触及文件." 不是`git reset --soft`.`git reset --soft`将暂存更改,因此您不必将它们添加到暂存,以防您想要提交它们,但是您必须'git reset`它们(是的,第二次,没有`--soft`)万一你没有.所以答案很短,但不正确. (3认同)

Lav*_*ika 12

要取消上一次提交中的所有文件的暂存-

git reset HEAD~


Vas*_*h K 6

假设您想要取消最多 n 次提交的更改,

其中提交哈希如下:

  • 小时1
  • h2 ...
  • hn+1

然后运行以下命令:
git reset hn

现在 HEAD 将位于 hn+1。从 h1 到 hn 的更改将取消暂存。


Hie*_*roB 5

“重置”是在本地撤消更改的方法。提交时,首先选择要包含在“ git add ”中的更改,这称为“暂存”。一旦变更生效,您就可以“ git commit ”它们。

要从暂存或提交中退出,可以“重置” HEAD。在分支上,HEAD是指向最近提交的git变量。因此,如果您上演但尚未提交,请“ git reset HEAD”。通过将更改从舞台上备份到当前HEAD。它是“ git reset --mixed HEAD〜0 ”的简写。

如果您已经提交过,那么HEAD已经完成,因此您需要备份到上一次提交。在这里,您“ 重置HEAD〜1 ”或“ 重置HEAD ^ 1 ”或“ 重置HEAD〜 ”或“ 重置HEAD ^ ”-所有参考HEAD减一。

〜或^是哪个更好的符号?将〜波浪号视为单个流 -当每个提交具有单个父级并且顺序上只是一系列更改时,则可以使用波浪号引用备份流,例如HEAD〜1,HEAD〜2,HEAD 〜3,对于父母,祖父母,曾祖父母等(从技术上讲,它是在较早的几代中找到第一位父母)。

合并时,提交中有多个父级。那是^插入符开始起作用的时候-您可以记住,因为它显示分支汇聚在一起。使用插入符号,HEAD ^ 1将是单个提交的第一个父级,而HEAD ^ 2将是单个提交的第二个父级,例如,母亲和父亲。

因此,如果您只是在单亲提交中返回一跳,则HEAD〜和HEAD ^是等效的-您可以使用任一跳。

同样,重置可以是--soft,-- mixed--hard。软重置只会撤消提交,它会重置HEAD,但不会从较早的提交中签出文件,因此会保留工作目录中的所有更改。而且--soft reset甚至不会清除阶段(也称为index),因此所有已暂存的文件仍将处于暂存状态。

一个--mixed复位(默认),也不会从签出文件的早期承诺,因此,所有的变化被保留,但阶段已被清除。这就是为什么简单的“ git reset HEAD ”将清除舞台的原因。

一个-硬复位复位头,它清除阶段,但它也检查出所有从文件中较早的承诺,所以它覆盖任何变化。

如果您已将提交推送到远程存储库,那么重置就不能很好地工作。您可以在本地重置,但是当您尝试推送到远程时,git会看到您的本地HEAD在远程分支的HEAD后面,并且会拒绝推送。您也许可以强制执行推送,但是git确实不喜欢这样做。

另外,如果您想保留更改,则可以存储它们,检出先前的提交,取消存储更改,暂存它们,创建一个新的提交,然后进行推送。

  • +1 获取操作的详细说明。IMO 这应该是公认的答案! (2认同)