git:あなたのブランチはXコミットで先行しています


379

これは実際どのようにして起こりますか?

現在、自分で1つのリポジトリで作業しているので、これが私のワークフローです。

  1. ファイルを変更する
  2. コミット
  3. 満足するまで1-2を繰り返します
  4. マスターにプッシュ

次に、aを実行するgit statusと、ブランチがXコミット(おそらく、私が行ったのと同じ数のコミット)によって進んでいることがわかります。これは、コードをプッシュしたときに、ローカルにキャッシュされたファイル(.gitフォルダー内)が実際に更新されないためですか?git pullこの奇妙なメッセージを「修正」するようですが、なぜそれが起こるのか私はまだ興味があります、おそらく私はgitを間違って使用していますか?


メッセージに出力されるブランチを含む

私の地元の支店はマスターよりも先です

現在のブランチをどこにプッシュ/プルしますか

私はGitHubにプッシュし、その時点でたまたま作業しているコンピューターに移動します。自分で作業しているのは自分だけなので、ローカルコピーは常に完全に最新です。

実際にはリモートリポジトリをチェックしません

それが私の考えであり、私の理解が正しいことを確認することにしました。

あなたはそれにいくつかの追加の引数を渡していますか?

私が見ることができるものではなく、私の側で何か面白い設定が行われているのでしょうか?

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)

どのようにしていpushますか、リモートおよびブランチ構成設定は何ですか?
CBベイリー

2
実際にはリモートリポジトリをチェックしません。gitfetchを実行する必要があります。プッシュを実行した後、リモートリポジトリの最新情報を取得します。これにより、追跡に使用するローカルの「リモート」ブランチが更新されます。
セハト

2
@Sekhat:git statusリモートリポジトリをチェックしませんが、チェックしますgit pull。プッシュするリポジトリのトラッキングブランチがある場合、git pushは、ローカルトラッキングブランチを更新して、プッシュが成功した場合にリモートブランチの新しい状態を反映させます。これがアスカーの設定について尋ねた理由です。正しく実行されない場合、おそらく設定エラーがあるためです。
CBベイリー

git status?本当に?私git statusは私のブランチがどれだけ先に進んでいるのか私に教えてくれません...あなたはそれにいくつかの追加の引数を渡していますか?
Hasen

4
@hasen j:git statusリモートリポジトリに移動して、リモートブランチが更新されているかどうかを確認しません。これは、ローカルブランチがローカルに保存されているリモートトラッキングブランチと比較してどれだけ進んでいるかを示します。問題は、通常のgit push(フェッチとプルと同様に)リモートトラッキングブランチを更新する必要があることです。質問者の場合、これは機能していないようです。git push使用されている正確な形式とローカルリポジトリの構成の両方を確認する必要がある理由を確認するために、質問者が既に回答を受け入れているため、これが起こっているのを確認できません。
CBベイリー

回答:


508

を実行した後にこのメッセージが表示された場合はgit pull remote branch、でフォローしてみてくださいgit fetch。(オプションで、git fetch -p削除されたブランチをリポジトリから削除するために実行します)

Fetchはリモートブランチのローカル表現を更新するようです。これは、を実行するときに必ずしも発生するわけではありませんgit pull remote branch


1
ブラボー。それが本当に問題でした。私はグーグルコードでリポジトリを作成することから始めました。次に、このリポジトリを自分のラップトップに複製し、そこで作業して変更をプッシュします、laptop => code.google。私は以前、code.googleコードリポジトリのクローンを作成したサーバーでこのメッセージを取得し、変更をプルしていました。ローカルデータベースを更新するにはフェッチが必要だと思います。
rjha94 '

2
別のブランチ(A)がマスターの同じcommitidをポイントしているため、ここでも同じ問題が発生しました。Aをプルしてからマスターをプルすると、この同じ状況が発生しました。gitがAをプルしたとき、commitidは最後のコミットIDに更新されたため、プルするマスターには実際にプルするものがないため、gitはマスターの最後のcommitidを更新せず、「マスターより先」であることを警告していました。
Uberto 2011

