現在のブランチの先端が遅れているため、更新は拒否されました


154

私はGitを初めて使用するので、初心者のように扱ってください。

私たちのワークフローはそのようなものです。と呼ばれるブランチがdevありorigin/devます。変更を行う場合、devからブランチを作成します。

git checkout -b FixForBug origin / dev

今私FixForBugは追跡していると呼ばれるブランチを持っています(私はそれが正しい言葉だと思います)origin/dev。したがって、私が行う場合git pullorigin/devそれは素晴らしい変更をもたらすでしょう。修正が終わったら、同じものと呼ばれるリモートブランチにプッシュします。

まず、変更をプルダウンしorigin/devてリベースします。

git pull --rebase

次に、同じ名前のリモートブランチに変更をプッシュします。

git push origin FixForBug

これで、リモートサーバーにブランチがあり、その変更を承認してdevブランチにマージするためのプルリクエストを作成できます。私はしていない、これまでには、何もプッシュしorigin/dev自分自身。これはかなり一般的なワークフローだと思います。

初めてを実行するとgit push、正常に動作し、リモートブランチが作成されます。私がプッシュする場合は、第二回(のは誰かのポイント問題外、コードレビュー時に言わせて)、私は次のエラーを取得します:

エラー:一部の参照を ' https://github.limeade.info/Limeade/product.git ' にプッシュできませんでしたヒント:現在のブランチのヒントがヒントの背後にあるため、更新は拒否されました:リモートの対応物。再度プッシュする前に、リモートの変更(例:ヒント: 'git pull ...')を統合します。ヒント:詳細については、「git push --help」の「早送りに関する注意」を参照してください。

ただし、aを実行するgit statusorigin/dev、1コミット(これは理にかなっている)だけ進んでいることを示し、ヒントに従ってrunを実行git pullすると、すべてが最新であることを示します。私が考えて、私は私の上流分岐とは異なるブランチにプッシュしていますので、これはです。次のコマンドを実行して、この問題を修正できます。

git push -f origin FixForBug

その場合は、(強制更新)と言って、変更をリモートブランチにプッシュし、すべてリモートブランチで正常に動作しているように見えます

私の質問:

-fこのシナリオでなぜ必要なのですか?通常、何かを強制しているとき、それはあなたが何か間違ったことをしていたか、少なくとも標準的な慣習に反しているからです。私はこれをしても大丈夫ですか、それともリモートブランチで何かを台無しにしたり、最終的に私のものを開発にマージしなければならない人のために面倒を作成したりしますか?


2
表示されるメッセージは、リモートブランチFixForBugがローカルブランチFixForBugよりも進んでいることを示しているようです。プッシュする前に、そのリモートブランチから変更をプルダウンし、ローカルブランチにマージする必要があります。
mhatch 2016

4
@mhatch-それで、git pull origin FixForBug私がそれにプッシュする前に基本的に実行しますか?わかりました。回答として追加してください!
マイククリステンセン

回答:


199

これ-f 、リベースのために実際に必要です。リモートブランチはコミットに早送りできないため、リベースを行うときは常に強制プッシュを行う必要があります。あなたはと思い、常にあなたがプッシュする前にプルを行うことにしたいが、あなたはそのことについては、マスタまたはDEVに力押しのは好きではない場合、あなたはにプッシュする新しいブランチを作成し、PRをマージしたりすることができます。


2
この非常に役立つ回答をありがとう!:)
AIM_BLB

1
「プッシュする前に必ずプルするようにしたい」というポイントを明確にしていただけませんか?ローカルブランチのリベース後に「push -f」が必要な理由は明らかです。この場合、プッシュする前にリモートでプルを実行して、ローカルのリベースを元に戻しませんか?
haripkannan

51

ローカルブランチFixForBugがリモートブランチFixForBugよりも前にないことを確認するには、プッシュする前に変更をプルしてマージします。

git pull origin FixForBug
git push origin FixForBug

2
OPは、すでにgit pullを実行してプッシュを試みたと述べています。あなたの答えはOPの質問には適用されません。
Patrick

1
強制的なプッシュは避けた方がよいでしょう。これを共有してくれてありがとう!
アンキルツァー

16

を使用する必要がないようにしたい場合は-f

git pull

の代わりに

git pull --rebase

非リベースはからの変更を取得しますorigin/devし、マージ、あなたにそれらをFixForBugブランチ。その後、実行することができます

git push origin FixForBug

使用せずに-f


