すると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
。