0

我想获取主分支的所有提交哈希 ID。但是,使用以下命令只有最新的提交 ID 与结果匹配。旧的提交哈希 ID 不属于 master 分支。有没有其他方法可以让提交哈希 ID 只属于主分支?

git rev-parse origin/master --all

4

3 回答 3

3

Git 中的“分支”仅指向(单个!)提交,并在进行新提交时自动向前移动。提交可以指向 0、1、2 甚至更多的父提交。如果一个提交可以从分支的顶端或头部到达,那么它就被称为“在一个分支上” 。这意味着一旦一个分支合并到另一个分支中,它就会成为该分支的一部分

要获取分支的所有提交 ID 的列表,您可以使用git rev-list branchname. 当然,这也将包括从其他分支合并到的提交。如果你总是朝着同一个方向合并,你可能会说只有每个提交的第一个父级对你来说是重要的和相关的。在这种情况下,您可以过滤修订列表以仅显示可通过第一个父提交到达的提交。为此,请--first-parent为上述命令指定标志。

于 2021-12-27T19:22:39.410 回答
2

OP评论...

就我而言,这也显示了分支的提交哈希 ID

tl;博士使用git rev-list master --first-parent

在 Git 中,提交不属于分支。提交相互连接。分支只是指向该分支的最新提交的标签。

相反,提交可以从分支访问。

例如,假设您有 master 和 feature 从 master 分支。它看起来像这样。

A - B - C - D - E [master]
         \
          F - G - H [feature]

master只是一个指向提交 Efeature的标签。只是一个指向提交 H 的标签。

如果你git log master会得到 A、B、C、D、E;他们可以从主人那里得到。如果你git log feature会得到 A、B、C、F、G、H;它们可以从功能中访问。

如果您只想查看提交可达功能,而不是与 master 共享的功能,请使用git log master..feature. 这将显示 (A, B, C, F, G, H) - (A, B, C, D, E) 或 F, G, H。

有关更多信息,请参阅gitrevisions


将功能合并到主功能并删除功能后,它看起来像这样。

$ git checkout master
$ git merge feature
$ git branch -d feature

A - B - C - D - E - M [master]
         \         /
          F - G - H

如果你git log master会得到 A、B、C、D、E、F、G、H、M;无论它最初致力于哪个分支,都可以从 master 访问。

您可以使用 来查看这些连接和标签git log --graph --decorate


但是我们可以得到可能是原始提交到 master 的内容。

在上面的示例中,合并提交 M 连接到两个提交,它有两个“父级”:E 和 H。它们有一个顺序。第一个是合并到 (master) 的分支,第二个是合并到 (feature) 的分支。

如果您只遵循第一个父提交,您将只获得对 master 的提交:A、B、C、D、E、M。使用--first-parent. 两者git-loggit rev-list--first-parent

git log --first-parent --oneline master

或者

git rev-list --first-parent master

不能保证这会产生对 master 的原始提交,但如果您遵循将分支合并到 master 的中央分支工作流程,它会。更复杂的工作流程可能会改变父母的顺序。

于 2021-12-27T21:12:03.463 回答
0

您可以通过运行以下命令仅获取特定分支(例如master)的哈希值:

git log --pretty=%H master
于 2021-12-27T17:02:38.393 回答