8
ありがとう、私は奇妙なことに気づきました。「git fetch origin master」は役に立ちませんが、「git fetch origin」は役立ちます。私はmasterブランチを使用しているので、「git fetch origin」がコンテキストでどのように異なるかはわかりません。
Parag 2014

2
@Paragは、これら2つのコマンドの違いの説明、および動作を変更するように構成ファイルを変更してgit fetchリモートブランチもリモートトラッキングブランチ参照も更新する方法について、stackoverflow.com / questions / 26350876 /…を参照してください。git_statusは「ahead by」を報告しません。
Anatortoise House

2
@ Parag、stackoverflow.com / questions / 7365415 /…回答では、ORIG_HEADとFETCH_HEADが同期しなくなり、ステータス警告が発生し、構成ファイルが修正される可能性があることについて説明しています。
Anatortoise House 14

138

使用する

git pull --rebase

--rebaseオプションは、gitがローカルコミットを脇に移動し、リモートと同期してから、新しい状態からコミットを適用しようとすることを意味します。


3
無駄なマージを防ぎ、元のツリーをきれいにする本当に良い方法です!
Hatef、2015

1
私はこのコマンドを試しましたが、同じ問題がまだあります...$ git pull --rebase Current branch xyz is up to date. $ git status On branch xyz Your branch is ahead of 'origin/xyz' by 6 commits. (use "git push" to publish your local commits) nothing to commit, working tree clean
bbh

4
この答えは間違っています:状況を理解せずにそれを使用すると、潜在的な問題が発生する可能性があります(書き換えられた履歴!)。あなたが状況を理解しているなら、これはそれに対する修正ではありません。を使用するときはgit、入力する前に考えてください。履歴を無意味に書き換えないでください。
cmaster-モニカを2017年

80

これら3つの簡単なコマンドを使用する

ステップ1git checkout <branch_name>

ステップ2git pull -s recursive -X theirs

ステップ3git reset --hard origin/<branch_name>

詳細:https : //stackoverflow.com/a/39698570/2439715

楽しい。


3
これが実際に問題を解決した唯一の答えです。上記のコマンドは奇妙に12から7のコミットにノックダウンし、これは最終的にそれらを削除しました
Ieuan

1
これが私のために働いた唯一のものであることに私は同意します。GITには複数の人格障害が時々あると確信しています。
ksed

11
@leuanのように、git reset --hard origin/master私のためにそれを片付けるだけでした。
Dave Land、

ここでも同じです。これが私にとって
有効な

51

私はあなたがメッセージを読み違えていると思う-あなたのブランチが先のではないmaster、それはです master。これは、先のだorigin/masterとする、リモート追跡ブランチあなたの最後からリモートリポジトリの状態を記録しpushpullまたはfetch。それはあなたが何をしたかを正確に伝えています。リモコンよりも先に進み、押すことを思い出させます。


22
これは私が実際に押した後です。そのメッセージが表示されないようにするには、プル(またはフェッチする可能性があります)する必要がありました。
SeanJA 2010年

26

誰かがあなたがあなたのメッセージを誤解しているかもしれないと言った、あなたはそうではない この問題は実際には<project>/.git/configファイルに関係しています。これには、次のようなセクションがあります。

