从提交id创建git分支后,某些git提交丢失

从提交id创建git分支后,某些git提交丢失,git,github,git-branch,Git,Github,Git Branch,我正在从提交id创建git分支,我的期望是在创建新分支时,它应该在指定的提交id之后显示提交id。但是在新创建的git分支中,很少有git提交丢失 我有一个具有多个提交id的主分支: 我使用git checkout-b testBranch 3331a4b命令从主分支创建了一个新分支 但是当在这个分支上使用firegit log--oneline命令时,我可以看到一些提交ID丢失了。请点击下面的链接检查提交id testBranch提交ID: 缺少主分支的提交ID: 旁注:屏幕截图通常是个坏

我正在从提交id创建git分支,我的期望是在创建新分支时,它应该在指定的提交id之后显示提交id。但是在新创建的git分支中,很少有git提交丢失

我有一个具有多个提交id的主分支:

我使用
git checkout-b testBranch 3331a4b
命令从主分支创建了一个新分支

但是当在这个分支上使用fire
git log--oneline
命令时,我可以看到一些提交ID丢失了。请点击下面的链接检查提交id

testBranch提交ID:

缺少主分支的提交ID:

旁注:屏幕截图通常是个坏主意,因为它们使搜索和引用变得困难

这里的问题是,虽然git log--oneline显示提交的线性列表,但提交实际上并不是线性的。考虑到一些明显的线性提交序列,您希望:

010 final
009 earlier
008 earlier-still
007 ...
...
001 first
从010开始向后计数会得到10次提交,而从009开始向后计数会得到9次提交

如果提交是线性的,那么这是正确的,但事实并非如此

当然,实际的数字不是顺序的,也不是十进制的。它们是散列ID,如
3331a4b
(它已经是以
3331a4b
开头的更长数字的缩写)。所以你已经知道你不能仅仅把这个数字作为一个简单的索引。让我们用单个大写字母
A
B
替换序列号(001到010)或散列ID(
3331a4b
等等)
H
,并实际绘制一个包含十次提交的小存储库中的提交,最后一次提交是合并提交:

知道提交之间的内部链接是向后箭头。(为了不需要不断更改提交,箭头本身嵌入到孩子体内,指向他们的父母提交,提交内的任何内容都无法移动或更改;提交的所有内容都是永久固定的。孩子出生时,孩子们知道他们的父母是谁,但直到孩子出生,t他的父母不知道他们的孩子会是谁,所以他们不能指向孩子。)

这里棘手的部分是,像
master
develope
这样的名称确实在移动:名称
master
是通过
git merge
命令到达这里的,可能通过
git pull
运行,或者直接由某人运行,或者通过GitHub的“merge pull request”按钮或类似按钮运行。在前面的某个时刻,该图形如下所示:

A--B--C--D   <-- master
       \
        E--F--G   <-- develop
D
可以从
H
master
,目前)访问这一事实并不意味着可以从
testBranch
访问
D

在更复杂的图中,从某个分支尖端开始并向后工作的提交集可能更难看到:图变得混乱,难以查看或可视化。不过,在这里使用
git log--graph
(带或不带
--oneline
)还是有帮助的

git log如何将非线性图线性化 由于
git log
必须一次显示一个提交,每行显示一个
--oneline
,或者使用多个没有提交的输出行,因此需要一个挂起提交队列。此队列通常以您的名字开始:

$ git log <hash>
(假设名称
master
develope
指向两个不同的提交(可能有两个分支名称指向同一个提交),队列将以多个提交开始,因此队列中的提交顺序同样重要。Git将首先显示队列提交的前端,无论是
master
名称的提交,还是
developer
名称的提交。显示了提交后,Git将在适当的情况下将其父级插入队列,然后才有机会在命令行上显示您指定的另一个提交,具体取决于另一个提交现在在队列中的位置


队列插入顺序的默认值是提交时间戳,较新的(稍后的时间戳)提交将位于队列的前面。您可以在一定程度上使用
--日期顺序
--作者日期顺序
--拓扑顺序
,以及
--反向
来控制此顺序。使用
--graph
强制
--topo-order
。有关详细信息,请参阅。

闻起来好像丢失的提交位于不同的分支上。尝试
git log--oneline--graph--all
来确认(或反驳)我的怀疑。
A--B--C--D   <-- master
       \
        E--F--G   <-- develop
A--B--C--D------H   <-- master
       \       /
        E--F--G   <-- develop
            .
             .....<-- testBranch
$ git log <hash>
$ git log <branchname>
$ git log master develop