3

を実行するgit pushと、次のエラーが発生することがあります。

error: failed to push some refs
To prevent you from losing history, non-fast-forward updates were rejected

早送り以外の更新をプッシュすると、履歴が失われる状況の例を誰かが挙げることができますか? 私の理解でgit pushは、そうすると、git はコミットをリモート リポジトリにプッシュするだけで、既存のコミットは削除されません。

ありがとう!

4

2 に答える 2

5

するとpush、コミットを送信しますが、リモート ブランチも更新します。

リモートリポジトリは次のとおりです。

A <- B <- C (master)

次に、それを複製し、コミット A から始まるいくつかの dev を作成し、最終的には次のようになります。

A <- B <- C (origin/master)
  <- D <- E (master)

強制的にプッシュすると、リモート リポジトリは次のようになります。

A <- D <- E (master)
  <- B <- C

したがって、コミット B と C はまだ存在しますが、ブランチでは到達できません。そして、誰かが今レポをクローンすると、ローカルに次のようになります。

A <- D <- E (master; origin/master)

つまり、彼の観点からすると、コミット B と C は失われます。


編集:

  • 「コミットがまだ存在する」とは、次のことを意味します。

私のコミット B に sha1 があるとしabcdefます。次に、objects/ab/cdefこのコミットを表すファイルがあります (リモート リポジトリのルートとローカル クローンの .git ディレクトリにあります)。

の場合push -f、このリモート ファイルは削除されないため、コミット B はリモート リポジトリにまだ存在します。(少なくとも、ガベージコレクトされない限り)

  • 「しかし、ブランチでは到達できません」とは、次のことを意味します。

私が強制的に押した後、他の誰かがこのリモコンのクローンを作成すると、彼はこの.git/objects/ab/cdefファイルを取得します。ただし、探していない限り、このコミットがかつて存在していたことに気付かないでしょう。たとえば、 では表示されませんgitk --all

于 2013-11-17T09:06:21.523 に答える
0

localmasterを remote にプッシュするとしますmaster

ローカル ブランチとリモート ブランチが分岐した場合 (最後にプルしてから両方にコミットがあった場合)、どのように処理されますか?

master1 つの方法は、ローカルの現在のコミットを新しいリモートとして宣言することmasterです。ただし、現在リモートにあるコミットの履歴が失われmasterます。コミットの祖先には表示されないためです。

(「失われた」コミットはまだリモートに存在すると思いますが、masterブランチにはありません。)

于 2013-11-17T09:01:24.643 に答える