7

可能重复:
找到一个分支的父分支

如何找出相关分支从中分离出来的 git 分支的名称(如果有)?

4

1 回答 1

4

我们很容易认为master永远是master并且my_branch永远是my_branch,但事实并非如此。假设您在 Github、Windows、Linux 和办公室中有您的存储库。

因此,您有 8 个不同的分支:

github/master
github/my_branch
windows/master
windows/my_branch
linux/master
linux/my_branch
office/master
office/my_branch

作为人类,您将它们视为master并且my_branch但 git 将它们视为 8 个不同的分支。因此,如果您有这样的网络:

------------------------------------------------ linux/master
 \--/ \-------/      /            \-------- office/my_branch
  | \---|--\--------/-------------------\------- my_branch
  |     |
  |   office/master
  | 
windows/master

问从哪里来是什么意思my_branch?这是许多分支合并的结果!


在那里,所以我想告诉你的是,你的问题存在哲学问题。然而,有一种方法可以回答它,尽管并不完美。首先让我们看一下git log

git log my_branch --pretty=oneline --graph

给你一个很好的合并和东西的介绍。从 git-log 手册页:

--first-parent
    Follow only the first parent commit upon seeing a merge commit. This option can give a better overview when viewing the evolution of a particular topic branch,
    because merges into a topic branch tend to be only about adjusting to updated upstream from time to time, and this option allows you to ignore the individual
    commits brought in to your history by such a merge.

使用它,您可以获得分支的线性历史记录。删除图形并仅输出 SHA1,您将获得:

git log my_branch --pretty=format:"%H" --first-parent

使用以下命令,您可以判断哪些分支包含 SHA1:

git branch --contains <commit>

使用这些命令将脚本放在一起,您可以使用以下脚本,该脚本基本上可以找到包含在您感兴趣的分支之外的另一个分支中的最新 SHA1。然后输出另一个分支。(注意:我还不擅长 bash 脚本,所以这可能效率不高):

#! /bin/bash

if [ $# -lt 1 ]; then
  branch=master
else
  branch=$1
fi

sha1s=$(git log $1 --pretty=format:"%H")
res="Doesn't branch from anything"

for i in $sha1s; do
  b=$(git branch --contains $i | awk '{ if (NF > 1) print $2; else print $1 }') # use awk to remove * from current branch
  other_branch="";
  for j in $b; do
    if [ $branch != $j ]; then
      other_branch=$j
      break;
    fi
  done
  if [ -n "$other_branch" ]; then
    res=$other_branch
    break
  fi
done

printf -- '%s\n' "$res"

我说它并不完美,因为以下情况。想象一下如果my_branch是从master. 事实上,你会看到这样的图表:

                    /------------ master
------(master)-----
                    \------------ my_branch

初始提交包含在两个分支的历史记录中。不知道它们最初来自主人。因此,这个脚本会告诉你那个my_branch是从 分支出来master的,同时告诉你那个master是从 分支出来的my_branch。没有办法判断哪一个是原始的。

于 2012-06-07T13:24:40.717 回答