web-dev-qa-db-ja.com

1つのブランチのコミット履歴を取得する方法は?

masterから新しいブランチmy_experimentを作成し、my_experimentに対していくつかのコミットを行ったとします。 git logmy_experimentを実行すると、このブランチに対して行われたコミットが表示されますが、my_experimentsブランチが作成される前にmasterに対して行われたコミットも表示されます。

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

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

98
Marplesoft

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

git log master..

my_experimentブランチをチェックアウトした場合。これは、masterの位置をHEADmy_experimentのヒント)と比較します。

105
alex

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

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

注:そのログを最後の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 masterから)

commit e3fa568 by Junio C Hamano(gitster を参照してください:

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

このタイプミスのコマンドラインは、単に「master」を無視し、現在のHEADからの2つのコミットを表示することになります。

$ git log -2master

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

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

3
VonC

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

1
Daniel Casas

使用できるのはgit log --onelineのみです

0
Manoj Rana

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

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_NAMEgit branch | grep -E '^\*' | awk '{ printf $2 }'で取得されます(星の付いた枝、星のないエコー)。
  • 結果から、tail -n+2で始まる冗長行を削除します。
  • そして、[$BRANCH_NAME]の前にあるすべてをsed -E "s/^[^\[]*?\[/[/"で削除して、出力をクリーンアップします。
0
menssana