47

の後に出力される情報を抽出したいと思いgit statusます。これは次のようになります。

# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.

もちろん、出力を解析することはできますがgit status、この人間が読める出力は変更される可能性があるため、これはお勧めできません。

2 つの問題があります。

  1. リモート追跡ブランチを知るには? 多くの場合origin/branch、そうである必要はありません。
  2. 数字を取得するには?先か後かを知る方法は?コミット数は?では、分岐分岐の場合はどうでしょうか。
4

10 に答える 10

23

git rev-list origin..HEADオリジンではなく、現在のブランチにあるコミットを表示します。つまり、オリジンより進んでいるかどうか、どのコミットまでにコミットしたかを示します。

git rev-list HEAD..origin反対を示しま​​す。

両方のコマンドでコミットが表示される場合は、ブランチが分岐しています。

于 2010-06-03T20:08:00.567 に答える
20

アップデート

amalloy が指摘したように、最近のバージョンの git は、追跡ブランチの場合は「branchname@{upstream}」(または「branchname@{u}」または「@{u}」) を指定して、特定のブランチに一致する追跡ブランチを見つけることをサポートしています。頭の)。これは、以下のスクリプトに実質的に取って代わります。できるよ:

git rev-list @{u}..
git rev-list --left-right --boundary @{u}...
gitk @{u}...

など。たとえば、プッシュの準備ができている「キューに入れられた」コミットを表示するためにgit qエイリアスを作成しました。git log --pretty='...' @{u}..

元の答え

いくつかのシェル コマンドで実用的であるよりも多くの git config を解析せずに、一般的に追跡ブランチを見つける簡単な方法はないようです。しかし、多くの場合、これは大いに役立ちます。

# work out the current branch name
currentbranch=$(expr $(git symbolic-ref HEAD) : 'refs/heads/\(.*\)')
[ -n "$currentbranch" ] || die "You don't seem to be on a branch"
# look up this branch in the configuration
remote=$(git config branch.$currentbranch.remote)
remote_ref=$(git config branch.$currentbranch.merge)
# convert the remote ref into the tracking ref... this is a hack
remote_branch=$(expr $remote_ref : 'refs/heads/\(.*\)')
tracking_branch=refs/remotes/$remote/$remote_branch
# now $tracking_branch should be the local ref tracking HEAD
git rev-list $tracking_branch..HEAD

別の、より強引なアプローチ:

git rev-list HEAD --not --remotes

jamessan's answer は、 $tracking_branch と HEAD を使用して相対的な違いを見つける方法を説明していますgit rev-list。あなたができる1つの楽しいこと:

git rev-list --left-right $tracking_branch...HEAD

( $tracking_branch と HEAD の間の3 つのドットに注意してください)。これにより、両方の「アーム」のコミットが先頭に識別マーク付きで表示されます: $tracking_branch のコミットは「<」、HEAD のコミットは「>」です。

于 2010-06-03T22:01:21.837 に答える
11

試すことができgit branch -v -vます。flag を 2 回指定すると-v、上流のブランチの名前が出力されます。出力例:

* devel  7a5ff2c [origin/devel: ahead 1] smaller file status overlay icons
  master 37ca389 [origin/master] initial project check-in.

この形式は、出力よりも安定していると思いgit statusます。

于 2010-06-04T02:59:16.107 に答える
8

git の最新バージョンで@{u}は、現在のブランチが設定されている場合、その上流を指します。

したがって、リモート追跡ブランチの背後にあるコミットの数をカウントするには:

git rev-list --count HEAD..@{u}

リモコンよりどれだけ進んでいるかを確認するには、順番を入れ替えてください。

git rev-list --count @{u}..HEAD

より人間が読める要約については、代わりにログを要求できます。

git log --pretty=oneline @{u}..HEAD

私自身の目的のために、@{u}アップストリームがまだ設定されていない場合に適切な推測に置き換えるスクリプトに取り組んでいます。残念ながら、現時点で@{d}はダウンストリーム (プッシュ先) を表すものはありません。

于 2013-12-13T09:19:55.520 に答える
7

