Git h
这些工作包括提取提交,以及设置头部。为了在Git中完成任何工作,我们必须提取一个提交。让我们看看为什么会这样 提交 Git提交是真实的、有形的东西。要访问Git中的提交,我们必须告诉Git它的真实名称。但提交的真实名称是一个大而难看的随机散列ID,例如。人类没有办法记住这些东西。幸运的是,我们不必这样做;但我们马上就要开始了。首先,让我们看看这些东西里面有什么 Git提交由两部分组成:Git h,git,github,Git,Github,这些工作包括提取提交,以及设置头部。为了在Git中完成任何工作,我们必须提取一个提交。让我们看看为什么会这样 提交 Git提交是真实的、有形的东西。要访问Git中的提交,我们必须告诉Git它的真实名称。但提交的真实名称是一个大而难看的随机散列ID,例如。人类没有办法记住这些东西。幸运的是,我们不必这样做;但我们马上就要开始了。首先,让我们看看这些东西里面有什么 Git提交由两部分组成: 有一个Git知道的所有文件的快照,在您或其他人提交时。此快照是完全、完全只读的,其中存储的文件是一种特殊的、
- 有一个Git知道的所有文件的快照,在您或其他人提交时。此快照是完全、完全只读的,其中存储的文件是一种特殊的、只读的、仅Git的、压缩的和重复数据消除的格式,只有Git本身可以使用
- 除了快照之外,每个提交的主数据还包含一些元数据,或者关于提交本身的信息。元数据包括提交人的姓名和电子邮件地址、提交日期和时间等
... <-F <-G <-H
在这里,我们展示了六个提交,在提交之前可能还有更多的提交G
——其中每个提交都指向前一个提交:提交J
,这是注册的最新版本,指向后一个提交I
。提交I
向后指提交H
。(连接行确实应该有向后的箭头,但我不能在StackOverflow上很好地绘制这些箭头。)提交L
指向K
,这也指向H
。CommitH
指向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