1. ホーム
  2. ギット

[解決済み】Featureブランチのリベースの後、Gitプッシュが拒否される。

2022-03-23 13:22:58

質問

OK、これは単純なgitのシナリオだと思ったのですが、何か見落としているのでしょうか?

私の場合は master ブランチと feature ブランチを作成します。私はいくつかの作業を master で、一部は feature で、さらに master . 最終的にはこんな感じになります(辞書順はコミット順を意味します)。

A--B--C------F--G  (master)
       \    
        D--E  (feature)

に問題はありません。 git push origin master を残して、リモートの master は更新されず、また git push origin feature (オン feature ) のリモートバックアップを維持するために、私の feature の仕事をします。今までは、問題なかった。

しかし、今度は feature の上に F--G はmasterにコミットしているので git checkout featuregit rebase master . まだいい。今、私たちは

A--B--C------F--G  (master)
                 \
                  D'--E'  (feature)

問題あり。 をバックアップしたいのですが、リベースされた新しい feature で分岐した git push origin feature , プッシュが拒否される リベースによりツリーが変更されたため。これを解決するには git push --force origin feature .

を使うのは嫌だ。 --force 必要性を確認せずに では、必要なのでしょうか?リベースは 必ず は、次の push であるべきです。 --force ということですか?

この機能ブランチは他の開発者と共有されていないので、問題はありません。 デファクト 問題はもっと概念的なことです。

どのように解決するのですか?

問題は git push つまり、ローカルブランチとリモートブランチの違いは、ローカルブランチの末尾に新しいコミットがあるかどうかだけである、と仮定しています。

Z--X--R         <- origin/some-branch (can be fast-forwarded to Y commit)
       \        
        T--Y    <- some-branch

を実行すると git rebase コミットDとEが新しいベースに適用され、新しいコミットが作成されます。つまり、リベース後はこのような状態になります。

A--B--C------F--G--D'--E'   <- feature-branch
       \  
        D--E                <- origin/feature-branch

そのような状況では、リモートブランチをローカルに早送りすることはできません。しかし、理論的にはローカルブランチをリモートにマージすることができます (もちろん、そのようなことは必要ありません)。 git push は早送りのみのマージを実行するため、エラーが発生します。

そして、何 --force オプションが行うのは、リモートブランチの状態を無視してそこにプッシュしているコミットを設定することだけです。つまり git push --force origin feature-branch を単純にオーバーライドします。 origin/feature-branch をローカルな feature-branch .

私見では、機能ブランチのリベースは master で、それをリモートリポジトリに強制的に戻すのは、そのブランチで作業しているのが自分だけである限りOKです。