1つのブランチのみのコミット履歴を取得するにはどうすればよいですか?


128

my_experimentから 新しいブランチを作成し、にmasterいくつかのコミットを行ったとしましょうmy_experimentgit logwhen on を実行するとmy_experiment、このブランチに対して行われたコミットだけでなくmastermy_experimentsブランチが作成される前に行われたコミットも表示されます。

my_experimentsブランチの作成に到達するまで、ブランチへのすべてのコミットの履歴を確認することは非常に便利です。事実上、そのブランチだけの真の履歴です。そうしないと、ログを調べたときに、コミットがmy_experimentsブランチにあったかどうかがはっきりしません。

Gitでこれを行う方法はありますか?

回答:


139

範囲を使用してそれを行うことができます。

git log master..

my_experimentブランチをチェックアウトした場合。これは、どこにあるかを比較masterしますHEAD(の先端my_experiment)。


3
わかりました、早すぎます。それは私の簡単な例ではそれでした。しかし、今私は誰か他の人の本当のリポジトリを見ていると、このコマンドを適切に使用するために、現在のブランチがどのブランチから作成されたかを知る必要があることに気付きました。多分私はこれをgitkから区別できるはずですが、それは私には明白ではありません。何かご意見は?
Marplesoft

@Marplesoftそれを理解することは複雑になる可能性があります。この質問を参照してください。
アレックス

それがどのように機能するかを簡単に説明できますか?git log master..Gitに何を伝えますか?
tonix

2
@tonix 範囲の機能(master..)部分の詳細については、回答のリンクをたどってください。
アレックス

7

このgit merge-baseコマンドを使用して、共通の祖先を見つけることができます。したがって、my_experimentがまだマスターにマージされておらず、my_experimentがマスターから作成されている場合、次のことができます。

git log --oneline `git merge-base my_experiment master`..my_experiment

あなたが最初のコミットの親を含めたい場合は、追加^--first-親git log --oneline `git merge-base my_experiment master`^..my_experiment --first-parent
エリックLavoie

7

注:ログを最後のnコミット(たとえば、最後の3コミット、たとえばgit log -3)に制限する場合は、「n」とブランチの間にスペースを入れてください。

git log -3 master..

Git 2.1(2014年8月)より前の場合、この間違いgit log -3master..は、現在のブランチの最後の3つのコミット(ここではmy_experiment)を実際に表示し、master制限を無視します(つまり、my_experimentコミットが1つしか含まれていない場合、3はまだリストされ、そのうちの2つはmaster

Junio C Hamano()による commit e3fa568を参照してください:gitster

リビジョン:「git log -<count>」をより慎重に解析

この誤って入力されたコマンドラインは単に " master"を無視し、現在からの2つのコミットを表示しHEADます。

$ git log -2master

文字列全体が整数として解析されることを確認せずに" 2master" をフィードするためatoi()です。

strtol_i()代わりにヘルパー関数を使用してください。


1

しか使えない git log --oneline


このコードは質問に答えることがありますが、問題を解決する方法および/または理由に関する追加のコンテキストを提供すると、回答の長期的な価値が向上します。
DebanjanB

1

あなたの目的のためのオプションはあると思いますgit log --online --decorate。これにより、チェックされたコミットと、ストーリーラインにある各ブランチの上位のコミットを知ることができます。これを行うことで、リポジトリの構造と特定のブランチに関連付けられたコミットについての素晴らしいビューを得ることができます。これを読むことが役立つと思います。


0

私はこれが非常に遅いことを知っています...しかし、ここにあなたが探していたものを取得する(それほど単純ではない)ワンライナーがあります:

git show-branch --all 2>/dev/null | grep -E "\[$(git branch | grep -E '^\*' | awk '{ printf $2 }')" | tail -n+2 | sed -E "s/^[^\[]*?\[/[/"
  • git show-branch(警告をに送信する/dev/null)で、ブランチ名と実際のブランチの状態に対する相対位置でコミットをリストしています。
  • 次に、ブランチ名のあるものだけをで囲みgrep -E "\[$BRANCH_NAME"ます。
  • 実際に(星のある枝、その星なしでエコーされた$BRANCH_NAME)で取得される場合git branch | grep -E '^\*' | awk '{ printf $2 }'
  • 結果から、で始まる冗長な行を削除しますtail -n+2
  • そして、我々はfianlly、先行するすべて除去することにより、出力をクリーンアップ[$BRANCH_NAME]してをsed -E "s/^[^\[]*?\[/[/"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.