1 つのファイルが git と競合状態にあるとします。
これは、インデックスにファイルの 3 つのバージョンが含まれていることを意味します。前のバージョン、あるブランチのバージョン、別のブランチのバージョンです。
作業ディレクトリでバージョン 3 (「自分の」) をチェックアウトし、インデックスでバージョン 2 (「私たちの」) をステージングしたいと考えています。
それを行うための痛みのない方法はありますか?
おそらく、最も痛みのない方法はこのようなものです。
# Checkout 'their' version from the index into the working tree
git checkout --theirs file
# reset the index to the HEAD version, i.e 'our' branch
git reset HEAD file
(いわば)紛失していない限り、配管でインデックスをupdate-index
いじる必要はありません。HEAD
その秘訣は、「インデックスに 1 つのバージョンを追加する」ことにあります。これにより、ファイルは解決済みとしてマークされます (つまり、「私たちのもの」または「彼らのもの」はなくなります)。
したがって、それは最後のステップである必要があります。
たぶん次のようなもの:
git show :3:<filename> > <filename>.theirs # save the "theirs" version in a tmp file
git show :2:<filename> > <filename> # display the "ours" version in the working dir
git add <filename> # add it to the index
# (marking the conflicting file as resolved)
move <filename>.theirs <filename> # erasing the file with the "theirs" version
# in the working directory
「無痛」とは言えませんが…
一時ファイルを回避するために、Jakub Narębskiは (配管コマンド) を使用git update index
してインデックスを直接操作することを提案しています。
--replace --cacheinfo <mode> <object> <path>
--cacheinfo
現在の作業ディレクトリにないファイルを登録するために使用されます。これは、最小チェックアウトのマージに役立ちます。デフォルトでは、インデックスにファイル パスが存在する場合、git update-index は追加の試行を拒否し
path/file
ます。同様に、ファイルpath/file
が存在する場合、ファイル パスを追加することはできません。フラグを指定すると--replace
、追加されるエントリと競合する既存のエントリは、警告メッセージとともに自動的に削除されます。