1. ホーム
  2. git

[解決済み】現在のブランチの先端がリモートブランチより遅れているため、更新が拒否されました。

2021-12-29 10:37:40

質問

私たちのワークフローはこのようなものです。 というブランチがあります。 dev で到達できる origin/dev . 変更を行う際には、devからブランチを作成します。

git checkout -b FixForBug origin/dev

というブランチを作成しました。 FixForBug を追跡している(という表現が適切だと思います)。 origin/dev . したがって、もし私が git pull から新しい変更を取り込むことになります。 origin/dev というのは素晴らしいことです。 さて、自分の修正が終わったら、同じ名前のリモートブランチにプッシュします。

まず origin/dev を作成し、リベースを行います。

git pull --rebase

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

git push origin FixForBug

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

を行う。 git push を実行すると、正常に動作し、リモートブランチが作成されます。 しかし、もし セカンド の時間(例えば、コードレビュー中に誰かが問題を指摘したとします)には、次のようなエラーが発生します。

error: failed to push some refs to 'https://github.mydomain.info/Product/product.git'
hint: 現在のブランチの先端がリモートのブランチより遅れているため、更新が拒否されました。リモートの変更を統合してから (たとえば hint: 'git pull ...') 再度プッシュしてください。
詳しくは 'git push --help' の 'ファストフォワードに関する注意' をご覧ください。

しかし、もし私が git status の前にいると表示されます。 origin/dev を1コミット差で実行すると(これは理にかなっている)、ヒントに従って git pull というメッセージが表示され、すべてが最新であると表示されます。 I 思う これは、私が上流のブランチとは異なるブランチにプッシュしているためです。 実行することでこの問題を解決することができます。

git push -f origin FixForBug

この場合、変更をリモートブランチにプッシュし、次のように表示します。 (強制更新) と、すべて 現れる は、リモートブランチでは良好です。

私の質問

なぜ -f は、このシナリオで必要なのでしょうか? 通常 強要 それは、あなたが何か間違ったことをしているか、少なくとも標準的な慣習に反することをしているからです。 リモートブランチを混乱させたり、私のものを最終的に開発版にマージする人に迷惑をかけたりしないか......こんなことをしてもいいのでしょうか?

解決方法は?

その -f は、リベースのために実際に必要です。 リベースを行うたびに強制プッシュを行う必要があります。なぜなら、リモートブランチはあなたのコミットに早送りすることができないからです。その場合 常に しかし、もし master や dev に強制的にプッシュするのが嫌なら、新しいブランチを作ってそこにプッシュし、マージするか PR を作成すればよいのです。