4

私たちがアーロンと呼ぶ同僚は、長期プロジェクトとしてウェブサイトのセクションを改修するように割り当てられました。彼は、という名前の新しい Git ブランチを作成しましたaaron。彼の変更はすべてこのブランチで行われました。彼が働いている間、私はサイト全体を維持し続け、私の変更を にコミットしましたmaster

最終的に、Aaron は自分のブランチを にマージしましたmastermasterこれにより、マージ時からaaronブランチが最初に作成された時までに行ったすべてのコミットが何らかの形で元に戻りました。と入力git show <hash of merge commit>すると、アーロンがブランチで作業している間に変更したすべてのファイルの差分が表示されます。これらの差分は、私が行ったすべての変更の元に戻ったことを示しています。masterAaron が自分のブランチの各ファイルの内容を手動でコピーし、変更をコミットした場合と同じように見えます。(彼はこれをしませんでした。ログが何を示しているかを説明しようとしているだけです。)

アーロンによると、彼は何も変なことはしていません。彼はただ走ったと言いgit pull origin/aaronます。

何が原因でしょうか? git pull origin aaronすべての変更を に戻した可能性はありmasterますか?

また、master の作業をすべて元に戻さずに、自分の変更を master に戻す簡単な方法はありますか?

編集1:

masterで変更され、マージ後に元に戻されたファイルの 1 つはfoo.txt. だから私はこれをしました:

git checkout aaron
git log foo.txt

ログには、ブランチが作成された時点以降の変更は反映されません。ブランチのログのどこかで変更が元に戻されることを期待していましたが、そうではありませんでした。では、これは、アーロンが行ったと主張する単純な引っ張り以外の何かを行ったという最終的な証拠でしょうか?foo.txtaaronaaron

編集2:

私は彼がタイプorigin/aaronしたと言いましたが、彼は実際にタイプしましたorigin aaron。上記に変更させていただきました。

編集3

以下の提案に従って、履歴を書き換えることでこれを解決することにしました。私はこの時点で、問題が衝突を解決しようとする誤った試みによって引き起こされたと確信しています。

4

2 に答える 2

5

これを行う唯一の方法は、 (おそらく を使用して)のすべての変更を破棄した最初のからへgit pull origin/aaronのマージがあった場合です。masteraaronmastergit merge -s ours master

履歴を確認してください。masterからへの以前のマージはありますaaronか? そして、彼らは の変更を破棄しmasterますか? 何もない場合、唯一の説明は彼が走っていないというgit pull origin/aaronことです.

変更を元に戻すことに関しては、彼のマージを取り消して、自分で再作成することができます。それは履歴を変更することになりますが、それでよければ、それが最も簡単な解決策です。それがうまくいかない場合は、少し複雑になります。その場合、一時的なブランチを作成し、彼のマージを取り消して、正しく再マージする必要があります。次に master に戻って実行しますgit read-tree tempbranch。これにより、一時的な正しいマージの結果でインデックスが更新されます[1]。その後、これをコミットできます。

[1]: これは作業ツリーを変更しないことに注意してくださいgit checkout -- .

于 2013-01-17T22:12:38.843 に答える
2

すべての変更がマージ コミットで発生したことを考えると、悪質なマージと呼ばれるものが表示されます。 man gitglossary次のように定義します。

       evil merge
       An evil merge is a merge that introduces changes that do not appear in any
       parent.

これが何を意味するかについては、この回答に説明があります。知っておくべき重要なことは、これは git が単独で行うことではないということです。邪悪なマージを作成するには、何らかの方法で人間の介入が必要です。

私がよく見たのは、誰かがマージを行い、競合のために混乱したときです。たとえば、aaron がプルを開始し、コンフリクトに圧倒され、既存のファイルの上に自分のファイルをコピーすることでコンフリクトを解決しても安全だと判断した場合に、これが発生する可能性があります。これを行った後に彼がマージコミットを行うと、まさにこれが表示されます。

それを修正する限り、可能であれば、 Kevin Ballardが提案したことを行います。 git -reset --hardmaster ブランチをマージ前の状態に戻し、マージをやり直します。

于 2013-01-18T20:41:40.160 に答える