git中的Reset命令
我知道重置命令包含3个选项-git中的Reset命令,git,git-reset,Git,Git Reset,我知道重置命令包含3个选项- 硬-将工作目录中的文件更改为特定的提交id 混合(默认)-未提交和取消阶段文件 soft-仅用于取消提交文件 我知道uncomomit-移动头部和关联的分支指针,实际上并不修改提交树,但我不确定这意味着什么?移动我们的头有什么意义?基本上,git reset命令做了太多不同的事情,甚至不应该存在。(这当然只是我的观点。它确实需要存在,但可能应该由几个不同的管道命令组成,加上至少三个或四个构建在上面的瓷命令。实际上有几个瓷命令,例如运行git reset的git me
我知道uncomomit-移动头部和关联的分支指针,实际上并不修改提交树,但我不确定这意味着什么?移动我们的头有什么意义?基本上,
git reset
命令做了太多不同的事情,甚至不应该存在。(这当然只是我的观点。它确实需要存在,但可能应该由几个不同的管道命令组成,加上至少三个或四个构建在上面的瓷命令。实际上有几个瓷命令,例如运行git reset
的git merge--abort
矿石)
不幸的是,git reset
确实存在,因为它可以做很多不同的事情,所以它也非常有用。虽然有用,但至少有潜在的破坏性。这是一个命令,但它的刀片无法关闭,并且带有破伤风,你需要学会如何小心地握住它,这样你就不会一直刺伤自己的手,然后死于其他疾病
在其更基本的形式中,git reset
所做的是写入git存储库中的一个、两个或三个项目。要理解这一点,您必须首先了解提交和分支的工作方式、Git哈希ID的功能、头的角色、索引和工作树。让我们从散列ID开始
散列ID
在Git中,哈希ID如下所示:b5101f929789889c2e536d915698f58d5c5c6b7a
。这是一大串丑陋的字母和数字。但它实际上是一些数据的校验和,特别是加密校验和。这意味着:
- 它看起来是随机的,你猜不到它会是什么李>
- 它取决于它的输入数据,因此改变数据中任何一位,或数据中位或字节的顺序都会改变它;然而
- 宇宙中的每个人都可以对相同的数据进行相同的数学计算,得到相同的散列ID
H
的提交:
<-H
好的,G
中的一个内容是其父级的hash ID,F
。因此,我们要确保我们也有F
,它还有另一个散列IDE
,它有一个散列IDD
,以此类推,一直追溯到我们在存储库中进行的第一次提交,我们称其为a
:
A <-B <-C <-D <-E <-F <-G <-H
所有内部箭头都严格向后。我们必须从H
开始反向工作。如果我们从,比如说,D
,我们可以返回到C
,然后是B
和A
,但我们实际上不能前进到E
分支机构、分支机构名称和HEAD
Git中的所有分支名称都是一个人类可读的名称,其中包含一个单独的散列ID。该名称包含的散列ID是该分支中最后一次提交的散列ID
因此,通过上面的提交A
到H
,我们可以有一个或多个分支名称指向八个提交中的任何一个。让我们来画一些:
A--B--C--D--E--F <-- master
\
G--H <-- develop
现在我们有了这张图:
A--B--C--D--E--F <-- master, feature (HEAD)
\
G--H <-- develop
也就是说,我们的新提交I
指向F
,而名称功能现在指向新提交I
。从I
,我们可以找到F
;从F
我们可以找到E
,依此类推。我们不能用这种方式到达G
或H
。提交G
和H
仅在master
上。提交I
仅在功能上。提交A
-F
在所有三个分支上
请注意,特殊名称标题仍在附件中
A--B--C--D--E--F <-- master
\
G--H <-- develop
git checkout master
git checkout -b feature
A--B--C--D--E--F <-- master, feature (HEAD)
\
G--H <-- develop
I <-- feature (HEAD)
/
A--B--C--D--E--F <-- master
\
G--H <-- develop
git show HEAD:README.md # view the frozen current-commit copy
git show :README.md # view the index copy
git checkout master
git checkout -b feature
... do some work ...
... run `git add` on our changed files ...
git commit
git reset --hard b5101f929789889c2e536d915698f58d5c5c6b7a
git reset --hard master
git reset --hard HEAD~1
git reset --soft master
I ???
/
A--B--C--D--E--F <-- master, feature (HEAD)
\
G--H <-- develop
git reset --soft <hash-ID-of-I>
git reset --soft feature@{1}
git reset --soft
I <-- feature (HEAD)
/
A--B--C--D--E--F <-- master
\
G--H <-- develop
git reset --mixed HEAD