2016-09-30 8 views
0

私の実際のブランチがどのブランチから派生しているのか見たいのですが。私はすでにログを見ましたが、それは非常に騒々しいです、そして、私はこの場合に正しいブランチを見つけることを100%確実にしたいと思います。私の実際のブランチがどのブランチから派生したかを見るためにどのようなコマンドを使用しますか?

+0

Martin Nyoltの答えは実行可能な解決策です。将来的には、分岐したブランチからのハイフン(例:development-newFeature)で名前を付けることをお勧めします。あるいは、常にブランチを作成するブランチを1つ選択することもできます(つまり、devは常にマスターからブランチ、devは常にブランチとなります)。しかし、究極的には、これはあなたが決めるワークフローによって決まります。 – nullverb

答えて

3

この問題はすべての場合に答えることはできません。 ブランチは永続的ではありません。ブランチを自由に動かすことができます。 reflogにより、のブランチの履歴が表示されますが、reflogはローカルのみで、90日(デフォルト)に制限されます。

あなたのレポでこのブランチの最初の発生を取得するためにgit reflog <branch>を使用することができます。この例では

$ git reflog branch | tail -n 1 
03302d2 [email protected]{12}: branch: Created from HEAD 

03302d2を最初にそのブランチのコミットされています。 次に、find the branches that the parent of this commit came fromとすることができます。たとえば、あなたが

$ git branch --contains 03302d2^ 

を行うことができ は、より洗練された方法のためにリンクの質問を参照してください。しかし、この検索は完全ではなく、 "正しい"ブランチを見逃している可能性があることに再度注意してください。

0

代替方法を追加します。あなたはまた、元が2列目にコミット一覧表示されます-v

git branch -v 

とGitのブランチを使用することができます。

2

次は近づいていますが、の制限を参照してください。

git branch --contains $(
    git for-each-ref --format='%(refname)' refs/heads/ | 
    xargs git merge-base --fork-point) 

アイデア

我々は、SHA-1のようにフォーク・ポイントを得るためにgit merge-base --fork-pointを使用しています。 merge-baseは、チェックするためにブランチ名が必要です。したがって、マスターと私の現在のブランチの間のフォークポイントはかなり簡単です。

私たちはすべての支店を確認したいので、git for-each-ref --format='%(refname)' refs/heads/を使用しています。その後、SHA-1を取得します。支店名を取得するために、我々はgit branch --contains

制限

その周りの制限のかなり多くがありますを使用しています。リポジトリがどこから来ているのかをよく知っているだけですが、gitではブランチの出所を決めるのは難しいです。たとえば、取る

 o -- o 
    / ^branch-a 
o -- X -- o -- o 
    \  ^branch-b 
     o -- o -- o 
       ^branch-c 

branch-cはどのブランチから来たのですか?両方のブランチにX iとマークされたコミットbranch-abranch-b。だからどちらかから来たのかもしれない。 GitリポジトリでGitの

支店で

枝がコミットするための簡単なポインタです。ブランチが指しているコミットのすべての祖先は、ブランチの一部です。:bcdmasterの一部であるが

a -- b -- c -- d <master 
    \ 
     d -- e <foo 

abは、masterfoo両方の一部です。しかし、ブランチはポインタの名前に過ぎません。新しい名前はdに設定することができます。今

a -- b -- c -- d <master 
     \  ^bar 
     d -- e <foo 

master上のすべてがbarにもあります。ブランチはバージョン管理されていないので、特定の時点でブランチがどこを指していたのかという質問には答えられません。したがって、fooがどこから分岐したのかを明確に判断することはできません。 Gitはブランチの動きを追跡するが、時間の経過とともに失効するreflogを提供します。

結論

ザ・唯一のgitに言うべき事が原因であること可変枝の性質のために、SHA-1などフォーク点で保存します。しかし、git merge-base --fork-pointには、実際のフォークポイントであるSHA1が返されます。ローカルリポジトリ、TYPEコマンドの現在のディレクトリ/パスで

+1

'--fork-point' *はreflogを使用するので、このメソッドも保証されません。 reflogから "created from"メッセージを検索する方が簡単かもしれません。しかし、そのエントリが期限切れになっていて、 '--fork-point'が何かを見つけたら、"何か "が役に立つかもしれません。もちろん、現在のマージベースをヒントとして使用することもできます(実際には、reflogエントリが期限切れになった場合に '--fork-point'が返されます)。 – torek

関連する問題