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

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

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

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


当前回答

在研究这三个选项之前,我们必须了解三件事。

1) 历史/头部

2)阶段/索引

3)工作目录

reset——soft:历史记录已更改,HEAD已更改,工作目录未更改。

reset——mixed:历史记录已更改,HEAD已更改,工作目录已更改。

reset——hard:历史记录更改,HEAD更改,工作目录更改,数据丢失。

使用Git总是安全的——软的。在复杂的需求中应该使用其他选项。

其他回答

这里有许多关于git重置的误解的答案——软。虽然在特定的条件下git会重置——soft只会改变HEAD(从分离的HEAD状态开始),通常(对于预期的用途),它会移动您当前签出的分支引用。当然,如果你没有签出分支,它就不能这样做(因此git重置的特定条件-soft只会改变HEAD)。

我发现这是考虑git重置的最佳方式。你不只是移动HEAD(所有事情都是这样),你也移动了分支引用,例如master。这类似于运行git commit(当前分支与HEAD一起移动)所发生的情况,只是您没有创建(并移动到)一个新的提交,而是移动到先前的提交。

这是重置的重点,将分支更改为新提交以外的内容,而不是更改HEAD。你可以在文档示例中看到:

撤销提交,使其成为主题分支 $ git分支主题/wip (1) $ git重置-硬头~3 (2) $ git结帐主题/wip (3) 您已经提交了一些文件,但是意识到它们还不适合放在“主”分支中。你想在topic分支中继续打磨它们,所以在当前HEAD的基础上创建“topic/wip”分支。 倒回主分支以摆脱这三个提交。 切换到“topic/wip”分支并继续工作。

这一系列命令的意义是什么?你想移动一个分支,master,当你签出master时,你运行git reset。

这里投票最多的答案一般都很好,但我想我应该加上这个来纠正几个有误解的答案。

改变你的分支

Git reset——soft <ref>:重置当前检出分支的分支指针到指定引用处的提交,<ref>。工作目录和索引中的文件不会被更改。从这个阶段提交将把你带回到git reset命令之前的状态。

改变你的索引

Git重置——mixed <ref>

或者同样的

Git重置<ref>:

做什么——soft做AND还重置索引以匹配指定引用的提交。虽然git reset——soft HEAD什么都不做(因为它说将检出的分支移动到检出的分支),但git reset——mixed HEAD,或等价于git reset HEAD,是一个常见且有用的命令,因为它将索引重置为上次提交的状态。

也要更改工作目录

git reset——hard <ref>: does what——mixed does AND也覆盖你的工作目录。这个命令类似于git checkout <ref>,除了(这是关于重置的关键点)所有形式的git重置移动ref HEAD指向的分支。

关于“某某命令移动HEAD”的注释:

说命令移动HEAD是没有用的。任何改变您在提交历史中的位置的命令都会移动HEAD。这就是HEAD,一个指向你所在位置的指针。head就是你,所以无论你做什么,它都会移动。

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

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

给定:- 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的变化在任何地方(将好像他们从来没有存在过)

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

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

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

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

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

-混合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命令来丢弃远程提交。