30

最近、私だけがコミットしているリポジトリで git から「強制更新」の警告を受け取りました。再ベースを行っていないので、なぜこれが起こったのかわかりません。私が知りたいのは、失われた可能性のある変更を見つけるにはどこを探すべきかということです。

説明のために、リポジトリの 3 つのコピー、L、D、および S (ラップトップ、デスクトップ、サーバー) があるとします。

まず、3 つのリポジトリはすべて同期しています。次に、D で作業が行われ、S にプッシュされます。次に、L が実行git pullされ、「強制更新」が行われます。これは、L に上書きされた変更があるということですか、それとも別の場所にあるということですか? どうすればそれらを見つけることができますか? ありがとう。

4

3 に答える 3

23

「強制更新」とは、リモート追跡ブランチが最近のものであることを意味します。これは、誰かがリポジトリに強制的にプッシュした後にフェッチ (またはプル) した場合に発生します。

ただし、 を実行してもgit pull、ローカル ブランチの履歴は失われません。リモート ブランチの履歴がローカルから分岐しgit pullたため、マージが実行されます。最新のコミット (単に run git log) を見ると、マージ コミットが表示されます。最初の親はローカル ブランチの以前の状態で、2 番目の親はリモート ブランチの新しい値です。

説明のために、強制更新のシナリオを再現したところgit pull、次のように出力されます。

> git pull
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 2 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (2/2), done.
From /Volumes/UserData/Users/kballard/Dev/Scratch/foo/server
 + 7193788...a978889 master     -> origin/master  (forced update)
Merge made by the 'recursive' strategy.
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 d

プルのフェッチ部分は を出力(forced update)しますが、新しい値origin/masterはその後ローカル ブランチにマージされます。

于 2012-08-21T22:17:49.327 に答える
6

私が知りたいのは、失われた可能性のある変更を見つけるにはどこを探すべきかということです。

地元の歴史が失われることはないとケビンが書いているのは正しい。それでも、意図的に失われますが、一部のリモート履歴が失われる可能性があります。

例えば:

  • masterD はコミットして Sにプッシュします。
  • L フェッチします。
  • Dは気が変わります(コミットを修正するかmaster、何らかの方法で履歴を変更します)。
  • D は、変更された (非早送り)masterを S にプッシュします。

フェッチ時に、L は「強制更新」を警告します。これは、前のブランチ ヒントがブランチ リファレンスを介して到達できなくなったためですmaster。しかし、それはとにかくDが望んでいたことです。

何を探すべきか

ケビンの答えから:

 + 7193788...a978889 master     -> origin/master  (forced update)

その行は一度だけ表示されます。失われた可能性のあるコミットへの参照は 7193788 です。

探索方法

L が失われる可能性のあるものへの参照を保持したい場合、L は上記の例の問題である可能性がありますgit branch whateverbranchname 7193788。これは、ローカル チェックアウトの現在の状態に関係なく実行できます。

またはgit checkout 7193788、頭から離れてそれを探索するだけで、たとえばgit checkout masterマスターに戻ることができます。これには、最初にローカルの変更をコミットする必要がある場合があります。

いい練習

他のユーザーとの適切な協力なしに変更履歴を共有リポジトリにプッシュすることは悪い習慣と見なされていることに注意してください(変更をまだ共有していない人に余分な作業が発生するため)。

言い換えれば、共有リポジトリでフェッチを行っているときに「強制更新」が表示されても、誰も驚くべきではありません。誰かが悪いコミットをプッシュした場合、既存の履歴を変更するのではなく、修正したコミットをプッシュすることを検討する必要があります。または、変更された履歴をプッシュする前に、他のユーザーと合意する必要があります。後者のオプションは、パブリック リポジトリでは使用できません。

于 2015-06-16T15:27:33.593 に答える