VonCによって提示されたものに代わる解決策は、「私たちの」マージ戦略を使用して履歴を結合することですが、1 つのバージョンを取ることです。
$ git checkout -b tmp original-repo/master
$ git merge -s ours master # take version from 'tmp', i.e. from 'original-repo/master'
$ git checkout master
$ git merge tmp # should be fast forward
$ git branch -d tmp # 'tmp' branch is no longer needed
上記で行うことは、要するに「彼らの」マージを行うことです。
警告:このソリューション は、最後のマージ (最後の更新) 以降、ローカル ブランチに他のコミットがない場合にのみ、元の問題を解決します。
したがって、このソリューションでは、問題を解決したバージョンを履歴に残すことができますが、アプリケーションがより制限されます。
以下は、各ステップでリポジトリで何が起こっているかを示す一連の ASCII アート図です。
- 最初のコマンドの前:
\*---\*---x---A <-- original-repo/master (リモート追跡ブランチ)
\
\\--a---b <-- マスター <-- HEAD
- "
git checkout -b tmp original-repo/master
" の後:
<-- 元のレポ/マスター、
*---*---x---A <-- tmp <-- HEAD
\
\--a---b <-- マスター
ここで、「tmp」(ローカル ブランチ) と「original-repo/master」(リモート追跡ブランチ) の両方が同じコミットを指しています。
- "
git merge -s ours master
" の後:
/-------------- 元のレポ/マスター
v
*---*---x---A----A' <-- tmp <-- HEAD
\ /
\--a---b <-- マスター
ここで、コミット A' はマージ コミットですが、コミット A と同じ内容 (同じツリー) です。
- "
git checkout master && git merge tmp
" の後 (マージは早送りする必要があります):
/-------------- 元のレポ/マスター
v
*---*---x---A----A' <-- tmp,
\ / <-- マスター <-- HEAD
\--a---b
「マスター」と「tmp」の両方が同じコミットを指しています。
- "
git branch -d tmp
" の後、および図の再編成
\*---\*---x---A-----\ <-- 元のリポジトリ/マスター
\ \
\\--a---b---A' <-- マスター <-- HEAD
最後に:
- リモート追跡ブランチ '
original-repo/master
' (すなわち ' refs/remotes/original-repo/master
') はコミット A を指し、
- 現在のブランチであるローカル ブランチ '
master
' (つまり ' refs/heads/master
') は、コミット A' を指しています。
コミット A' には次のものがあります。
- A を最初の親 (
A'^1 == A
) としてコミットし、
- b を 2 番目の親としてコミット (
A'^2 == a
)、
- その内容 (ツリー) はコミット A (
A'^{tree} == A^{tree}
) と同じです。