我看过一些有趣的帖子,解释git重置的微妙之处。

不幸的是,我读得越多,就越觉得我并没有完全理解它。我有SVN的背景,Git是一个全新的范例。我很容易得到mercurial,但是Git的技术含量更高。

我认为git重置接近hg恢复,但似乎有区别。

git重置到底是做什么的?请详细说明:

选项——硬、软和合并; 你对HEAD使用的奇怪符号,如HEAD^和HEAD~1; 具体的用例和工作流程; 对工作副本、HEAD和整体压力水平的影响。


当前回答

签出将头部指向特定的提交。

重置在特定提交时指向一个分支。(分支是指向提交的指针。)

顺便说一句,如果你的头没有指向分支也指向的提交,那么你就有了一个分离的头。(结果证明是错的。看到评论…)

其他回答

博士TL;

git reset重置Staging到最后一次提交。使用——很难将工作目录中的文件重置到最后一次提交。

完整版

但这显然过于简单,因此会有许多相当啰嗦的答案。对我来说,在撤销更改的上下文中阅读git重置更有意义。请看这个:

如果git恢复是一种“安全”的方法来撤销更改,您可以考虑git 复位为危险方法。当你撤销与git重置(和 提交不再被任何ref或reflog引用),有 无法检索原始副本—这是永久撤销。护理必须 在使用这个工具的时候,你可能会遇到这样的问题,因为它是唯一一个有可能丢失你的工作的Git命令。

从https://www.atlassian.com/git/tutorials/undoing-changes/git-reset

在提交级别,重置是一种将分支的尖端移动到不同提交的方法。这可用于从当前分支删除提交。

从https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting/commit-level-operations

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

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


适用于开启彩色终端机的用户 (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的变化在任何地方(将好像他们从来没有存在过)

当你向git提交一些东西时,你首先必须stage(添加到索引中)你的更改。这意味着在git认为这些文件是提交的一部分之前,你必须在git中添加所有你想要包含在这个提交中的文件。让我们先看一下git回购的图像:

现在很简单了。我们必须工作在工作目录,创建文件,目录和所有。这些更改是未跟踪的更改。为了跟踪它们,我们需要使用git add命令将它们添加到git索引中。一旦它们被添加到git索引。我们现在可以提交这些更改,如果我们想把它推到git存储库。

但在提交时,我们突然意识到,我们在索引中添加的一个额外文件不需要推入git存储库。这意味着我们不希望这个文件出现在索引中。 现在的问题是如何从git索引中删除该文件,因为我们使用git添加把它们放在索引中,使用git rm是合乎逻辑的?错了!Git rm将简单地删除文件并将删除添加到索引中。那么现在该怎么做呢:

使用:

去重置

它清除你的索引,保持你的工作目录不变。(简单地取消所有内容)。

它可以使用与它的数量选项。 git重置有三个主要选项:——hard,——soft和——mixed。除了重置时的HEAD指针外,这些还会影响get重置的内容。

首先,硬重置一切。如果您一直在跟踪该分支,那么当前目录将完全相同。工作目录和索引将更改为该提交。这是我最常用的版本。Git重置——很难像SVN恢复。

接下来,完全相反的-soft不会重置工作树或索引。它只移动HEAD指针。这将使您的当前状态与您要切换到的目录中的提交不同,并且“阶段性”提交。如果你在本地进行了一次提交,但还没有将提交推到git服务器,你可以重置到上一次提交,并使用一个好的提交消息重新进行一次提交。

最后,——mixed重置索引,但不重置工作树。所以这些更改仍然存在,但是是“非分期的”,需要git add 'ed或git commit -a。我们有时会使用这个,如果我们提交了比git commit -a更多的东西,我们可以用git reset -mixed返回提交,添加我们想要提交的东西,然后只提交那些。

git revert和git reset的区别:-


简单来说,git reset是一个“修复未提交的错误”的命令,git revert是一个“修复已提交的错误”的命令。

这意味着如果我们在某些更改中犯了一些错误,并提交了相同的更改并将其推给了git repo,那么git revert就是解决方案。如果我们在推送/提交之前发现了同样的错误,我们可以使用git reset来修复这个问题。

我希望它能帮助你摆脱困惑。

签出将头部指向特定的提交。

重置在特定提交时指向一个分支。(分支是指向提交的指针。)

顺便说一句,如果你的头没有指向分支也指向的提交,那么你就有了一个分离的头。(结果证明是错的。看到评论…)

博客Pro Git中的Reset Demystified给出了一个关于Git重置和Git checkout的非常简单的解释。

在那篇文章的顶部进行了有益的讨论之后,作者将这些规则简化为以下简单的三步:

基本上就是这样。reset命令以特定顺序覆盖这三棵树,当您命令它停止时停止。 移动HEAD指向的分支(如果—软) 然后,让索引看起来像这样(停止在这里,除非——很难) 然后,让工作目录看起来像这样 还有“合并”和“保留”选项,但我现在宁愿让事情简单一些——这将是另一篇文章。