11

これは当たり前の答えになると思いますが、うまくいかないようです。

何が起こっているように見えるかというと、サーバーにいくつかの変更をコミット/プッシュすると、コピーではすべてが正常に表示されます。

次に、別の開発者が同じブランチからサーバーからプルし(私が知る限り、私の変更を確認したとされています)、いくつかの変更を加え、それらを独自のローカルコピーにコミットして、最後にサーバーにプッシュします。

これを実行している途中のどこかで、プッシュ(326c8fd0 ...)によって多くの削除/追加行とのマージが発生し、リポジトリがはるかに古いリビジョンにリセットされるため、変更が失われます。これは、リポジトリの新しいコピーを使用した場合でも、数回発生しています。

以下の強調表示された行(8def6e9 ..)は私が行ったコミットであり、他の開発者が変更をプルしたと仮定すると、次のコミットはこの同じブランチにあるはずです。マージは326c8fd0で発生し、リポジトリが誤ってリセットされ、以前の変更が失われます。

TortoiseGitログ

なぜこれが起こっているのかについて、私は非常に明白な何かを見逃していますか?どちらもTortoiseGitを使用しています。

おそらく漠然とした説明でごめんなさい。

4

2 に答える 2

11

あなたの例では、誰かがf36908d(最初の親;マージ時のHEAD)と8def6e9(2番目の親;おそらくマージ時の元のブランチの先端)をマージして326c8fd0を生成しています。

マージコミット(326c8fd0)が、その親(f36908dおよび8def6e9、後者の一部が欠落していると言う)に関して重要なコンテンツが欠落している場合、マージコミットを作成する人は、おそらく不適切な方法でマージを実行しています。ファッション。

この人は、oursマージ戦略(-s ours/でマージまたはプル--strategy=ours)、oursデフォルトの再帰的マージ戦略のオプション(/でマージまたはプル-X ours--strategy-option=oursを使用している可能性があります。または、マージの競合を手動で解決するときに誤った決定を行っている可能性があります。

このours戦略では、最初の親を除くすべての親の履歴で行われたコンテンツの変更は完全に無視されます。マージコミットとその最初の親(つまり、それらの変更)は同一のツリーを持つ(つまりgit diff f36908d 326c8fd0、違いを示さない)ため、通常、このタイプのマージを識別できます。

マージ戦略オプションはours、2番目の親の履歴からの変更(つまり、変更)も無視しますが、最初の親の履歴で行われた変更(つまり、変更)と競合するものだけを無視します。この場合、2番目の親からの一部の変更が結果に反映される可能性がありますが、他の変更は完全に削除される可能性があります。

他の可能性のある代替案は、デフォルトのマージ中に生成された競合を解決しながら、彼らが悪い決定をしているだけであるということです。

いずれにせよ、誰かがマージを行ったユーザーと話し合って、彼らが何をしたのか、そしてなぜそれを行ったのかを調べて、将来問題を防ぐためのポリシーを考案できるようにする必要があります。


回復するには、自分でマージをやり直して、結果を履歴の現在のヒントにマージします。

git checkout -b remerge f36908d
git merge 8def6e9
# resolve conflicts and commit
git checkout develop
git merge remerge
# maybe resolve more conflicts

# eventually: git branch -d remerge

または、履歴の書き換えに問題がない場合:

git checkout -b remerge f36908d
git merge 8def6e9
# resolve conflicts and commit
git rebase --onto remerge 326c8fd0 develop
# maybe more conflicts to resolve at each rebased commit
于 2011-05-26T03:50:53.057 に答える
0

コミットを失っている場合は、拒否されたものを取り除くために、どちらもGUIで--forceまたはforceフラグを使用していないことを確認してください。DAGの説明を見てください。

http://progit.org/book

お役に立てれば。

于 2011-05-25T23:28:35.337 に答える