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

时间:2014-07-04 07:32:31

标签: git undo git-reset

我试图在git中撤消我的提交。使用git reset --hard HEAD~1是否有危险?

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

4 个答案:

答案 0 :(得分:71)

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

使用git reset --soft HEAD~1时,您将从当前分支中删除最后一次提交,但文件更改将保留在working tree中。此外,更改将保留在您的索引上,因此使用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 documentation

中详细了解相关内容

注意
在执行git reset删除提交时,提交并没有真正丢失,只有没有引用指向它或它的任何子进程。您仍然可以通过查找SHA-1密钥来恢复使用git reset“删除”的提交,例如使用git reflog等命令。

答案 1 :(得分:4)

这是一篇有用的文章,以图形方式显示了重置命令的说明。

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

重置 - 硬件可能非常危险,因为它会在不检查的情况下覆盖您的工作副本,因此如果您还没有提交文件,那么它就会消失。

对于Source树,我无法撤消提交。无论如何,它很可能会在封面下使用重置

答案 2 :(得分:3)

Git重置有5种主要模式:软,混合,合并,硬,保持。 他们之间的区别是改变或不改变头,阶段(索引),工作目录

Git reset --hard将改变头部,索引和工作目录。
Git重置--soft将只改变头部。没有更改索引,工作目录。

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

使用--hard,你在项目中完全得到了一个清晰的名单。好像从最后一次提交中没有任何变化。如果您确定这是您想要的,那么继续前进。但是一旦你这样做,你将完全失去你的最后一次提交。 (注意:仍然有办法恢复丢失的提交)。

答案 3 :(得分:0)

这是使用 git reset --hard git reset --soft:

的主要区别
--soft

完全不触摸索引文件或工作树(但将头重置为,就像所有模式一样)。就像git status一样,这会将所有更改的文件保留为“要提交的更改”。

--hard

重置索引和工作树。自工作树以来,对跟踪文件的任何更改都将被丢弃。