重複の可能性:
ブランチの親ブランチを見つける
問題のブランチが分割された git ブランチの名前を見つけるにはどうすればよいですか (存在する場合)。
常にであり、master
常にmaster
であると考えるのは簡単ですが、そうではありません。Github、Windows、Linux、およびオフィスにリポジトリがあるとします。my_branch
my_branch
したがって、8 つの異なるブランチがあります。
github/master
github/my_branch
windows/master
windows/my_branch
linux/master
linux/my_branch
office/master
office/my_branch
あなたは人間としてそれらをmaster
and と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
分岐したことを通知します。どちらが元のものであったかを知る方法はありません。master
master
my_branch