リベースを行い、100 個のファイルに競合があるとします。一つ一つ解決していかなければなりません。(N-1) 個のファイルを解決し、ファイル N で作業しているとしましょう。しばらく作業した後、ファイルがめちゃくちゃになっていることに気付きました。だから、もう一度ゼロから解決したい。しかし、(N-1)ファイルを再度解決したくないので、リベースを中止してリベースをやり直したくありません。
ファイル N のみのマージ競合を回復して、最初から解決できるようにすることはできますか?
作業中のファイルに名前が付けられtest.txt
ており、マージの試行によりファイルに競合マーカーが残っていて、それらの競合を手動で解決するのに失敗した場合は、競合マーカーを使用してファイルを再作成できます。いくつかのコマンドで。
背景として、マージでファイルの競合を手動で解決する必要がある場合、そのファイルの3つの異なるコピー(「ステージ」と呼ばれる)がgit
インデックスに残ることを知っておくと役立ちます。ステージ1は、マージされるファイルの2つのバージョンの共通の祖先であり、ステージ2と3は、マージしようとしている2つのブランチの2つのバージョンです。すべてではありませんが、一部のgit
ユーティリティは、:<stage>:<filename>
これらのエントリを参照するための構文を理解しています。
したがって、最初に行う必要があるのは、これら3つのファイルの一時的なコピーをどこかに再作成することです。/tmp
ここで使用しますが、必須ではありません。
git cat-file -p :1:test.txt > /tmp/test.txt.1
git cat-file -p :2:test.txt > /tmp/test.txt.2
git cat-file -p :3:test.txt > /tmp/test.txt.3
次に、git
plumbingコマンドgit merge-file
を使用して、適切な競合マーカーを含むファイルを再作成します。ここでは引数の順序が重要であり、マージを再実行するときに参照する場合に備えて、このファイルですでに行った作業を保存しておくことをお勧めします。
mv test.txt test.txt.broken
git merge-file -p /tmp/test.txt.2 /tmp/test.txt.1 /tmp/test.txt.3 > test.txt
これは競合マーカーを使用して再作成されますtest.txt
(ただし、通常含まれるブランチ名のコメントはありません-本当に必要な場合は、いくつかの-L <branchname>
引数を追加する必要があります-入力git help merge-file
して詳細情報を取得できます)。
その時点で、一時ファイルをクリーンアップして、そのファイルの競合の解決を最初からやり直すことができます。終わったらそれを覚えておいてgit add
、残りのファイルを続けてください。
を探していると思いますgit checkout --merge --
path/to/file
。
あまり良い解決策ではないかもしれませんが(あまりgitっぽくないように見えます)、考えられる方法の1つを次に示します。