如何引用初始提交?

Bry*_*sen 122 git git-commit

我有一个脚本需要引用存储库中的初始提交.git有特殊的参考HEAD,但没有相应的TAIL.我找不到任何git help rev-parse可以帮助我的东西.

这是我想做的事情:

git show TAIL
Run Code Online (Sandbox Code Playgroud)

这是我的一个选择:

git show `git log --reverse | if read a commit ; then echo $commit ; fi`
Run Code Online (Sandbox Code Playgroud)

这非常hacky,取决于git log的输出没有改变.

现在我只标记初始提交并将其用作我的refspec.但是,我想发布一个通用工具,所以这不是一个很好的选择.

Jak*_*ski 141

不要使用git-log进行脚本编写:使用git-rev-list或git-log和指定的自定义格式("--format = <sth> "选项).

您的问题还有一个问题:存储库中可能存在多个这样的TAIL根提交(无父提交)(即使我们在git.git中对断开的分支进行折扣,例如'html','man'和'todo'库).这通常是将单独的项目合并为一个,或者使用单独开发的子项目的子树合并的结果.

例如,git存储库有6个root提交:git-gui,gitk(子树合并),gitweb(合并,不再单独开发),git mail工具(在项目历史的早期合并)和p4-fast-export(也许意外).这不包括'html和'man'分支的根源,包含预生成文档的"便利"分支,以及包含TODO列表和脚本的"todo"分支.


您可以使用以下命令获取当前分支可访问的所有无父(根)提交的列表:

$ git rev-list --max-parents=0 HEAD
Run Code Online (Sandbox Code Playgroud)

如果你有git 1.7.4.2或更新版本,你可以使用新git-rev-list选项:

$ git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"
Run Code Online (Sandbox Code Playgroud)

  • @Treebranch 如果您提交了带有奇怪时间戳的提交,则可能会发生这种情况。将 `--topo-order` 添加到 `rev-list` 应该可以解决这个问题,尽管我认为 `--max=parents=0` 答案是最好的。 (2认同)

Rob*_*anu 32

git rev-list HEAD | tail -n 1 是一个更稳定的选择.

  • 这将返回*一个尾部提交; 可以有多个root(无父对象)提交 (13认同)
  • 这个答案工作得很好,只返回了一个提交 sha,而 `git rev-list --max-parents=0 HEAD` 返回了 3 个提交。 (3认同)

Cla*_*ges 13

不确定你想在这里做什么,但一些 git 命令作为--root一个选项,以便引用提交树的根,例如

git rebase --interactive --root main
Run Code Online (Sandbox Code Playgroud)


小智 7

假设合并的第一个父级是开发的主线:

git rev-list --reverse --topo-order --first-parent HEAD | sed 1q
Run Code Online (Sandbox Code Playgroud)