7

重複の可能性:
ブランチの親ブランチを見つける

問題のブランチが分割された git ブランチの名前を見つけるにはどうすればよいですか (存在する場合)。

4

1 に答える 1

4

常にであり、master常にmasterであると考えるのは簡単ですが、そうではありません。Github、Windows、Linux、およびオフィスにリポジトリがあるとします。my_branchmy_branch

したがって、8 つの異なるブランチがあります。

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

あなたは人間としてそれらをmasterand と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 の man ページから:

--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分岐したことを通知します。どちらが元のものであったかを知る方法はありません。mastermastermy_branch

于 2012-06-07T13:24:40.717 に答える