Git重置如何工作?
想知道Git reset
选项如何工作?
在关于Envato Tuts +的一系列Git课程中 ,我通过简单的视频介绍了Git的一些基本概念。
在该系列的视频中,您将学习有关Git重置的所有信息。 您将看到如何使用每种重置以及这些变种如何与三棵Git树交互:
- soft :仅更改HEAD,但不更改索引文件或工作文件中的暂存文件。
- 混合 :移动HEAD并使用HEAD现在指向的修订内容更新索引。
- hard :移动HEAD并更新索引和工作目录-这是可能导致数据丢失的唯一版本的reset。
我还将向您展示如何在单个文件上使用git reset
。
Git基础知识:重置
Git重置如何工作
Git重置。 它有什么作用? 这是您撤消计算机本地某些更改的方式。 完成一些需要倒带的工作后,将其重置为您的朋友。 您可以重新开始。 您可以在各种提交的内容之间来回跳转,并花费一些时间。
您可以通过git reset使用一些选项。 您可以进行硬性,软性和混合性操作,还可以操作和保留提交对象或在单个文件级别执行操作。
这三个变体中的每一个都会影响git用来处理文件及其内容的特定树。
Git重置如何影响三棵树
隐喻地讲,每个reset选项都会改变一棵不同的树,这是git保存快照的不同部分。
树木,我们在这里谈论什么? Git使用工作目录,索引(也称为暂存区)和称为HEAD的东西来创建和检索提交。
工作目录使您可以更改可转入索引的文件。 该暂存区域使您可以微调并选择要放入下一次提交的内容。 提交对象是您内容的加密哈希版本。 它添加了一些元数据,并指向以前的提交,这使我们可以进行时间旅行。
HEAD是指向此类提交对象的引用。 它只是一个随分支的每个新提交或更改而更新的指针。 您可以移动它,并使用commit对象定位任何时间点。
解释了不同的重置选项
现在让我们看一下不同的选项。
Git重置-困难
这整个九码。 它将首先移动HEAD,并使用现在指向的HEAD的内容更新索引。 然后它将用索引的内容更新工作目录,从而可能破坏您在工作目录中更改的内容。
因此,如果您不知道自己在做什么,那么这是唯一的git reset版本会有些危险。
Git重置-混合
这将移动HEAD并使用HEAD未指向的所需提交的内容更新索引。 工作目录不受该操作的影响。
如果您不提供git reset选项,则默认为Mixed选项。 它始终是工作目录安全的,因此不必担心丢失您的工作。
Git重置--- soft
此选项只会移动HEAD并在此处停止。 实际上,这将撤消最后的git commit命令。
可能暂存的工作目录和文件仍不受该操作的影响。
使用文件路径
使用git reset的所有这些选项,您可以明确地告诉git从何处停止重放,倒回先前提交中的内容和文件,以指定要影响的树。 我们可以更进一步,并使用文件路径重置程序。
如果使用路径,Git将不会移动HEAD。 为什么? 因为HEAD指向提交对象,并且不能仅指向该对象的子集。 换句话说,HEAD并不指向特定文件,而是指向由块文件和一些元数据组成的对象。 另一方面,索引和工作目录可以按多种方式进行寻址。
使用路径时,只有索引和工作目录起作用。 它只是将文件的内容复制到索引中,而不能做其他事情。 git reset some-file.ext
假定默认情况下,您的意思是git reset --mixed HEAD some-file.ext
,不会影响工作目录。
顺便说一下,因为HEAD无法移动,所以soft选项将毫无意义。 假设您一直在处理文件的版本3,并将其添加到索引中以供下一个注释。 现在,您要取消这些更改。 运行git reset some-file.ext
取消git reset some-file.ext
该特定文件。
结果,索引将由版本2中文件的状态填充,该版本是HEAD指向的最后一次提交的版本。 您在文件(基本上是版本3)中所做的更改仍在工作目录中可用。 您仍然可以对这些文件的阶段3进行这些更改。
因此,使用git reset some-file.ext
实际上是只操作索引。
重置与结帐
git reset --hard some-file.ext
呢? 为什么我们也不能使用它呢?
此功能通过使用文件名的git checkout
来完成。 git checkout some-file.ext
实际上是git reset --hard some-file.ext
会做的,但是Git不允许我们使用hard选项。
让我们更进一步。 我们可以针对任何提交来重置特定文件,而不仅仅是HEAD代表的最新提交。 这会将索引中的目标文件重置为某个提交的状态,而又不会影响工作目录或任何提交。
将索引重置为某个提交的状态(进行向后更新)后,可以使用git checkout
和文件git checkout
索引的内容签出到工作目录中。
为什么要使用结帐? 因为git reset --hard
文件不是Git可以做的。
但小心点。 将git checkout
与文件路径一起使用将摆脱工作目录中的最新更改,并将其替换为该特定提交中的文件版本。
观看更多Git课程
如果您觉得这很有用,为什么不查看更多Git课程呢?
您可以观看我们的Git和GitHub简介,或尝试本系列的其他Coffee Break课程:
翻译自: https://code.tutsplus.com/tutorials/how-does-git-reset-work--cms-28410