編集: 「origin」と呼ばれるリモートを持つことをユーザーに依存していたため、私の最初の答えは実際にはあまり良くありませんでした。また、現在のブランチに origin-head 以外の追跡ブランチがある場合にも失敗しました。これらの欠陥により、本質的に役に立たなくなりました。ただし、@araqnid による回答は最も効率的な方法ではなく、彼がたどり着いた方法は単純ではありません$tracking_branch。同じ機能を得るために私が見つけた最も効率的な(最速の)方法は次のとおりです。

# get the tracking-branch name
tracking_branch=$(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD))
# creates global variables $1 and $2 based on left vs. right tracking
# inspired by @adam_spiers
set -- $(git rev-list --left-right --count $tracking_branch...HEAD)
behind=$1
ahead=$2

元の回答:(劣っていますが、明確にするために与えられています)

おそらく私が見つけることができる最も簡単な方法です(@insidepowerに触発されました)

# count the number of logs
behind=$(git log --oneline HEAD..origin | wc -l)
ahead=$( git log --oneline origin..HEAD | wc -l)

以前は @araqnid の方法を使用していましたが、スクリプトの一部をこの方法に移動することにしました。この方法の方がはるかに簡単だからです。これは、どの UNIX システムでも動作するはずです。

于 2012-11-01T06:52:02.340 に答える
5

git status--porcelainスクリプトによる解析を目的としたオプションがあります。これは出力に基づいてい--shortます。執筆時点ではほとんど同じです (詳細については、git status のマニュアル ページの「Porcelain Format」セクションを参照してください)。主な違いは、--shortカラー出力があることです。

デフォルトではブランチ情報は表示されませんが、--branchオプションを追加すると次のような出力が得られます。

git status --short --branch
## master...origin/master [ahead 1]
?? untrackedfile.txt
...

最新の状態であれば (取得後)、支線は次のようになります。

## master

あなたが進んでいる場合:

## master...origin/master [ahead 1]

あなたが遅れている場合:

## master...origin/master [behind 58]

そして両方のために:

## master...origin/master [ahead 1, behind 58]

1.7.10.3git status --porcelain --branch以降でのみ利用可能であることに注意してください(ただし、 1.7.2以降で利用可能です)。git status --short --branch

于 2013-08-19T14:40:59.227 に答える
2

なぜこれがうまくいかないのですか:

#!/bin/sh
git diff origin/master..HEAD --quiet --exit-code
RETVAL=$?
if [ $RETVAL -gt 0 ]; then
    echo "You need to git push!"
else
    echo "No git push necessary!"
fi 
于 2012-06-04T15:23:00.397 に答える
1

araqnid の回答のコードの一番上のチャンクは私には機能しないため、18 か月前に作成されてから git の何かが変更された可能性があります。変更すると機能します:

tracking_branch=refs/remotes/$remote/$remote_branch

tracking_branch=$remote/$remote_branch

ただし、ローカル ブランチを追跡する際にはまだ問題があり、その場合はリモート部分 ('.' になります) を削除する必要があります。

tracking_branch=${tracking_branch#./}

次に、次のように、前後のリビジョンの数をプログラムで取得できます。

set -- `git rev-list --left-right --count $tracking_branch...HEAD`
behind="$1"
ahead="$2"

私はそれをすべて行うためのスクリプトを書き(さらに多くの - たとえば、git-svn ブリッジの反対側にあるリモートを見つけようとすることもできます)、それらを github の git-config リポジトリに公開しました。たとえば、これが私のgit-compare-upstreamです。インストール手順およびその他の便利な関連スクリプトについては、READMEを参照してください。

于 2011-11-28T10:19:52.050 に答える
1

リモート追跡ブランチを知るには? 多くの場合origin/branch、そうである必要はありません。

Git 2.5+ では、プッシュ先のブランチを参照する新しいショートカットが導入されています。@{push}: これは、ここで重要なリモート トラッキング ブランチです。

つまり、ブランチにプッシュするように構成されているすべてのブランチの前後を表示する別のオプションがあることを意味します。

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

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

于 2015-06-08T22:53:05.183 に答える