当您运行git log
你告诉它承诺开始。如果你不告诉它,它假定当前从当前分支提交。它发现,它可以从出发点发现提交的其余部分。您的仓库提交8d6995e4
,但它不是在你的当前分支。
您可以使用git log --all
告诉它从所有记录的开始点(分支名称,标签名称,远程跟踪的名字,等等)开始,你可能想Get Help From A Dog,或OznOg suggested,使用一个可视化浏览器。参见Pretty git branch graphs。
要理解这是怎么回事,你需要了解的提交 - 这是Git的raison d'être和Git是如何找到他们,通常从分支名称开始。该进入的图形,这是在一个甚至更长和更彻底的方式在Think Like (a) Git解释了可达性的想法。
每个提交都有自己独特的哈希ID。这就是你在这里看到又大又丑的字符串,8d6995e4
(尽管实际上它是更长的时间,40显然是随机的垃圾字符,而不是真正随机的话)。散列ID是“真名”的承诺:这是Git是如何找到犯,在“所有提交过”(哪个人做的主要事情就是添加更多的提交)数据库。
每个提交还持有父提交哈希ID。也就是说,一些父母的孩子犯记得父母的哈希值。父母不记得自己的孩子,因为一旦提交制成,里面没什么东西可以永远改变。提交的该冷冻岬不要紧git log
但无论做许多其他Git命令。
以上是有点夸张,因为,至少一个承诺,在最前面的一个人,使一个新的,空的版本库,没有父。这个提交父是提交附带在此之前提交。第一次提交已没有提交自带之前。而且,合并的提交有多个父,这是什么使他们合并的提交。
这一切都意味着,承诺形成向后寻找链。正是这种倒退链中git log
使用。这里有一个仓库的只有三个提交,而不是大丑40个字符的散列的ID在哪里,我只用一个大写字母一个简单的绘图。很显然,我们会用完相当快库将满26次的提交,所以这不是混帐做它的方式,但它确实说明了这个问题就好了。我们的第一个承诺是A
,它没有父。然后,我们让B
它得到A
作为其母公司,也是最后一点,我们做C
它得到B
是其父母。
A <-B <-C
因为里面什么也没有提交都不能改变,我们可以得出倒着走,从孩子到父母为是双向的,只要我们记得,Git有往回走线的连接。这是我在StackOverflow的帖子更方便,因为我有时也需要做对角线:
A--B--C
\
D
我有一个在这里为大家工作,没有方便的文本箭头。
现在,git log
工作,你必须给它一个开始提交 - 哈希ID。事实上,在Git中很多东西的工作,你必须给他们一个哈希ID。但是,真正的哈希ID是大和丑陋(8d6995e4
)显然随机的。他们绝对不是一个明智的秩序,也没有办法为人类记住他们。所以我们要做的是,我们挑选出一个分支名称,如master
。我们的Git推最后的哈希ID提交到分支的名字,这意味着我们的图纸现在看起来是这样的:
A--B--C <-- master
这个名字让Git的找到最后一次提交的,在这种情况下C
。从那里,git log
散步向后B
,然后回到A
,然后因为A
没有父,混帐终于可以停下来。
要添加新的提交,Git会打包不管它是你所提交 - 一个新的快照,并添加元数据,如您的姓名和电子邮件地址,当前时间,和你的日志信息。 GIT中会自动添加到当前的散列ID提交的元数据。 Git的写了这一切到对象数据库,并编写它的行为赋予这个新提交其独特的哈希ID。这,当然是其他一些大丑数,但我们会用字母D
:
A--B--C <-- master
\
D
要记住,qazxsw POI是我们的最后一次提交的,现在的Git更新你的名字qazxsw POI:
D
所以现在master
将在A--B--C
\
D <-- master
开始,然后显示git log
,然后D
,然后C
。
这是事关的提交。分支的名称在那里帮助我们找到他们。但是,当我们有几个分支名称会发生什么?让我们来看看一个稍微复杂一点的图中,我们做了一些更多的提交后:
B
上面我们说,当我们做一个新的提交,Git的移动分支名。但如何做的Git知道要移动的分支的名字吗?如果我们有:
A
- 和我们可能确实在某些时候,怎样的Git知道,当我们做出承诺...--C--D <-- master
\
E--F <-- develop
,它的发展应该动,而不是...--C--D <-- develop, master
?
答案是,我们使用E
到特殊的名字master
重视只是一个分支。如果我们选择git checkout
,我们得到:
HEAD
然后,当我们添加提交develop
,Git的移动...--C--D <-- develop (HEAD), master
:
E
该名develop
撑连接到分支的名称,甚至作为分支名称本身移动。 (这样做的实际执行情况,对于那些谁是好奇,是有在...--C--D <-- master
\
E <-- develop (HEAD)
名为HEAD
一个文件,即仅包含分支名称本身。所以.git
的内容只有当你选择一个新的分支使用更改,内容最新提交的HEAD
和分支名称的哈希ID的HEAD
,存储在其他地方,在一个或多个各种不同的地方。)
请注意,顺便说一下,在这里的图纸,提交master
是在两个分支。提交develop
只在A-B-C-D
。但是,因为我们可以将分支机构的名称,我们可以通过移动E-F
指向develop
改变这一点。这将使所有六个提交上两个分支。我们没有改变提交要做到这一点,这是必要的,因为我们不能。 :-)
图可以得到更为复杂。而不是显示一个非常复杂的一个(像你可能实际上有一个),这里有一个简单的办法,显示当我们承诺合并会发生什么。这里的图片前:
master
和一前一后:
F
新的合并提交 I--J <-- release (HEAD)
/
...--G--H
\
K--L <-- develop
只在 I--J
/ \
...--G--H M <-- release (HEAD)
\ /
K--L <-- develop
。它有两个家长,M
和release
。提交J
只在发行,它有一个父L
。提交J
是两个分支,它有一个父I
。无论L
和K
引回犯I
,这是两个分支,并导致回K
,这是对双方,等等。
H
comes in如果你不给它一些起点提交运行G
,Git会看你的git log
找到你的当前提交。您当前的承诺是你的一个分支名点。你提到的评论,你对你的git log
分支,它指向一个合并提交。所以,你的图片可能看起来像什么,我们只是画。
该HEAD
命令将开始提交release
并展示给你。然后将所有git log
的父母给它需要证明提交的名单。现在必须努力向您展示这两种M
和M
在同一时间。它不能,所以它选择这两个中的一个展现。然后将其添加哪一个它显示的母公司,它的东西,以显示列表。
如果它只是表明J
,L
现在有两个提交向您展示在同一时间,即J
和git log
。它不能在同一时间同时显示,所以它选择一个。然后,它补充说,一个人的父母到其列表,等等。
该L
命令将打乱从合并双方的提交,默认情况下。特别是,它显示了一个他们在基于时间戳的时刻,让你第一眼看到的较新的。如果I
比git log
你J
之前看到L
较新,但如果J
比L
你会首先看到L
更新。这同样适用于J
和L
(VS既I
和K
)。但L
不尊重曲线的形状,无论别人做什么的,直到它完成显示J
和git log
它不会显示H
。
最终,这将是能够显示I-J
,并且当它其他提交的列表中显示为空。它会显示K-L
,H
的母公司H
添加到列表中显示(现在只有一个条目),然后显示H
并添加G
的母公司,等等。
但G
不会显示犯下它不能由开始G
和向后工作得到!
git log
假设有一些其他的名字记住的哈希ID M
。这可能不是一个分支名:也许它就像 I--J
/ \
...--G--H M <-- release (HEAD)
\ /
K--L <-- develop
\
N--O--P <-- another-name
或P
一个名字,那你的Git使用记住您的Git在一些其他的Git分支看到的名字。
运行origin/develop
不会显示提交origin/master
。具有不显示git log
也不会搬回P
无论是。 Git的字面上无法从P
去O
。它只能从L
去N
,向后。你需要选择一个开始提交的哈希开始达到或超过您所关心的承诺,获得提交你所关心的。
请注意,在这里提交N
不是“上” L
。我们用“上”是指“承诺从尖端到达”。 N-O-P
的尖端提交release
和提交release
不能从M
倒退到达。
请注意,提交N
不能从M
倒退既可以达到!两次提交可以有一个共同的祖先而自身不具有父/子或祖父母/孙子的关系。他们有一个共同的祖先可能只会让他们的兄弟姐妹或表兄弟的事实。
你可能不是最新的或错误的分支。直接尝试SHA1
M
一个N
后