6

早送りができなかったために中央リポジトリへの Git プッシュが失敗する原因の簡単な例を教えてください。これが発生するためには、ローカルリポジトリと中央リポジトリの状態はどのように見える必要がありますか? これを視覚化するのに本当に苦労しています...

4

2 に答える 2

11

この問題が発生していると思います:

 ! [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 は最初に中央リポジトリから新しいコミットを取得する必要があります。

Bob が Alice のコミットを取得しました

彼は自分の変更 (コミット #4) を Alice の変更 (コミット #3) とマージし、両方のコミットを祖先とする新しいコミットを作成する必要があります。

Bob はコミットをマージしました

フェッチとマージは、2 つのコマンド (git fetchその後にgit merge) または 1 つのコマンド ( git pull) で実行できます。

これで、Bob は正常にプッシュできるようになりました。これは、新しいマスターが古いマスターを祖先として持っていることを中央リポジトリが認識しているためです。

ボブはマージをプッシュしました

Alice が Bob のコミットを見逃していることに注意してください。彼女がレポにさらにコミットし、中央レポからプルする前にプッシュしようとすると、非早送りエラーが発生し、ボブが行ったように、フェッチしてマージして修正する必要があります。

于 2012-08-06T20:15:41.477 に答える
0

ローカルリポジトリにプルせずに、同じブランチの中央リポジトリでコミットするだけです。次に、ローカルでコミットしてプッシュしてみます。

于 2012-08-06T19:59:58.477 に答える