2012-08-06 9 views
5

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

+0

優秀な質問!多くの人々はそれを理解していませんが、私がこれで見つけたほとんどの質問はそれほどよく書かれていません。 – erikbwork

答えて

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つのリポジトリには、次のようになります。

initial synchronized repos

今、アリスとボブは両方のいくつかの作業を行います。

private repos have new commits

次に、アリスは中央リポジトリに彼女の変更をプッシュ:

central repo updated by Alice

次に、ボブはプッシュしようとするには、それぞれのローカルリポジトリへの別の変更をコミットします。ボブのプッシュはコミット4を指すように更新しようとします。コミット4は先祖としてコミット3を持たないので、マージが必要ですが、git pushは実際のマージを行いません。新しいマスターが古いマスターを祖先として持つ、「早送り」のみです。ボブは、早送りではなく、実際のマージを必要とするものをプッシュしようとしているので、エラーが発生します。

に成功プッシュし、ボブはまず、中央リポジトリから新しいコミットを取得する必要があります:

Bob has fetched Alice's commit

と彼はアリスの変更(#3をコミット)と(#4をコミット)彼の変更をマージする必要があります、新たにそれが有する両方のコミットを作成する祖先としてコミット:

Bob has merged the commits

フェッチと続いて二つのコマンド(git fetchで行うことができるマージ)または1つのコマンド(git pull)です。

ここで、ボブは正常に押し込むことができます。中央のレポは、新しいマスターが古いマスターを祖先として持つことを確認するためです。今アリスはボブのコミットが欠落している

Bob pushed the merge

注意してください。中央リポジトリから引き出す前にプッシュしようとすると、早送り以外のエラーが発生し、ボブと同じようにフェッチしてマージして修正する必要があります。

+0

私はすべての私の矢印が間違った方向を指していることに気付いた。しかたがない。うまくいけば十分にはっきりしています。 –

+0

さて、今はgitツリーではなく、時間の経過とともに開発を示しています。それはあまりにも悪くありません。 – erikbwork

+0

整合性が鍵です。時間の進行方向を指し示すことは、実際にはより快適になることがあります。 – araqnid

0

ローカルブランチに引っ張らずに同じブランチの中央リポジトリをコミットするだけです。次にローカルにコミットしてプッシュしようとします。

関連する問題