マスターとブランチの間のgitの先/後ろの情報?


201

ローカルリポジトリ(test-branch)にテスト用のブランチを作成しましたGithub

私のGithubアカウントに移動してこれを選択するtest-branchと、情報が表示されます:

This branch is 1 commit ahead and 2 commits behind master

私の質問は:

  1. この情報をローカルに表示するにはどうすればよいですか(つまり、情報を表示するために開く必要があるのではなく、端末にこれを表示するコマンドGithub)。
  2. 私は次を使用してブランチ間の差分を見ることができることを知っています:

    git diff master..test-branch
    

    または使用Meld(私が好む):

    git difftool master..test-branch
    

    参照する方法がある場合、私は思っていた後ろに個別にコミットが。IE:1つのコミットが先にコミットし、次に2つのコミットが後ろにあることを示す方法はありますか?



1
Git 2.5+(2015年第2四半期)ではが導入されgit for-each-ref --format="%(push:track)" refs/headsます。以下の私の回答を
VonC '

1
これから書こうとしているキーワードを使用してこの質問を見つけることができなかったので、これは、これらのブランチを構成するコミットのセット間の相対的な補完(または「セットの差」)を取ることに注意したいだけです(そして次に要素を数えます)。うまくいけば、これが検索エンジンのインデックスになります。
pmos

回答:


309

これは、2つのブランチを比較し、各ブランチが他のブランチよりも進んでいるコミットの数を示すために見つけたトリックです(質問1のより一般的な答え)。

以下のための現地支店: git rev-list --left-right --count master...test-branch

ために 遠隔支店: git rev-list --left-right --count origin/master...origin/test-branch

これにより、次のような出力が得られます。

1 7

この出力は、「と比較して master、、test-branch7コミット先で1コミット先である。

また、ローカルブランチとリモートブランチを比較することもできます。たとえばorigin/master...master、ローカルmasterブランチがそのリモートブランチの前後にあるコミットの数を確認できます。


1
これは、ブランチを削除できるか、それともまだ開発が進んでいるかどうかを確認するのに最適なソリューションです。
Maverick1st

1
@ Maverick1st、はい、このコマンドはgitflowワークフロー(私です)をフォローしているときに特に役立ちます
user1834095

2
これは、現在の機能ブランチがリモートマスター(git rev-list --left-right --count origin/master...@)の背後にあるかどうかを確認する私のユースケースに最適ですgit fetch。古いブランチからのプルリクエストを防ぐのに役立ちます。
jakub.g 2016年

9
現在のブランチの背後にあるコミットの数を確認するは:git rev-list --left-right --count origin/master...@ | cut -f1
jakub.g

8
@ jakub.gあなたが使用している場合は、カットする必要はありません--left-only--right-only
jasonkarns

39

まず、ローカルでいくつのリビジョンが遅れているかを確認するには、 git fetch確認するには、リモートから最新の情報を入手するためにを実行する必要があります。

のデフォルトの出力でgit statusは、いくつのリビジョンが進んでいるか、または遅れているかがわかりますが、通常、これは冗長すぎると思います。

$ git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 1 different commit each, respectively.
#
nothing to commit (working directory clean)

私は好むgit status -sb

$ git status -sb
## master...origin/master [ahead 2, behind 1]

実際、私はこれを単に git s、ます。これは、ステータスの確認に使用するメインコマンドです。

の「前のリビジョン」の差分を確認masterするために、「後ろのリビジョン」を以下から除外できますorigin/master

git diff master..origin/master^

の「リビジョンの後ろ」の差分を確認するために、「リビジョンのorigin/master前」を以下から除外できますmaster

git diff origin/master..master^^

前後に5つのリビジョンがある場合は、次のように記述する方が簡単です。

git diff master..origin/master~5
git diff origin/master..master~5

更新

前方/後方のリビジョンを表示するには、別のブランチを追跡するようにブランチを構成する必要があります。私にとって、これは、リモートリポジトリのクローンを作成するとき、およびでブランチをプッシュした後のデフォルトの動作ですgit push -u remotename branchname。私のバージョンは1.8.4.3ですが、覚えている限り、このように動作しています。

バージョン1.8以降、次のようにトラッキングブランチを設定できます。

git branch --track test-branch

バージョン1.7以降、構文は異なりました。

git branch --set-upstream test-branch

どのバージョンgitを使用していますか?あなたが得たものを、git statusまたで再現することはできませんgit status -sb。どちらかのコマンドを実行した場合(実行した後git fetch)、コミットの前後の情報が表示されません。
ガブリエル

8
コミットの前後を確認する方法が適用されてmasterおりorigin/master、それらの差分masterと別のブランチを確認したいtest-branch。この問題に対処するために回答を再フォーマットできますか?
ガブリエル

"behind"と "ahead"リビジョンの差分は、ブランチ名の間に3つのドット(2ではなく)を使用した場合にのみ機能します。そして、^と^^はここでは問題にならなかったようです。例:git diff master ... origin / master git diff origin / master ... masterとにかく、「git status -sb」は非常に役に立ちました。
Vituel 14

10

Git 2.5以降では、ブランチにプッシュするように構成されているすべてのブランチの前方/後方を表示する別のオプションがあります。

git for-each-ref --format="%(push:track)" refs/heads

詳細については、「プッシュされていないGitコミットの表示」をご覧ください。


現在のブランチとそのリモート追跡ブランチだけにこれを行うことができますか?
spex

はい@spex:完全なrefs/heads現在のブランチの名前(とstackoverflow.com/a/12142066/6309):refs/heads/$(git rev-parse --abbrev-ref HEAD)
VonC

3

あなたも使うことができます awkして、少しきれいにする。

git rev-list --left-right --count  origin/develop...feature-branch | awk '{print "Behind "$1" - Ahead "$2""}'

常に最初に常に起点をフェッチし、次にブランチを比較するエイリアスを作成することもできます

commit-diff = !"git fetch &> /dev/null && git rev-list --left-right --count"

1

git fetchを実行した後、git statusを実行して、ローカルブランチがリモートバージョンのブランチより進んでいるか遅れているコミットの数を表示できます。

ただし、別のブランチの前または後のコミット数は表示されません。オプションは、完全な差分、githubの表示、または上記のVimhsaのようなソリューションの使用です。すべてのリポジトリのGitステータス

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.