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

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

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

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


当前回答

莫·阿里用最简单的方式解释了这一点,下面是另一个简单的解释:

——soft:重置HEAD指针指向上一次提交

——mixed:——soft + delete添加的更改

——hard:——混合+恢复工作树文件的变化(小心!)

其他回答

当您在存储库中修改一个文件时,更改最初是暂不执行的。为了提交它,你必须使用git add来执行它——也就是说,将它添加到索引中。当你提交时,提交的更改是那些已经添加到索引中的更改。

git重置更改,至少,当前分支(HEAD)指向的位置。-混合和-软之间的区别在于索引是否也被修改。如果我们在master分支上进行这一系列的提交:

- A - B - C (master)

头指向C,索引匹配C。

当我们运行git reset -soft B, master(因此HEAD)现在指向B,但索引仍然有从C的变化;Git状态将显示它们为阶段性。如果我们在这里运行git commit,我们会得到一个新的commit,和C一样。


好的,再从这里开始:

- A - B - C (master)

现在让我们进行git重置-mixed b(注意:-mixed是默认选项)。同样,master和HEAD指向B,但这一次索引也被修改以匹配B。如果我们在这一点上运行git commit,什么也不会发生,因为索引匹配HEAD。我们在工作目录中仍然有更改,但由于它们不在索引中,git状态将它们显示为未暂存。要提交它们,你需要git添加,然后像往常一样提交。


And finally, --hard is the same as --mixed (it changes your HEAD and index), except that --hard also modifies your working directory. If we're at C and run git reset --hard B, then the changes added in C, as well as any uncommitted changes you have, will be removed, and the files in your working copy will match commit B. Since you can permanently lose changes this way, you should always run git status before doing a hard reset to make sure your working directory is clean or that you're okay with losing your uncommitted changes.


最后,一个可视化图:

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

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

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

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

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

I’m not a git expert and just arrived on this forum to understand it! Thus maybe my explanation is not perfect, sorry for that. I found all the other answer helpful and I will just try to give another perspective. I will modify a bit the question since I guess that it was maybe the intent of the author: “I’m new to git. Before using git, I was renaming my files like this: main.c, main_1.c, main_2.c when i was performing majors changes in order to be able to go back in case of trouble. Thus, if I decided to come back to main_1.c, it was easy and I also keep main_2.c and main_3.c since I could also need them later. How can I easily do the same thing using git?” For my answer, I mainly use the “regret number three” of the great answer of Matt above because I also think that the initial question is about “what do I do if I have regret when using git?”. At the beginning, the situation is like that:

a b c d(主)

第一个要点是创建一个新分支:git分支mynewbranch。然后一个得到:

(master和mynewbranch)

让我们假设现在有人想要回到A(前3次提交)。第二个要点是使用git reset命令——即使人们可以在网上读到这是危险的,也很难。是的,这很危险,但仅适用于未提交的更改。因此,这样做的方法是:

Git重置——commita的硬数字

or

Git复位-硬主~3

那么就得到: A (master) - B - C - D (mynewbranch)

Then, it’s possible to continue working and commit from A (master) but still can get an easy access to the other versions by checking out on the other branch: git checkout mynewbranch. Now, let’s imagine that one forgot to create a new branch before the command git reset --hard. Is the commit B, C, D are lost? No, but there are not stored in any branches. To find them again, one may use the command : git reflog that is consider as “a safety command”( “in case of trouble, keep calm and use git reflog”). This command will list all commits even those that not belong to any branches. Thus, it’s a convenient way to find the commit B, C or D.

mkarasek的回答很好,简单来说,我们可以说……

git reset——soft:将HEAD设置为预期的提交,但保持从上次提交开始的更改 Git重置-混合:它和Git重置一样-软,但唯一的区别是它从上次提交中UN stage你的更改 git reset——hard:在你指定的提交上设置HEAD,并重置你从上次提交的所有更改,包括未提交的更改。

——soft和——mixed有点相似,唯一的区别是,如果你想在暂存区中保留你的更改,使用——soft,如果你不想在暂存区中更改,使用——mixed。

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

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

总而言之:

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