git reset –mixed,–soft和–hard有什么区别?

我正在寻找拆分提交,并不确定使用哪个重置选项。

我在看页面你能解释什么“git reset”在纯英文中做? ,但是我意识到我不了解git索引或分区是什么,所以解释也没有帮助。

在这个答案中,– --mixed--soft的用例也是一样的(当你想修复和重新提交的时候),有人可以把它分解得更多吗? 我意识到 – --mixed可能是select,但我想知道为什么 。 最后,那么 – --hard

有人可以给我一个如何select3个选项的工作stream程示例吗?

当您修改存储库中的文件时,更改最初是未分配的。 为了提交它,你必须把它join – 也就是说,使用git add将它添加到索引中。 进行提交时,提交的更改是已添加到索引的更改。

git reset至less改变当前分支( HEAD )指向的地方。 --mixed--soft之间的区别在于你的索引是否也被修改。 所以,如果我们在这一系列的提交上,在分支master

 - A - B - C (master) 

HEAD指向C ,索引与C匹配。

当我们运行git reset --soft Bmaster (也就是HEAD )现在指向B ,但是索引仍然有C的变化; git status会显示他们正在上演。 所以,如果我们现在运行git commit ,我们会得到一个与C相同的新提交。


好吧,从这里开始:

 - A - B - C (master) 

现在让我们做git reset --mixed B (注意: – --mixed是默认选项)。 masterHEAD再次指向B,但是这次索引也被修改为与B匹配。 如果我们在这个时候运行git commit ,由于索引与HEAD匹配,所以什么都不会发生。 我们仍然在工作目录中进行更改,但由于它们不在索引中,因此git status它们显示为非暂存。 要提交他们,你会git add ,然后照常提交。


最后,– --mixed--mixed (它改变你的头和索引),除了--hard也修改你的工作目录。 如果我们在C并运行git reset --hard B ,那么C添加的更改以及任何未提交的更改将被删除,工作副本中的文件将与commit B匹配。 由于您可以通过这种方式永久丢失更改,所以在进行硬重置之前,您应该始终运行git status ,以确保您的工作目录是干净的,或者可以丢失未提交的更改。


最后,一个可视化: 在这里输入图像描述

请注意,这是一个简单的解释,旨在作为寻求理解这个复杂function的第一步。

对于希望在每个命令之后可视化他们的项目状态看起来像的视觉学习者可能是有帮助的:


对于那些使用terminal打开颜色(git config –global color.ui auto):

git reset --soft A ,你会看到B和C的东西是绿色的(已上演并准备提交)

git reset --mixed A (或者git reset A ),你会看到B和C的东西是红色的(未分级,准备上演(绿色),然后提交)

git reset --hard A ,你不会再看到B和C的变化(就像他们从来没有存在过)


或者对于那些使用像“Tower”或“SourceTree”这样的GUI程序的人来说,

git reset --soft A ,你会在'staged files'区域看到B和C的东西准备提交

git reset --mixed A (或git reset A ),你会看到B和C的东西在'unstaged文件'区域准备好移动到staged,然后提交

git reset --hard A ,你不会再看到B和C的变化(就像他们从来没有存在过)

这里是对TortoiseGit用户的基本解释:

git reset --soft--mixed保持文件不变。

git reset --hard实际上改变你的文件来匹配你重置的提交。

在TortoiseGit中, 索引的概念非常隐藏在GUI中。 修改文件时,不必运行git add将更改git add到暂存区域/索引。 当简单地处理修改不改变文件名的现有文件时, git reset --soft--mixed是一样的! 如果添加了新文件或重命名文件,则只会注意到不同之处。 在这种情况下,如果运行git reset –mixed,则必须从“ 未版本化文件”列表中重新添加文件。

3个选项在什么情况下使用的简短答案:

保持代码中的当前更改,但要重写提交历史logging:

  • soft :你可以一次提交所有的东西,并用新的描述创build一个新的提交(如果你使用torotise git或任何其他大多数GUI,这是一个使用,因为你仍然可以在提交和确认你想要的文件多个提交的方式与不同的文件。在Sourcetree中,所有文件将被提交进行提交。)
  • mixed :你将不得不再次提交单独的文件到索引之前,你提交(在Sourcetree所有更改的文件将不冻结)

实际上也会在代码中丢失更改

  • hard :你不只是重写历史logging,而且还将失去所有的改变

在进入这三个选项之前,必须先了解三件事。

1)历史/ HEAD

2)阶段/索引

3)工作目录

复位–soft:历史已更改,HEAD已更改,工作目录未更改。

重置 – 混合:历史已更改,HEAD已更改,工作目录已更改为unstaged数据。

重置–hard:历史改变,HEAD改变,工作目录改变,丢失的数据。

使用Git –soft总是安全的。 在复杂的要求中应该使用其他选项。