[remote "origin"]
    url = <url>
    fetch = +refs/heads/*:refs/remotes/origin/*

プロジェクトの.git / configファイルからフェッチ行を削除すると、「あなたのブランチはNコミットによって 'origin / master'の前にあります」を停止します。発生の煩わしさ。

またはそう思います。:)


次にahead by x commitsメッセージが表示されたときに確認します。しばらくメッセージを見ていません。
SeanJA、

しばらくメッセージを見ていません。ローカルでgitリポジトリを作成し始め、それをリモートリポジトリにプッシュするのではなく、別の方法でプッシュしたためだと思います...
SeanJA

私はこれを試しましたが、コミットしようとすると、EclipseのeGitが「内部エラー」でポップアップし始めました。ただし、Git自体は問題なく動作するようです。
user4815162342 2012

18
その行は何をしますか?それを削除することで私は何を逃していますか?(煩わしさは別として)
John Mee 2013年

1
これは機能しましたが、エラーを抑制するようなものです。行を追加し直すと、再び警告が表示され始めます。
クリシュナパンディ

15

プルのみを行うステージサーバーでこの問題が発生しました。また、ハードリセットにより、HEADをリモートと同じにクリーンアップできました。

git reset --hard origin/master

だから今私は再び持っています:

On branch master
Your branch is up-to-date with 'origin/master'.

私は最初に--hardフラグなしで試しましたが、うまくいきました!
kroiz 2018年

12

これは私のために働いた

git reset --hard origin/master

出力は次のようになります

On branch dev HEAD is now at ae1xc41z Last commit message


11

私の場合は、使用してマスターに切り替えたためです

 git checkout -B master

代わりに新しいバージョンをプルするだけです

 git checkout master

最初のコマンドは、マスターのヘッドを最新のコミットにリセットします

使った

git reset --hard origin/master

それを修正するには


9

私はこのページのすべての解決策を検討しましたが、幸いなことに@ anatolii-pazhynがコメントしました。残念ながら私は彼を賛成するほどの評判はありませんが、まず彼の解決策を試すことをお勧めします。

git reset --hard origin/master

それは私に与えました:

HEAD is now at 900000b Comment from my last git commit here

私もお勧めします:

git rev-list origin..HEAD
# to see if the local repository is ahead, push needed

git rev-list HEAD..origin
# to see if the local repository is behind, pull needed

次のものも使用できます。

git rev-list --count --left-right origin/master...HEAD
# if you have numbers for both, then the two repositories have diverged

幸運を祈ります


4

Windowsマシンでも同じ問題が発生しました。git pull origin masterコマンドを実行すると、「Xコミットによる 'origin / master'の前に」という警告が表示されました。代わりに実行git pull originしてブランチを指定しなかった場合は、警告が表示されなくなることがわかりました。


これgit fetchは舞台裏で効果的に行われていると思います。
ブライアンピーターソン

「git fetch」は私の問題を解決しませんでした、これは解決しました。新しく追加されたブランチのリストとこのメッセージ「リモート 'アップストリーム'からプルするように要求しましたが、ブランチを指定しませんでした。これは現在のブランチに設定されているデフォルトのリモートではないため、コマンドでブランチを指定する必要がありますライン。" そして次の「git status」コマンドは警告を表示しませんでした。
クリシュナパンデイ

2

現在のブランチと現在のトラックを実行するブランチの違いを思い出させるだけです。メッセージに出力されるブランチや、現在のブランチをどこにプッシュ/プルするかなど、詳細情報を提供してください。


2

この質問は少し古いですが...私は同じような状況にあり、ここで私の答えは私が持っていた同様の問題を修正するのに役立ちました

最初に試すpush -fか強制オプション

それがうまくいかなかった場合、(私の場合のように)リモートリポジトリ(またはに表示されるリモートリポジトリへの参照git remote -v)が更新されていない可能性があります。

上記の結果は、プッシュがローカル/ブランチをリモート/ブランチと同期した結果ですが、ローカルリポジトリのキャッシュには、以前のコミット(ローカル/ブランチ...のコミットが1つだけプッシュされた場合)がまだHEADとして表示されます。

上記を確認するには、別の場所にリポジトリを複製し、ローカル/ブランチHEADとリモート/ブランチHEADを比較してみてください。両方が同じ場合は、おそらく私が行った問題に直面しています。

解決:

$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)
$ git remote add origin git://github.com/pjhyett/hw.git
$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)
origin  git://github.com/pjhyett/hw.git (fetch)
origin  git://github.com/pjhyett/hw.git (push)
$ git remote rm origin
$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)

push -f、次のように

git push -f github master ###コマンドにはoriginもうないことに注意してください!

やるgit pullgit pull github master

上のgit status受信

# On branch master

nothing to commit (working directory clean)

ビューの数が多すぎてこのエラーを検索すると、ほとんどの場合、このスレッドが一番上に表示されるので、これが誰かにとって役立つことを願っています

詳細についてはgitrefも参照してください


2

TortiseGITで切り替え/チェックアウトを行っているときに、実際にこれが起こりました。

私の問題は、別のローカルブランチに基づいてブランチを作成していたことでした。/.git/config次のような「マージ」エントリが作成されました。

[branch "web"]
    merge = refs/heads/develop
    remote = gitserver

「web」ブランチに切り替えるたびに、開発よりも先に100件以上のコミットがあったことがわかりました。まあ、私はもはや開発することを約束していなかったので、それは真実でした。このエントリを削除するだけで、期待どおりに機能しているようです。それは、developブランチの背後にあることについて不平を言うのではなく、リモート参照で適切に追跡しています。

Vikramが言ったように、このStack Overflowスレッドは、この問題を検索したときのGoogleのトップの結果なので、自分の状況と解決策を共有したいと思いました。


2

上記の@Marian Zburliaが述べたのと同じことを繰り返し述べたいと思います。それは私にとってはうまくいき、他の人にも同じことを提案するでしょう。

git pull origin develop

の後にはが続き$ git pull --rebaseます。

これにより$ git status、最新のプルの後に出てくるコメントが削除されます。


2

git fetch あなたのためにこれを解決します

私の理解が正しければ、ローカル(キャッシュ)origin/masterは古くなっています。このコマンドは、サーバーからリポジトリーの状態を更新します。


1
説明を追加してください
Mathews Sunny

2

次に、gitステータスを実行すると、ブランチがXコミット(おそらく私が行ったのと同じ数のコミット)によって進んでいることがわかります。

私の経験は、多くの支店を持つチーム環境での経験です。私たちは(ローカルクローンの)独自の機能ブランチで作業しており、git status11コミット先であることを示したものの1つでした。質問の作者のように、私の作業上の仮定は+11は自分のコミットからのものであるというものでした。

develop何週間か前にcommon ブランチからfeatureブランチに変更を取り込んだことがわかりましたが、忘れていました!私が今日ローカル機能ブランチを再訪してgit pull origin develop、数を行ったとき、その数は+41コミットに急増しました。多くの作業が行われたdevelopため、私のローカル機能ブランチは、originリポジトリの。

したがって、このメッセージが表示された場合は、アクセスできる他のブランチ(自分自身または他のブランチ)から行ったプル/マージを思い出してください。メッセージは、ちょうどあなたが必要とする信号git pushこれらのpullEDバックに変更するorigin事がアップsync'd得るためにあなたの地元のレポからレポ(「追跡ブランチ」)。


1

示唆する、git pullまたはgit fetch正しい答え。
メッセージはgit status.git/FETCH_HEAD.git/refs/remotes/<repository>/<branch>.git/refs/remotes/origin/master)の。

後者のファイルは、最後のフェッチからのHEADを記録します(リポジトリ/ブランチ用)。これgit fetchにより、両方のファイルがブランチの現在のHEADに更新されます。
もちろん、フェッチするものが何もない場合(ローカルリポジトリが既に最新であるため)、.git/FETCH_HEAD変更されません。


これは私には当てはまらないようです:.git/FETCH_HEADcontains 9f7336c873ccffc772168bf49807e23ff74014d3 branch 'master' of URL.git/refs/remotes/origin/mastercontainsですが9f7336c873ccffc772168bf49807e23ff74014d3、それでもメッセージを受信し、解決もしgit pullませんgit fetch
Davide

0

ブランチでファイルを追跡解除するためにコミットを実行した後にこのメッセージが表示された場合は、任意のファイルに変更を加えて、コミットを実行してください。どうやら、以前に追跡されたファイルの追跡解除のみを含む単一のコミットを行うことはできません。最後に、この投稿は問題全体https://help.github.com/articles/removing-files-from-a-repository-s-history/を解決するのに役立ちました。リポジトリの履歴からファイルを削除する必要がありました。

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