Git 如何确定分支是否没有父提交

Git 如何确定分支是否没有父提交,git,Git,我正在编写一些工具,需要知道当前分支位置/提交是否没有父级。(这很可能是因为它是一个没有提交的新存储库,或者是一个故意孤立的分支。)我需要一种检查命令行输出/退出代码的方法,这样就可以在一个程序中自动完成 理想情况下,这只能使用git管道命令来实现,但如果没有一种简单的方法来实现,我可以使用git管道命令 如何可靠而简洁地确定git分支是否为孤立分支?使用--是祖先 git merge-base --is-ancestor <maybe-ancestor-commit> <de

我正在编写一些工具,需要知道当前分支位置/提交是否没有父级。(这很可能是因为它是一个没有提交的新存储库,或者是一个故意孤立的分支。)我需要一种检查命令行输出/退出代码的方法,这样就可以在一个程序中自动完成

理想情况下,这只能使用git管道命令来实现,但如果没有一种简单的方法来实现,我可以使用git管道命令

如何可靠而简洁地确定git分支是否为孤立分支?

使用
--是祖先

git merge-base --is-ancestor <maybe-ancestor-commit> <descendant-commit>
您的脚本可以是

git merge-base --is-ancestor `git rev-list --max-parents=0 HEAD`  TheBranchToTest

当git链使用散列提交时,如果没有与分支名称关联的#,则表示它是孤立的分支&没有链接到其他分支

获取您所在的当前分支的名称:

git branch | grep "^*" | awk '{print $2}'
verbose模式下运行git分支&只需查找是否有散列

git branch -v | grep `git branch | grep "^*" | awk '{print $2}'`

我们可以根据需要在此基础上编写更多解析

这里的根本问题是孤立分支实际上并不存在

真的,事实确实如此。在没有提交的新存储库中,没有分支:

$ mkdir tt
$ cd tt
$ git init
Initialized empty Git repository in ...
$ git branch
$ git status
On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)
(在Git版本2.14中,
No-commits-yet
输出相对较新)

没有提交的分支实际上并不存在。这就是为什么名称
master
没有显示在
git分支
输出中的原因:分支master不存在,即使我们在它上面

发生的情况是Git已将所需的分支名称存储到
HEAD

$ git symbolic-ref HEAD
refs/heads/master
但分支机构本身并不存在:

$ git rev-parse HEAD
HEAD
fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
这是一个存储库的示例,它总共有六个提交(这里标记为
a
F
,而不是使用真正的散列ID)和两个分支名称。这两个分支都与另一个分支不相关,因此无论从哪个分支尖端遍历历史有多远,
master
independent
都没有共同的提交

测试两个分支是否不相关的最简单方法是使用
gitmergebase
。两个分支提示的合并基是/是“最接近”提示但位于每个提示的祖先链中的提交。在图中,它们是最低的公共祖先节点。通常只有一个这样的节点,尽管在交叉合并的情况下可能有两个,而在不相关的分支的情况下,没有

如果
gitmergebase
说没有,那么这两个分支是不相关的



1如果删除
头文件
,Git将拒绝相信该存储库是一个存储库。如果内核死机/系统崩溃,就会发生这种情况,因为文件
往往非常活跃,可能会被崩溃后的文件系统清理删除。如果发生这种情况,将
ref:refs/heads/master
写入
.git/HEAD
可以为您保存所有内容。:-)

那么,这如何告诉我,对于给定的提交,没有任何祖先呢?我已经更新了我的响应,我假设您想针对初始提交测试
git rev list--max parents=0 HEAD
这会失败,因为
致命:参数'HEAD'不明确:未知修订或路径不在工作树中。
当没有以前的提交时。在新存储库的情况下,没有任何初始提交,对吗?分支不相关的情况与我的用例无关,但仍然很有趣。关于
revparse--verify
的信息非常有用,为我解决了这个问题+1我认为
git cat file-e HEAD
可能是一个更好的核心命令存在性测试。@jthill:interest;这确实消除了捕获或重定向git rev parse--verify-q HEAD输出的需要。
$ git rev-parse HEAD
HEAD
fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
A--B--C   <-- master

D--E--F   <-- independent