2012-06-07 13 views
5

可能性の重複:
Find the parent branch of a branchこのブランチはどのgitブランチからチェックアウトされましたか?

どのように私は、問題の分岐が(もしあれば)から分離Gitのブランチの名前を見つけるのですか?

+0

リモートブランチがトラッキングされていること、またはブランチが分割されているブランチ(存在する場合)を意味しますか?私はあなたがいつも後者を見つけることができるとは思わない。 –

+0

このブランチが(もしあれば)そこから分割されたローカルブランチ。あなたがしたよりもこれを述べることはできませんでした。 – Dziamid

+0

私は誤解を招くかもしれないが、私はGitがその情報を記録するとは思わない。 –

答えて

2

masterは常にmasterで、my_branchは常にmy_branchと考えるのは簡単ですが、そうではありません。 Github、あなたのウィンドウ、あなたのLinux、あなたのオフィスにあなたのリポジトリがあるとします。

そのため、8つの異なる支店があります。

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

を人間としてあなたはmastermy_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. 

これを使用すると、ブランチの線形履歴が得られます。グラフを削除するだけSHA1sを出力し、あなたが得る:

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_branchmasterから分岐しているとします。最初のコミットは両方のブランチの履歴に含まれている

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

:実際には、あなたは、このようなグラフを参照してください。彼らがもともと主人から来たのは不明です。したがって、このスクリプトはmy_branchmasterから分岐していると伝え、同時にmastermy_branchから分岐していることを伝えます。どちらが元のものかを知る方法はありません。

関連する問題