早送りができなかったために中央リポジトリへの Git プッシュが失敗する原因の簡単な例を教えてください。これが発生するためには、ローカルリポジトリと中央リポジトリの状態はどのように見える必要がありますか? これを視覚化するのに本当に苦労しています...
2 に答える
この問題が発生していると思います:
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to '/Users/mayoff/t/test/central'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again. See the
'Note about fast-forwards' section of 'git push --help' for details.
「非早送り更新が拒否された」問題がどのように発生するかを次に示します。
アリスとボブがプロジェクトに取り組んでいるとしましょう。それぞれにリポジトリがあり、プッシュ先とプル元の両方の中央リポジトリがあります。最初は、3 つのリポジトリは次のようになります。
ここで、アリスとボブの両方が何らかの作業を行います。それぞれがローカル リポジトリに異なる変更をコミットします。
次に、アリスは自分の変更を中央リポジトリにプッシュします。
次に、ボブはプッシュしようとします。中央レポのマスター ブランチは、コミット 3 を指しています。ボブのプッシュは、コミット 4 を指すようにそれを更新しようとします。コミット 4 はコミット 3 を祖先として持っていないため、マージが必要ですが、git push
実際のマージは行いません。新しいマスターが古いマスターを先祖として持つ「早送り」のみを行います。ボブは、早送りではなく実際のマージを必要とするものをプッシュしようとしているため、エラーが発生します。
正常にプッシュするには、Bob は最初に中央リポジトリから新しいコミットを取得する必要があります。
彼は自分の変更 (コミット #4) を Alice の変更 (コミット #3) とマージし、両方のコミットを祖先とする新しいコミットを作成する必要があります。
フェッチとマージは、2 つのコマンド (git fetch
その後にgit merge
) または 1 つのコマンド ( git pull
) で実行できます。
これで、Bob は正常にプッシュできるようになりました。これは、新しいマスターが古いマスターを祖先として持っていることを中央リポジトリが認識しているためです。
Alice が Bob のコミットを見逃していることに注意してください。彼女がレポにさらにコミットし、中央レポからプルする前にプッシュしようとすると、非早送りエラーが発生し、ボブが行ったように、フェッチしてマージして修正する必要があります。
ローカルリポジトリにプルせずに、同じブランチの中央リポジトリでコミットするだけです。次に、ローカルでコミットしてプッシュしてみます。