找到进行 git commit 的第一个分支

Pet*_*ahn 5 git version-control merge github git-branch

如何找到进行提交的第一个分支?似乎能够做到这一点,但我不知道如何。

这似乎在 git 中是不可能的,因为它的设计将提交而不是分支放在更改跟踪的中心。

我可以使用以下显示第一个分支+任何合并但不能将焦点缩小到第一个提交分支的内容。

git branch --contains --merge <sha1>
Run Code Online (Sandbox Code Playgroud)

返回提交合并到的所有分支的列表以及它合并到的第一个分支。 --no-merged返回包含提交的所有后续分支,因为它们在合并点之后分支。

因此,您可以获得每个合并的列表,但不是第一个分支的列表,并且在命令执行之前删除的任何分支都将丢失(或者您正在查看 reflogs)

结果

git branch --contains <sha1 for "added feature/inital 1">
* develop
  feature/inital
  feature/subsequent1

git branch --contains <sha1 for "added feature/inital 1"> --merged
* develop
  feature/inital

git branch --contains <sha1 for "added feature/inital 1"> --no-merged
  feature/inital
Run Code Online (Sandbox Code Playgroud)

测试脚本

function mkbranch {
  git checkout -b $1
  git push --set-upstream origin $1
}

# Develop
mkbranch develop
for f in 1 2 3; do date > file${f}.txt;  git add file${f}.txt; git commit -m "added develop $f"; done
git push

# Initial Feature Branch
mkbranch feature/inital
for f in 1 3; do date > file${f}.txt;  git add file${f}.txt; git commit -m "modified feature/inital $f"; done
git push

# Merge
git checkout -b develop
git merge feature/inital
git push


# Next Feature Branch
mkbranch feature/subsequent1
for f in 1 3; do date > file${f}.txt;  git add file${f}.txt; git commit -m "modified feature/subsequent1 $f"; done
git push
Run Code Online (Sandbox Code Playgroud)

Vam*_*ire 4

答案很简单:你不能。
分支只是粘贴在提交上的便利贴。
您可以随时撕下便利贴并将其放在其他地方或扔掉。
因此您无法判断提交被引入的第一个分支是哪个。

更正确的是,只要

  • 该分支未被删除并且
  • 您位于进行提交的系统/存储库中
  • 并且提交不早于引用日志超时(默认为 90 天)

您可以找到答案,因为这样您就知道提交时分支将其发布在何处。