如何从当前分支获取git父分支名称?

问题描述 投票:0回答:8

目前我位于功能分支中,但我不知道它是从我的开发分支还是发布分支创建的。

谁能告诉我如何从当前 git 分支获取父分支名称。

git branch git-branch
8个回答
17
投票

鉴于 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
没有的提交。

请注意,只有当您不在功能和开发之间进行交叉合并时,这才有效。


16
投票

到目前为止这对我有用。您可以将其用作 Mac 中的终端别名或 Windows 上的任何类型的快捷方式。

git log --pretty=format:'%D' HEAD^ | grep 'origin/' | head -n1 | sed 's@origin/@@' | sed 's@,.*@@'

正如许多地方所解释的,它不是直接父级,它为您提供从当前分支创建的最近的分支或共享相同的 HEAD^


13
投票

这个(来自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/[\^~].*//'

1
投票

我发现了这个:

#!/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


1
投票

我通过点击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)并粘贴上面的命令。


0
投票

表达问题的另一种方式是:

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/^.*\[//"

答案取自这里: https://stackoverflow.com/a/17843908/8079979


0
投票

我在一个拥有数千个分支的 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提交的数量。


0
投票
对于 MacOs 15.0.1 (zsh) 和 Git 2.46.2,我使用

git merge-base main $1 \ | xargs -I{} git branch --sort=creatordate --contains {} \ | grep -Ev "main|$1" \ | head -n 1

    根据存储库结构(假设
  • main 是默认分支),merge base
    main 发现最后一次提交不(仅)在当前分支上
  • git branch
    列出所有提交为1的分支,按“最旧”排序(假设你的“核心”分支没有一直被覆盖)
  • 过滤掉当前分支,主分支(默认)现在首先显示基本分支
© www.soinside.com 2019 - 2024. All rights reserved.