'git reset --hard HEAD~1'和'git reset --soft HEAD~1'有什么区别?

mes*_*ali 47 git undo git-reset

我试图在git中撤消我的提交.使用危险git reset --hard HEAD~1吗?

不同选项有git reset什么区别?

Sas*_*olf 104

git reset确实知道五种"模式":软,混合,硬,合并和保持.我将从前三个开始,因为这些是您通常会遇到的模式.在那之后你会找到一个不错的奖金,敬请期待.

柔软的

使用时,git reset --soft HEAD~1您将从当前分支中删除最后一次提交,但文件更改将保留在您的工作树中.此外,更改将保留在您的索引上,因此使用a git commit将创建一个提交,其更改与您之前"删除"的提交完全相同.

这是默认模式,与soft非常相似.当您"删除"提交时,git reset HEAD~1仍会保留工作树中的更改,但不会保留索引; 因此,如果要"重做"提交,则必须在提交git add之前添加更改().

使用时,除了上次提交中引入的更改之外,git reset --hard HEAD~1您将丢失所有未经修改的更改.更改将不会保留在您的工作树中,因此执行git status命令将告诉您存储库中没有任何更改.

仔细踩这个.如果您不小心删除了从未跟踪过的未提及的更改git(发言:已提交或至少已添加到索引中),则无法使用它们git.

奖金

保持

git reset --keep HEAD~1是一个有趣和有用的.它仅重置当前 HEAD和给定提交之间不同的文件.如果这些文件中的任何一个具有未更改的更改,则会中止重置.它基本上是一个更安全的版本hard.

当您进行大量更改并希望切换到不同的分支而不会丢失这些更改时,此模式特别有用 - 例如,当您开始处理错误的分支时.


您可以在git reset文档中阅读更多相关信息.

注意
git reset删除提交时,提交并没有真正丢失,只有没有引用指向它或它的任何子进程.你仍然可以git reset通过找到它的SHA-1密钥来恢复被"删除"的提交,例如使用诸如的命令git reflog.

  • @MatthieuMoy,已经晚了三年,但我在"keep"上增加了一节.;) (2认同)

apa*_*ana 10

Git 重置有 5 种主要模式:软、混合、合并、硬、保持。它们之间的区别是改变或不改变head, stage (index), working directory

Git reset --hard 将改变头、索引和工作目录。
Git reset --soft 只会改变头部。索引、工作目录没有变化。

所以换句话说,如果你想撤销你的提交, --soft 应该足够好。但是在那之后,您的索引和工作目录中仍然有来自错误提交的更改。您可以修改文件,修复它们,将它们添加到索引并再次提交。

使用--hard,您的项目将完全干净利落。就好像上次提交没有任何变化一样。如果您确定这是您想要的,那么继续前进。但是一旦你这样做,你将完全失去你的最后一次提交。(注意:仍有办法恢复丢失的提交)。


小智 5

这篇有用的文章以图形方式显示了reset命令的说明。

http://git-scm.com/blog/2011/07/11/reset.html

Reset --hard可能非常危险,因为它会在不检查的情况下覆盖您的工作副本,因此,如果您根本没有提交文件,则文件将消失。

至于源代码树,我没有办法撤消提交。无论如何,它很可能会在掩护下使用reset