为什么‘git’能赚钱。原产地/船长:船长`休假阶段性变更?

为什么‘git’能赚钱。原产地/船长:船长`休假阶段性变更?,git,git-fetch,Git,Git Fetch,我想知道为什么下面的叶子会有变化: git reset——硬主控~4#在下一个命令的位置重置 #从该存储库获取。。。src:起点/终点:终点 git fetch——更新头ok。原产地/船长:船长 git status#->显示各种暂存文件? 分支master似乎与origin/master同步。 但是:现在我在master上有各种暂存文件?。 为什么会有这样的行为?我以为是git fetch。origin/master:master将我的本地分支机构负责人更新为origin/master中的负

我想知道为什么下面的叶子会有变化:

git reset——硬主控~4#在下一个命令的位置重置
#从该存储库获取。。。src:起点/终点:终点
git fetch——更新头ok。原产地/船长:船长
git status#->显示各种暂存文件?
分支
master
似乎与
origin/master
同步。 但是:现在我在
master
上有各种暂存文件?。 为什么会有这样的行为?我以为是git fetch。origin/master:master将我的本地分支机构负责人更新为
origin/master
中的负责人。显然,它做得更多?但具体是什么?

手册页提到:

默认情况下,
git fetch
拒绝更新与当前分支对应的头

此标志将禁用检查。
这纯粹是为了git pull与git fetch通信的内部使用,除非您实现自己的瓷器,否则不应该使用它

因此:

  • 您已将索引重置为
    master~4
  • 然后,您将
    master
    重置为
    origin/master
    (这不是
    master~4
    ,而是其他提交)
Git向您显示索引中的内容,但不在HEAD中:这些是已暂存的文件(由于第一次重置),而不在HEAD中(指
origin/master

如果您的目标是将主机重置为原点/主机,请执行以下操作:

git fetch
git switch -C master origin/master

为了正确理解为什么这会导致文件“为提交而暂存”,您需要理解并记住Git的以下十个方面:

  • 这是最重要的

  • 所有提交事实上,所有类型的内部Git对象都是严格只读的

  • 分支名称和其他名称只会帮助您(和Git)找到提交

  • 其工作方式是每个提交都有一个唯一的数字:一个大的、丑陋的、看起来随机的散列ID,让Git在一个包含所有Git对象(包括提交对象和其他支持对象)的大数据库中查找提交对象。名称分支名称、远程跟踪名称、标记名称或任何其他名称包含一个哈希ID

  • 提交自己可以找到较早的提交。每次提交都会保存一些以前的提交哈希ID。大多数提交只有一个哈希ID;我们称之为提交的父级。例如,
    git log
    就是这样工作的:我们使用分支名称查找最后一次提交。分支名称的哈希ID导致名称“指向”提交。提交父项的哈希ID使提交向后指向其父项。它的父级也有一个哈希ID,它指向后面的另一个步骤,依此类推

  • 控制哪个分支名称是当前分支名称的是特殊名称
    HEAD
    。这通常“附加到”分支名称。如果在没有分支名称或其他起点的情况下运行
    git log
    ,git将使用
    HEAD
    查找当前分支,然后使用分支名称查找最后一次提交

  • 因此,当前分支名称决定了当前提交

  • 每个提交保存每个文件的快照。因为这是由内部Git对象组成的(这些对象是只读的,格式是其他程序无法读取的),Git必须先将这些文件提取到工作区,然后才能使用或更改它们。此工作区域称为您的工作树或工作树。因此,实际上每个文件都有两个副本:当前提交中的提交副本(只读和Git只读)和可用副本(读/写和普通可用文件)

  • Git不会根据现有提交或工作树中的内容进行新提交。相反,它拥有每个文件的第三份副本。此副本是内部Git格式的,是预先消除重复的,因此如果您没有实际修改任何内容,并且
    Git添加了它,那么第三个“副本”实际上只是共享提交的副本。(提交本身也共享这些消除重复的“副本”,这是非常安全的,因为它们都是严格只读的。)

  • git fetch所做的事情

  • 考虑到以上所有内容,让我们看看
    git fetch
    现在做了什么(以及为什么需要
    --updatehead ok
    标志)。特别是如果你是一名视觉学习者,画一些Git提交工作原理的图表也可能会有所帮助,所以我们将从这开始

    一连串的犯罪 首先,我们有一系列的提交,每个提交都有自己丑陋的哈希ID。我们不想处理真正的哈希ID,所以我们将使用一个大写字母代替哈希ID。这个链中的最后一个提交有一些散列ID,我们称之为
    H
    。我们使用分支名称查找此名称,并将特殊名称
    HEAD
    附加到分支名称:

                <-H   <--branch (HEAD)
    
              I   <-- br1 (HEAD)
             /
    ...--G--H   <-- main
    
    当然,commit
    G
    指向更早的提交:

    ... <-F <-G <-H   <--branch (HEAD)
    
    当前提交仍然是commit
    H
    ,我们将
    HEAD
    移动到新名称
    br1
    。然后我们做一个新的提交,我们称之为
    I
    I
    将指向
    H
    ,因为我们使用commit
    H
    作为当前提交进行了新的提交
    I
    。因此,Git将
    I
    的哈希ID写入名称
    br1
    ,并将
    HEAD
    附加到该名称中:

                <-H   <--branch (HEAD)
    
              I   <-- br1 (HEAD)
             /
    ...--G--H   <-- main
    
    从这里,我们创建另一个分支名称,如
    br2
    ,将
    HEAD
    附加到它(这次继续提交
    H
    ),并进行新的提交,以进入最终设置

    索引/暂存区域/缓存 请注意,每个文件的第三个副本将如何匹配我们签出的任何提交。这是因为当我们移动电流时,Git小心地协调它
              I   <-- br1 (HEAD)
             /
    ...--G--H   <-- main
    
              I--J   <-- br1
             /
    ...--G--H   <-- main (HEAD)