目前我位于功能分支中,但我不知道它是从我的开发分支还是发布分支创建的。
谁能告诉我如何从当前 git 分支获取父分支名称。
鉴于 Git 使用有向无环图,并且通常一个存储库只有一个根,因此所有分支都指向一个初始提交。因此,您真正想要的是与您的分支共享其历史的最大部分的分支。
您不能只查找其 HEAD 包含在当前分支历史记录中的分支,因为此分支 HEAD 很可能从那时起就已移动。
所以我建议您使用
git merge-base
,它可以找到两个分支或提交的最新共同祖先(也称为分叉点):
$ git merge-base feature develop
12345abc
$ git merge-base feature release
98765fed
这将分别输出出现在两个分支历史记录中的两次提交。两者之一将包含在 both 分支中,因此您可以再次将它们提供给
merge-base
以获得您想要的提交(或者更确切地说,您不想要的提交):
git merge-base 12345abc 98765fed
98765fed
因此在我们的示例中,
feature
源自develop
,因为两者共享release
没有的提交。
请注意,只有当您不在功能和开发之间进行交叉合并时,这才有效。
到目前为止这对我有用。您可以将其用作 Mac 中的终端别名或 Windows 上的任何类型的快捷方式。
git log --pretty=format:'%D' HEAD^ | grep 'origin/' | head -n1 | sed 's@origin/@@' | sed 's@,.*@@'
正如许多地方所解释的,它不是直接父级,它为您提供从当前分支创建的最近的分支或共享相同的 HEAD^
这个(来自https://hankchizljaw.com/notes/24/)对我有用:
git show-branch -a | grep '\*' | grep -v `git rev-parse --abbrev-ref HEAD` | head -n1 | sed 's/.*\[\(.*\)\].*/\1/' | sed 's/[\^~].*//'
我发现了这个:
#!/bin/bash
git show-branch -a 2>/dev/null \
| grep '\*' \
| grep -v `git rev-parse --abbrev-ref HEAD` \
| head -n1 \
| perl -ple 's/\[[A-Za-z]+-\d+\][^\]]+$//; s/^.*\[([^~^\]]+).*$/$1/'
来源:https://gist.github.com/joechrysler/6073741?permalink_comment_id=2391826#gistcomment-2391826
我通过点击this链接得到了答案。
git show-branch -a | grep '\*' | grep -v `git rev-parse --abbrev-ref HEAD` | head -n1 | sed 's/.*\[\(.*\)\].*/\1/' | sed 's/[\^~].*//'
转到您的项目并打开 git bash(右键单击并选择 Git Bash Here)并粘贴上面的命令。
表达问题的另一种方式是:
What is the nearest commit that resides on a branch other than the current branch, and which branch is that?
这可以通过命令行命令来完成:
git show-branch \
| sed "s/].*//" \
| grep "\*" \
| grep -v "$(git rev-parse --abbrev-ref HEAD)" \
| head -n1 \
| sed "s/^.*\[//"
我在一个拥有数千个分支的 Git 存储库中工作,当我想知道时:
我从哪个分支开始我的功能分支?
我知道答案将是一小部分分支中的一个。另外,我用来确定答案的方法(恕我直言)在概念上更容易确定,使用 log 的 2 点语法。
这是我使用的 bash 别名:
alias find-git-start-branch='for branch in \
origin/next origin/develop origin/release origin/master origin/hotfix \
; do echo "Num commits not reachable by $branch: \
$(git log $branch.. --oneline | wc -l)"; done'
(如果您不需要别名,只需在单引号之间运行文本即可。)第 2 行是我列出我希望视为起始分支的分支。
脚本的核心内容都在最后一行,请注意:
git log origin/develop..
只是
git log origin/develop..HEAD
的简写。
2 点语法列出了 HEAD 上origin/develop
无法访问的所有提交,而这就是确切在确定从哪个分支开始时您通常希望知道的内容。这是我对一两天后选择的分支运行别名时的示例输出:
$ find-git-start-branch
Num commits not reachable by origin/next: 3
Num commits not reachable by origin/develop: 76
Num commits not reachable by origin/release: 86
Num commits not reachable by origin/master: 290
Num commits not reachable by origin/hotfix: 290
最小的数字代表您开始的分支,并且应该是从那时起您的分支上的new提交的数量。
git merge-base main $1 \
| xargs -I{} git branch --sort=creatordate --contains {} \
| grep -Ev "main|$1" \
| head -n 1
merge base
到main 发现最后一次提交不(仅)在当前分支上
git branch
列出所有提交为1的分支,按“最旧”排序(假设你的“核心”分支没有一直被覆盖)