Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.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 h_Git_Github - Fatal编程技术网

Git h

Git h,git,github,Git,Github,这些工作包括提取提交,以及设置头部。为了在Git中完成任何工作,我们必须提取一个提交。让我们看看为什么会这样 提交 Git提交是真实的、有形的东西。要访问Git中的提交,我们必须告诉Git它的真实名称。但提交的真实名称是一个大而难看的随机散列ID,例如。人类没有办法记住这些东西。幸运的是,我们不必这样做;但我们马上就要开始了。首先,让我们看看这些东西里面有什么 Git提交由两部分组成: 有一个Git知道的所有文件的快照,在您或其他人提交时。此快照是完全、完全只读的,其中存储的文件是一种特殊的、

这些工作包括提取提交,以及设置头部。为了在Git中完成任何工作,我们必须提取一个提交。让我们看看为什么会这样

提交 Git提交是真实的、有形的东西。要访问Git中的提交,我们必须告诉Git它的真实名称。但提交的真实名称是一个大而难看的随机散列ID,例如。人类没有办法记住这些东西。幸运的是,我们不必这样做;但我们马上就要开始了。首先,让我们看看这些东西里面有什么

Git提交由两部分组成:

  • 有一个Git知道的所有文件的快照,在您或其他人提交时。此快照是完全、完全只读的,其中存储的文件是一种特殊的、只读的、仅Git的、压缩的和重复数据消除的格式,只有Git本身可以使用

  • 除了快照之外,每个提交的主数据还包含一些元数据,或者关于提交本身的信息。元数据包括提交人的姓名和电子邮件地址、提交日期和时间等

Git在每次提交的元数据中插入的一个关键信息是前一次提交的原始散列ID,在某些情况下,是前一次提交的多个散列ID。这就是Git存储历史的方式。最新提交中包含下一次最新提交的哈希ID。该提交中包含了先前提交的哈希ID。这是重复的,因此在一个简单的线性提交链的情况下,我们可以这样画:

... <-F <-G <-H
在这里,我们展示了六个提交,在提交之前可能还有更多的提交
G
——其中每个提交都指向前一个提交:提交
J
,这是
注册的最新版本,指向后一个提交
I
。提交
I
向后指提交
H
。(连接行确实应该有向后的箭头,但我不能在StackOverflow上很好地绘制这些箭头。)提交
L
指向
K
,这也指向
H
。Commit
H
指向
G
,它指向可能存在的任何其他对象

Git一个有趣的特性是
master
上的提交也在其他两个分支上。Git说,如果从分支名称和它选择的提交开始,我们可以向后查找其他提交,那么提交就“在”某个分支上

我们还可以有多个分支名称指向一个特定的提交。例如,在此存储库或其他存储库中,我们可以:

...--P--Q   <-- br1, br2, br3
当像这样将
HEAD
附加到
master
时,
git branch
在名称
master
旁边显示一个星号,以注意我们当前正在使用名称
master
来查找哈希ID为
H
的提交

每当我们进行新的提交时,Git都会将提交本身及其元数据作为快照,以便新的提交指向当前提交,就像使用名称
HEAD
找到的那样。新提交得到一个新的、唯一的、大而丑陋的散列ID。Git立即将新的散列ID存储在当前分支名称中。因此,如果我们具备上述条件,并进行新的提交
N
,我们将得到:

          I--J   <-- signup
         /
...--G--H--N   <-- master (HEAD)
         \
          K--L   <-- Relayout
正如我们前面提到的,你会得到一个“超脱的脑袋”。这是因为,就像分支名称一样,远程跟踪名称指向一个提交,但与分支名称不同,Git不允许将特殊名称
附加到远程跟踪名称,而
OriginalRepo/master
就是其中之一

那么,假设我们有,比如说:

...--G   <-- OriginalRepo/master
      \
       H   <-- master (HEAD)
在这种分离头模式中,我们提取了提交。我们甚至可以像以前一样进行新的提交
N
,但如果我们这样做,特殊名称
HEAD
将直接更新:

       N   <-- HEAD
      /
...--G   <-- OriginalRepo/master
      \
       H   <-- master
提交
N
仍然存在。它仍然在您的存储库中!但它没有名字。唯一有效的名称是原始散列ID。你在什么地方写下了吗

解决这个难题的办法是添加一个分支名称 如果我们正在提交
N
,完成后,我们可以立即添加一个新的分支名称:

我们所做的任何新提交都将更新名称
xyzy

或者,如果我们还没有提交
N
,只有以下内容:

...--G   <-- OriginalRepo/master
      \
       H   <-- master (HEAD)
或者我们可以将其缩短为:

git checkout -b --no-track xyzzy OriginalRepo/master
你可能会说:等等,这是什么?
——没有音轨?现在还不清楚你是否应该使用它,但也许你不应该使用它。我把它放进去是因为这使得
git checkout-b
的作用与三个命令变量完全相同,
git checkout
(用于分离的头部),然后是
git分支
,然后是
git checkout
(用于连接头部)。这让我们陷入了最后一条皱纹

分支有上游 在Git中,每个分支名称可以有一个上游集。分支的上游设置并不重要。事实上,您可以拥有没有任何上游的分支。设置上游的目的是为了方便一些事情

上游设置的东西还有另一个名字。这是一个糟糕的名字,但它出现在Git中是因为有
--track
--no track
选项。这种方法的坏名称是调用具有上游集的分支,即跟踪分支

这是一个可怕的名字,有很多原因。我认为,最重要的一点是Git有跟踪文件与未跟踪文件的概念,这与分支上游设置完全不同。还有那些远程跟踪名称(或者“远程跟踪分支名称”,如果您更喜欢Git术语),它们也不同于上游。所以让我们用新的术语,上游,来谈论分支的上游

通常,分支名称的上游
...--G   <-- OriginalRepo/master
      \
       H   <-- master (HEAD)
...--G   <-- OriginalRepo/master, HEAD
      \
       H   <-- master
       N   <-- HEAD
      /
...--G   <-- OriginalRepo/master
      \
       H   <-- master
       N   ???
      /
...--G   <-- OriginalRepo/master
      \
       H   <-- master (HEAD)
       N   <-- xyzzy, HEAD
      /
...--G   <-- OriginalRepo/master
      \
       H   <-- master
       N   <-- xyzzy (HEAD)
      /
...--G   <-- OriginalRepo/master
      \
       H   <-- master
...--G   <-- OriginalRepo/master
      \
       H   <-- master (HEAD)
git checkout OriginalRepo/master
git branch xyzzy
git checkout xyzzy
git checkout -b --no-track xyzzy OriginalRepo/master
git branch --set-upstream-to=OriginalRepo/master xyzzy
git branch --unset-upstream xyzzy
git checkout -b xyzzy --track OriginalRepo/master