Git 中的 reachable/unreachable 指什么?

19

有点困惑...

git社区手册中,它说:

git log命令可以展示提交的列表。仅使用该命令,将显示从父提交可到达的所有提交; 但是您也可以进行更具体的请求

$ git log v2.5.. # commits since (not reachable from) v2.5

我原以为git log只会显示当前分支上的提交记录,并且这些提交记录是按顺序排列的 - 那么你如何有一个提交记录是在另一个提交记录之后产生的,但是却无法到达呢?

我想我可能对git log的功能或unreachable的含义有所误解,或者两者都误解了..非常感谢任何帮助!


6
哦,我明白了。因为每个提交只存储其父提交,所以你可以从任何提交构建一个提交列表,但不能向前构建。因此,任何此后的提交也是不可到达的。 - bruce
正确。这就是git查找所有信息的方式。它从一个已知点开始(例如指向给定提交对象的分支),并通过引用其他对象(例如提交的父级)从那里走过。这与它查找与提交相关联的内容的方式相同-它有效地沿着目录结构(在内部表示为树)向下遍历到每个文件(其内容存储为blob)。 - Cascabel
2个回答

19

在Git中,每次提交(除了第一次)都会有一个父提交。因此,在给定的提交(除了第一次)中,它是另一个提交的子提交(可能是一个或多个)。您还可以在Git中拥有几个开发分支,这些分支始于某个祖先提交或从特定的祖先提交偏离。Git中没有规定提交必须按照时间顺序或线性顺序进行,因此git log工具需要能够处理几种查询历史的方式。

例如,假设我按字母顺序开发我的应用程序并进行提交:

---A---B---E---G
    \       \
     C---D   F
在这个例子中,我必须在提交A和E上创建一个新分支。
如果我运行git log <D>(其中<D>是提交的SHA),那么日志历史将如下所示:
D---C---A---

从那个提交开始,只能“看到”它的父提交和祖先提交。提交B、E、F和G从提交D来说是技术上“不可访问”的,因为它们没有共同连接的父提交。


2
谢谢,那很有道理。 - bruce
2
这段代码有点令人困惑 - 时间戳与此无关。而且 git log 并不真正地“查询历史”,只是“祖先”的方式。如果您要按时间顺序查找某些内容,它仍然会遍历提交的祖先链; 它只是还会检查元数据并应用您的时间限制。 - Cascabel
1
是的,你说得很对 - 时间戳与git日志的工作原理几乎没有关系。我试图说明这一点,尽管我可能能够更好地阐述这个观点。 - Chris

6
"

Y is reachable from X"的意思是对象 Y 可以从 DAG 到达。根据 Y 是什么,这可能意味着:

  • Y 是一个提交:Y 是 X 的父代/祖先。
  • Y 是目录/文件夹/ Blob:Y 是 X 的父代/祖先树中某次提交的一部分。

对于某些文档(例如 git-fsck),它只会说“Y 是可达的”。这意味着 Y 可以从某个标签/分支到达(即 Y 不能被垃圾回收)。

"

3
作为一个 Git 新手,我很可能不知道 DAG 是什么意思。你的整个回答都超出了我的理解范围。 - bruce
2
@bruce:有向无环图。Git 中的所有内容都建立在此基础之上。提交对象包含对其父对象的引用,但不包含对其子对象的引用。同样地,提交对象知道它的树(基本上是目录列表),它知道它包含哪些 blob(基本上是文件内容)和其他树,以此类推,但它们都不知道它们的父对象。例如,请参见 Git 社区书籍中的 Git 对象模型 - Cascabel
2
我已经添加了一个链接到http://eagain.net/articles/git-for-computer-scientists/(计算机科学家的Git)。 - J-16 SDiZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接