3
ここでは、リベースはワークフローの一部です。やらないと怒られます。
Mike Christensen

1
@MikeChristensen:わかりました。もちろん、文書化された手順に従ってください。あなたが説明していることから、アップストリームリポジトリのコミットを、異なる(リベースの)履歴を持つ別のものに置き換える-fため、使用する必要があります。Gerritなどの製品を使用する場合、プッシュ時に使用する必要なく、この種のリベースコードレビューワークフローをサポートします。私たちはこのように仕事でGerritを使用し、それは非常にうまく機能します。-f
グレッグヒューギル2016

12

the tip of your current branch is behind its remote counterpartリモートブランチでローカルにない変更があったことを意味します。そしてgitは、新しい変更をインポートREMOTEしてコードにマージし、pushそれをリモートにマージするよう指示します。

このコマンドを使用して、ローカルリポジトリ()でサーバーを強制的に変更できます。

git push -f origin master

-fタグあなたは上書きされますRemote Brach codeあなたのコードで。


6

「現在のブランチの先端が遅れているため、更新が拒否されました」というメッセージが表示されたときにAzure DevOpsで使用したコマンドは、次のとおりです。

git pull origin master

(または、新しいフォルダーから開始してクローンを作成できます)..

この回答は、提起された質問には対応していません。具体的には、Keifは上記で回答しましたが、質問のタイトル/見出しテキストに回答します。これは、Azure DevOpsユーザーにとって一般的な質問です。

私はコメントを書きました:上記のKeifからの回答で、「プッシュする前に、常にプルを行うことを確認したいのです!」

Gitコマンドラインツールに加えて、Git Guiツールも使用しました。

(Git Gui内でコマンドラインコマンド「git pull origin master」に相当するコマンドを実行する方法がわからなかったため、コマンドラインに戻ってこれを行います)。

実行する可能性のあるさまざまなアクションのさまざまなgitコマンドを示す図は次のとおりです。

ここに画像の説明を入力してください


4

これはちょうど私に起こりました。

  • 昨日マスターにプルリクエストをしました。
  • 私の同僚はそれを今日レビューしていて、それが私たちのマスターブランチと同期していないことを知ったので、私を助けるために、彼はマスターを私のブランチにマージしました。
  • 彼がそれをしたとは知らなかった。
  • 次に、マスターをローカルでマージし、それをプッシュしようとしましたが、失敗しました。どうして?同僚とmasterをマージすると、ローカルにはない追加のコミットが作成されたためです。

解決策:自分のブランチをプルダウンして、追加のコミットを取得します。次に、それを私のリモートブランチにプッシュします。

文字通り私が私のブランチでしたことは:

git pull
git push

3

これは私が私の問題を解決した方法です

上流ブランチが分岐したものであり、オリジンがレポであり、MR / PRを上流ブランチに送信するとします。

あなたはすでに4つのコミットについて言っていて、あなたは得ています Updates were rejected because the tip of your current branch is behind.

これが私がやったことです

まず、4つのコミットをすべて潰します

git rebase -i HEAD~4

pick書き込まれたコミットのリストが表示されます。(エディターで開きます)

pick fda59df commit 1
pick x536897 commit 2
pick c01a668 commit 3
pick c011a77 commit 4

pick fda59df commit 1
squash x536897 commit 2
squash c01a668 commit 3
squash c011a77 commit 4

その後、組み合わせたコミットを保存できます

コミットを隠しておく必要があります

ここに方法があります

git reset --soft HEAD~1
git stash

上流のブランチでリベースする

git fetch upstream beta && git rebase upstream/beta

隠されたコミットをポップします

git stash pop

これらの変更をコミットしてプッシュする

git add -A
git commit -m "[foo] - foobar commit"
git push origin fix/#123 -f

2

コミットが現在のプッシュよりも進んでいるためです。

1)git pull origin "プッシュしたいブランチの名前"

2)git rebase

git rebaseが成功した場合は問題ありません。それ以外の場合は、すべてのマージの競合をローカルで解決し、リモートでのリベースが成功するまで続行します。

3)git rebase-続行


0

Visual Studio Codeを介してリベース後にプッシュしようとしたときにこの問題がありました。git出力ウィンドウからコマンドをコピーし、Visual Studio Codeのターミナルウィンドウから実行するだけで問題が解決しました。

私の場合、コマンドは次のようなものでした:

git push origin NameOfMyBranch:NameOfMyBranch

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