我想拆分一个提交,但不确定使用哪个重置选项。

我正在看这页用简单的英语说,“git重置”是做什么的?,但我意识到我并不真正理解git索引或暂存区是什么,因此解释没有帮助。

此外,在我看来,在这个答案中——混合和——软的用例是相同的(当您想修复和重新承诺时)。有人能再详细解释一下吗?我知道,混合可能是最好的选择,但我想知道原因。最后,硬呢?

谁能给我一个工作流程的例子,如何选择3个选项会发生?


当前回答

所有其他的答案都很棒,但我发现最好通过将文件分解为三类来理解它们:非阶段性、阶段性和提交:

——困难应该是容易理解的,它恢复了一切 ——mixed(默认): 非暂存文件:不要更改 暂存文件:移至非暂存文件 提交文件:移动到非暂存状态 ——软: 非暂存文件:不要更改 阶段性文件:不要更改 提交文件:移动到阶段性

总而言之:

-软选项将移动所有(除了非暂存文件)到暂存区 混合选项会把所有东西都移到非舞台区域

其他回答

后悔的三种类型

许多现有的答案似乎并不能回答实际的问题。它们是关于命令做什么,而不是关于你(用户)想要什么——用例。但那正是警察问的!

在给出git reset命令时,你会后悔什么,这样的描述可能更有帮助。假设我们有这个:

A - B - C - D <- HEAD

以下是一些可能会让你后悔的事情,以及应对方法:

1. 我很遗憾B, C, D不是一个人。

git重置——软A,我现在可以立即提交,从A开始的所有更改都是一次提交。

2. 我很遗憾B、C和D不是两次提交(或十次提交,或其他)。

提交已经消失,索引回到了A,但是工作区域看起来仍然和d之后一样。所以现在我可以在一个完全不同的分组中添加并提交。

3.我很遗憾B, C, D发生在这支树枝上;我希望我在A之后有一个分支它们发生在另一个分支上。

在另一个分支上创建一个新的分支,然后git重置——硬a。当前分支现在结束于a,其他分支起源于它,包含B、C和D。

(当然,你也可以使用硬重置,因为你希望B、C和D从未发生过。)

简单回答这3个选项在什么情况下使用:

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

soft:你可以一次性提交所有内容,并使用新的描述创建一个新的提交(如果你使用tootise git或任何其他大多数gui,这是一个可以使用的,因为你仍然可以在提交中选择你想要的文件,并以这种方式对不同的文件进行多次提交。在Sourcetree中,所有文件都将被提交。) mixed:在提交之前,您必须将单独的文件再次添加到索引中(在Sourcetree中,所有更改的文件都将被取消staging)

要真正丢失您在代码中的更改:

难的是:你不仅重写了历史,而且还失去了你重置之前的所有更改

——soft:告诉Git将HEAD重置为另一个提交,这样索引和工作目录将不会以任何方式改变。在原始HEAD和提交之间更改的所有文件都将被暂存。

-mixed:就像软的,这将重置HEAD到另一个提交。它还将重置索引以匹配它,而工作目录将不会被触及。所有更改都将保留在工作目录中,并显示为已修改,但不是阶段性的。

——hard:这将重置所有内容——它将HEAD重置回另一个提交,重置索引以匹配它,并重置工作目录以匹配它。

-混合和-软之间的主要区别是你的索引是否也被修改。点击这里查看更多信息。

所有类型的重置都会改变回购中的HEAD。此外…… >将从repo中删除的提交的更改移动到索引中,并合并已经存在的任何更改。 Git reset——hard <b>丢失工作树和索引中的更改。 它是唯一更改工作树的方法。

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

对于那些想要在这些命令之后可视化他们的项目状态的视觉学习者来说,这可能是有帮助的:

给定:- A - B - C (master)


适用于开启彩色终端机的用户 (git配置——global color。ui汽车):

git重置-软A,你会看到B和C的东西在绿色(分期和准备提交)

git重置-混合A(或git重置A),你会看到B和C的东西在红色(未分期和准备分期(绿色),然后提交)

git重置-硬A,你将不再看到B和C的变化在任何地方(将好像他们从来没有存在过)


或者对于那些使用像“塔”或“SourceTree”这样的GUI程序的人

git重置——软A,你会看到B和C的东西在“阶段性文件”区域准备提交

git reset—混合A(或git reset A),你会看到B和C的东西在“unstaging files”区域准备移动到staging,然后提交

git重置-硬A,你将不再看到B和C的变化在任何地方(将好像他们从来没有存在过)