1. ホーム
  2. ギット

[解決済み】git を使ってファイル全体を「accept theirs」「accept mine」する簡単なツール

2022-03-24 13:42:16

質問

ビジュアル マージ ツールは必要ありません。また、競合するファイルを vi して、HEAD(私のもの)とインポートした変更(彼らのもの)の間を手動で選択する必要もありません。 たいていの場合、相手の変更をすべて取り込むか、私の変更をすべて取り込むかのどちらかです。 よくあるのは、私の変更がアップストリームで行われ、プルを通して私のところに戻ってくるのですが、いろいろなところで少し変更されている可能性があるためです。

コンフリクトマーカーを取り除き、私の選択に基づいてすべてを一方的に選択するコマンドラインツールはありますか? あるいは、私がそれぞれを行うために自分でエイリアスを作成できる一連のgitコマンドです。

# accept mine
alias am="some_sequence;of;commands"
alias at="some_other_sequence;of;commands"

これをやると、かなりめんどくさい。 accept mine」については、私が試したことがあります。

randy@sabotage ~/linus $ git merge test-branch
Auto-merging Makefile
CONFLICT (content): Merge conflict in Makefile
Automatic merge failed; fix conflicts and then commit the result.

randy@sabotage ~/linus $ git checkout Makefile 
error: path 'Makefile' is unmerged

andy@sabotage ~/linus $ git reset --hard HEAD Makefile 
fatal: Cannot do hard reset with paths.

このチェンジマーカーを消すにはどうしたらいいのでしょうか?

できるんです。

git reset HEAD Makefile; rm Makefile; git checkout Makefile

しかし、これでは回りくどい。もっといい方法があるはずだ。 それに、この時点ではgitがマージをしたと思っているかどうかもわからないので、これが必ずしもうまくいくとは思えません。

他の方法として、'accept theirs' を行うのも同様に面倒です。 私が理解できる唯一の方法は、そうすることです。

git show test-branch:Makefile > Makefile; git add Makefile;

これによって、コミットメッセージもめちゃくちゃになり、Conflicts: Makefile が 2 回含まれています。

どなたか、上記2つのアクションをよりシンプルに行う方法をご指摘いただけないでしょうか? ありがとうございます。

どのように解決するのですか?

解決方法はとても簡単です。 git checkout <filename> からファイルをチェックアウトしようとします。 インデックス そのため、マージに失敗します。

必要なのは、(つまり、チェックアウトして コミット ):

自分のバージョンをチェックアウトするには を使用することができます。 一つ のうち

git checkout HEAD -- <filename>

または

git checkout --ours -- <filename>

(警告! リベースする場合 --ours--theirs が入れ替わります)。

または

git show :2:<filename> > <filename> # (stage 2 is ours)

別バージョンをチェックアウトするには を使用することができます。 1 のうち

git checkout test-branch -- <filename>

または

git checkout --theirs -- <filename>

または

git show :3:<filename> > <filename> # (stage 3 is theirs)

また、解決済みとしてマークするために「add」を実行する必要があります。

git add <filename>