Gitによると、ローカルブランチはリモートブランチの背後にありますが、そうではありません


82

シナリオ:

  1. 新しいブランチを作ります
  2. それをハックする
  3. コミットする
  4. 押して
  5. もう少しハックする
  6. もう一度コミットする
  7. もう一度押してみてください

Gitは応答します:

現在のブランチの先端がリモートのブランチの背後にあるため、更新は拒否されました。等

このブランチをハッキングしているのは私だけです。他の誰もそれに触れていません。リモートブランチは実際はローカルブランチの背後にあります。引っ張る必要はまったくないはずです。

(そして、プルすると、Gitは2つの間の競合を報告し、ブランチをそれ自体にマージするように強制します)

なぜこれが(起こりそうに)起こっているのですか?そして、どうすればそれを診断/修正できますか?

明確にするために、私はどこにも分岐しておらず、他の誰もそれに取り組んでいません

Remote: Commit A -------- Commit B  

Local:  Commit A -------- Commit B -------- Commit C  

CはBの単純な続きであり、分岐は含まれません。しかし、gitはCがAのブランチであると考えています:

Remote: Commit A -------- Commit B  

                  ------- Commit C  
                /  
Local:  Commit A -------- Commit B  

そうではありません; それはBのまっすぐな続きです。


1
git remote -vand git show remote origin(オリジンが問題のあるリモートであると仮定)の出力が役立つ場合があります
Ben Graham

回答:


196

おそらく歴史を書き直したのですか?ローカルブランチがサーバー上のブランチから分岐しました。このコマンドを実行して、何が起こったのかをよりよく理解します。

gitk HEAD @{u}

このエラーの原因を理解することを強くお勧めします。これを修正するには、次のコマンドを実行します。

git push -f

-fこの「強制プッシュ」を作ると上書きされ、サーバー上の枝を。あなたがチームで働いているとき、それは非常に危険です。しかし、あなたはあなた自身であり、あなたの地元の州が正しいことを確認しているので、これは問題ないはずです。そうでない場合は、コミット履歴を失うリスクがあります。


13
それだけです。ステップ2で、「最後のコミットを修正」を実行してからプッシュし、さらにハッキングしてから、もう一度プッシュしようとしました。アメンドのしくみを誤解しました。ありがとう!
Tim Janke 2012年

4
これは本当に便利なようですが、誰かが「HEAD @ {u}」構文を説明できますか?
ChrisV 2013

5
HEAD@{u}参照の両方がコミットを参照します。表示するブランチをgitkに指示します。HEAD現在チェックアウトされているブランチを指し、はの@{u}HEAD@{u}で、現在チェックアウトされているブランチのアップストリームブランチを表します。だから例えば。master、それは通常origin/masterです。
クロニアル2013

同じシナリオがありました-再スキャンを実行し、競合をマージする必要がありました。使用gitkすることは大いに役立ちました!
brichins 2016

ローカルで(修正ではなく)多くの単純なコミットを行い、プッシュしようとすると、私に起こります。私は他の誰もgithubで物事を変えていないことを知っています。Gitkは、リモートがローカルとは異なるように実際に表示しましたが、予想されていたにもかかわらず、ローカルをリモートよりも新しいバージョンとして表示し、リモートをフォークとして表示する必要はありません(そのように見えましたが、gitkの説明はあまりわかりません)
アクエリアスパワー

5

解決策は非常に簡単で、私のために働いた。

これを試して :

git pull --rebase <url>

その後

git push -u origin master

4

これは、開発ブランチをプッシュしようとしたときに発生しました(gitフローを使用しています)。誰かがマスターに更新をプッシュしました。それを修正するために私はしました:

git co master
git pull

それらの変更をフェッチしました。次に、

git co develop
git pull

それは何もしませんでした。エラーメッセージにもかかわらず、開発ブランチはすでにプッシュされていると思います。すべてが最新であり、エラーはありません。


0

それを診断するには、この答えに従ってください

しかし、それを修正するには、あなただけがそれを変更していることを知って、次のようにします:
1-プロジェクトをバックアップします(私はgit、。/ srcフォルダーのファイルのみを実行しました)
2-git pull
3 -多くの「混乱」のファイル(上のバックアップあなたを復元しますマージインジケーター付き)

私は試した git pull -s recursive -X oursが、思い通りに動作しませんでした。それはオプションかもしれませんが、最初にバックアップしてください!!!

(git guiでの)違い/変更がないことを確認してください。これは私の場合です。マージするものは何もありませんが、githubはマージする必要があると言い続けます...

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