Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git中的Reset命令_Git_Git Reset - Fatal编程技术网

git中的Reset命令

git中的Reset命令,git,git-reset,Git,Git Reset,我知道重置命令包含3个选项- 硬-将工作目录中的文件更改为特定的提交id 混合(默认)-未提交和取消阶段文件 soft-仅用于取消提交文件 我知道uncomomit-移动头部和关联的分支指针,实际上并不修改提交树,但我不确定这意味着什么?移动我们的头有什么意义?基本上,git reset命令做了太多不同的事情,甚至不应该存在。(这当然只是我的观点。它确实需要存在,但可能应该由几个不同的管道命令组成,加上至少三个或四个构建在上面的瓷命令。实际上有几个瓷命令,例如运行git reset的git me

我知道重置命令包含3个选项-

  • 硬-将工作目录中的文件更改为特定的提交id

  • 混合(默认)-未提交和取消阶段文件

  • soft-仅用于取消提交文件


  • 我知道uncomomit-移动头部和关联的分支指针,实际上并不修改提交树,但我不确定这意味着什么?移动我们的头有什么意义?

    基本上,
    git reset
    命令做了太多不同的事情,甚至不应该存在。(这当然只是我的观点。它确实需要存在,但可能应该由几个不同的管道命令组成,加上至少三个或四个构建在上面的瓷命令。实际上有几个瓷命令,例如运行
    git reset
    git merge--abort
    矿石)

    不幸的是,
    git reset
    确实存在,因为它可以做很多不同的事情,所以它也非常有用。虽然有用,但至少有潜在的破坏性。这是一个命令,但它的刀片无法关闭,并且带有破伤风,你需要学会如何小心地握住它,这样你就不会一直刺伤自己的手,然后死于其他疾病

    在其更基本的形式中,
    git reset
    所做的是写入git存储库中的一个、两个或三个项目。要理解这一点,您必须首先了解提交和分支的工作方式、Git哈希ID的功能、头的角色、索引和工作树。让我们从散列ID开始

    散列ID 在Git中,哈希ID如下所示:
    b5101f929789889c2e536d915698f58d5c5c6b7a
    。这是一大串丑陋的字母和数字。但它实际上是一些数据的校验和,特别是加密校验和。这意味着:

    • 它看起来是随机的,你猜不到它会是什么
    • 它取决于它的输入数据,因此改变数据中任何一位,或数据中位或字节的顺序都会改变它;然而
    • 宇宙中的每个人都可以对相同的数据进行相同的数学计算,得到相同的散列ID
    此哈希过程用于获取任何冻结的数据,例如文件内容,并将其转换为该数据哈希ID的唯一名称。该ID将成为冻结数据的简写名称。如果我给你散列ID,你可以检查你是否有数据。如果我只给你数据,你可以计算散列ID。如果我给你散列ID和数据,你可以自己检查我是否在散列ID上撒了谎,或者给了你正确的一对

    实际上,这意味着任何两个Git都可以聚在一起进行简短的对话:您有ID X吗?Y和Z呢?如果一个Git缺少其中一个ID,另一个Git可以给它数据,现在它既有hash ID又有数据。如果两个Git都拥有所有ID,那么它们就拥有所有数据。因此,两个git可以非常快速地相互同步,发送方将发送方拥有而接收方没有的任何东西都提供给接收方

    这本身已经有些有用了,但是当我们将它与提交结合起来时,它变得非常有用

    提交 在Git中,提交是一个只读实体,它保存所有文件的快照,并将其作为快照保存,而不是作为对它们的一组更改和一些元数据保存。元数据是关于提交的有用信息:例如,它有提交人的姓名和电子邮件地址,还有一个时间戳。它还具有一个或多个父提交的每个哈希ID

    因为这是只读数据,因为它无法更改,所以我们可以计算此提交的哈希ID。现在,此提交永远是具有此哈希ID的提交。它的任何数据都不能更改:我们有唯一标识此数据的哈希ID,并且没有其他数据可以使用此哈希ID进行任何操作。(有关对此的明显反对意见,请参见)

    但是,因为此提交包含其父提交的哈希ID作为其数据的一部分,所以我们需要做的就是确保我们拥有此链中的每个提交。例如,我们有一个哈希ID为
    H
    的提交:

                              <-H
    
    好的,
    G
    中的一个内容是其父级的hash ID,
    F
    。因此,我们要确保我们也有
    F
    ,它还有另一个散列ID
    E
    ,它有一个散列ID
    D
    ,以此类推,一直追溯到我们在存储库中进行的第一次提交,我们称其为
    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