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

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

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

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


当前回答

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

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

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

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

其他回答

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

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

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

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

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

-混合vs -软vs -硬:

--mixed:

   Delete changes from the local repository and staging area.

   It won't touch the working directory.

   Possible to revert back changes by using the following commands.

     - git add

     - git commit

   Working tree won't be clean.

--soft:

    Deleted changes only from the local repository.

    It won't touch the staging area and working directory.

    Possible to revert back changes by using the following command.

     - git commit.

    Working tree won't be clean

--hard:

    Deleted changes from everywhere.

    Not possible to revert changes.

    The working tree will be clean.

注意:如果提交被确认到本地存储库并放弃这些提交,我们可以使用:

 `git reset command`.

但是如果提交被确认到远程存储库,那么不建议使用reset命令,我们必须使用revert命令来丢弃远程提交。

当您在存储库中修改一个文件时,更改最初是暂不执行的。为了提交它,你必须使用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.


最后,一个可视化图:

后悔的三种类型

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

在给出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从未发生过。)