如何取消本地git提交

Ama*_*r S 696 git git-reset git-commit

我的问题是我已经更改了一个文件,例如:README,为我的测试行添加了一行新的'并保存了该文件,然后我发出了以下命令

 git status

 # On branch master
 # Changed but not updated:
 #   (use "git add <file>..." to update what will be committed)
 #   (use "git checkout -- <file>..." to discard changes in working directory)
 #
 #  modified:   README
 #
 no changes added to commit (use "git add" and/or "git commit -a")


 git add README

 git commit -a -m 'To add new line to readme'
Run Code Online (Sandbox Code Playgroud)

我没有将代码推送到github,现在我想取消这个提交.

为此我用过

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

但是我从README文件中丢失了新添加的" 这个用于我的测试行 ".这不应该发生.我需要内容.有没有办法保留内容并取消我的本地提交?

Kor*_*tor 1329

只需使用git reset没有--hard标志:

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

PS:在基于Unix的系统上,您可以使用HEAD^等于的系统HEAD~1.在Windows HEAD^上将无法工作,因为^信号表示行继续.所以你的命令提示符只会问你More?.

  • 顺便说一句,这被称为`--mixed` [在手册中](http://www.kernel.org/pub/software/scm/git/docs/git-reset.html#_description). (12认同)
  • 较新版本的Git甚至允许`@ ^`作为`HEAD ^`的简写. (9认同)
  • 是否可以一方面重置所有提交? (2认同)

小智 175

使用--soft而不是--hard标志:

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

  • @JohnGiotta - `git reset --soft HEAD ^`将删除最后一次本地(未删除)提交但将**保持更改**你已经完成 (50认同)
  • 你能解释两面旗帜之间的区别吗? (16认同)
  • Windows 上的 `git reset --soft HEAD~` (9认同)

ino*_*tia 29

如果您正处于提交的中间(即已在编辑器中),则可以通过删除第一个上方的所有行来取消它#.这将中止提交.

因此,您可以删除所有行,以便提交消息为空,然后保存文件:

它看起来应该是这样的.

然后,您将收到一条消息Aborting commit due to empty commit message..

编辑:

您也可以删除所有行,结果将完全相同.

要删除vim中的所有行(如果这是您的默认编辑器),一旦进入编辑器,键入gg以转到第一行,然后dG删除所有行.最后,写入并退出文件,wq您的提交将被中止.

  • 这*正是我正在寻找的!这个答案需要更多的赞成:) (3认同)

mis*_*don 15

您应该做的第一件事是在删除提交消息之前确定是否要保留本地更改。

使用git log显示当前提交信息,然后找到了commit_id 之前的承诺,你要删除,而不是要删除提交。

如果要保留本地更改的文件,只需删除提交消息:

git reset --soft commit_id

如果要删除所有本地更改的文件和提交消息:

git reset --hard commit_id

这就是区别

  • 我认为恰恰相反。 (3认同)

小智 8

使用以下命令:

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

之后,您还可以查看恢复的文件,如下所示。

Unstaged changes after reset:
M   application/config/config.php
M   application/config/database.php
Run Code Online (Sandbox Code Playgroud)


Nes*_*ric 8

您可以通过使用以下参数之一告诉Git如何处理索引(将成为下一个提交的文件集)和工作目录:

--soft:只会重置提交,而不会更改索引和工作目录.

--mixed:这将重置索引以匹配HEAD,而不会触及工作目录.所有更改都将保留在工作目录中并显示为已修改.

--hard:它重置所有内容(提交,索引,工作目录)以匹配HEAD.

在您的情况下,我将使用git reset --soft您在索引和工作目录中保留您修改的更改.请务必查看此内容以获取更详细的说明.