Gitとコマンドラインを使用してマージ中にローカルファイルまたはリモートファイルを保持する方法


194

vimdiffを使用して変更をマージする方法は知っていますが、ファイル全体を保持または破棄するのが適切であると知っているとしたら、どうすればよいですか?

それぞれに対してvimdiffを開きたくありません。「ローカルに保持」または「リモートに保持」というコマンドが必要です。

EG:Windowsで誰かがファイルを開いてEOLを変更したため、変更済みとマークされたファイルをマージしてからコミットしました。マージするときは、自分のバージョンを保持して破棄します。

私はまた反対に興味があります。私は大きな時間をめちゃくちゃにして、リモートファイルを受け入れて私の変更を破棄したいと考えています。

回答:


308

あなたも行うことができます:

git checkout --theirs /path/to/file

リモートファイルを保持するため、および

git checkout --ours /path/to/file

ローカルファイルを保持します。

その後、git addそれらとすべてが行われます。

エディション:これはmergeシナリオ用であることに注意してください。参照中は、rebase --theirs作業していたブランチを参照します。


4
私はこれを行いましたが、何も起こりません。正しいファイルを取得していることをどのようにして知ることができますか?それがgit version 1.8.4重要な場合は使用しています。
Rosdi Kasim 2014

3
なぜ逆の言葉を使うのですか?「theirs」はリモートファイル、「ours」は私のファイルになると思います
phuclv

1
だから、あるLưuVĩnhPhúc@
Devのを待っている...

7
いいえ、その意味が逆になっているstackoverflow.com/q/2959443/995714の stackoverflow.com/q/29324812/995714彼らは私のファイルや我々のだろうが、リモートブランチでファイルされている
phuclv

6
「簡単」、はい。直感的?いいえ
Wilbur Whateley 2017

107

このアプローチはより簡単に見え、各ファイルを個別に選択する必要がなくなります。

# keep remote files
git merge --strategy-option theirs
# keep local files
git merge --strategy-option ours

または

# keep remote files
git pull -Xtheirs
# keep local files
git pull -Xours

直接コピー: プル中の変更を優先してGitマージの競合を解決する


3
これが大好きです。特に複数のファイルがある場合。
Tek

問題は2つの異なるコマンドに関するものでしたが、これら2つが何をするかについての説明はありません。各行は何をしますか?
Alex

これを見つける前に、少なくとも5つのスタックオーバーフローの回答を調べました。ありがとう。
ボルトンベイリー

14

git checkout {branch-name} -- {file-name}

これは、選択したブランチのファイルを使用します。

posh-gitオートコンプリートはこれでうまく機能するので、私はこれが好きです。また、どのブランチがリモートで、どのブランチがローカルであるかについてのあいまいさを取り除きます。そして、--theirsとにかく私のために動作しませんでした。


あいまいさはなく、{mine}と{theirs}の両方で機能し、ディレクトリ全体の追加をサポートします。これは受け入れられる答えになるはずです。
dotancohen 2017

9

ラインエンドのものについては、次を参照してくださいman git-merge

--ignore-space-change 
--ignore-all-space 
--ignore-space-at-eol

必ず追加してくださいautocrlf = falseおよび/またはsafecrlf = false窓のクローン(.git / configの)に

git mergetoolの使用

次のようにmergetoolを設定した場合:

git config mergetool.cp.cmd '/bin/cp -v "$REMOTE" "$MERGED"'
git config mergetool.cp.trustExitCode true

次に、単純な

git mergetool --tool=cp
git mergetool --tool=cp -- paths/to/files.txt
git mergetool --tool=cp -y -- paths/to/files.txt # without prompting

仕事をします

単純なgitコマンドの使用

他の場合では、私は仮定します

git checkout HEAD -- path/to/myfile.txt

トリックを行う必要があります

逆転するように編集します(失敗したため)。

git checkout remote/branch_to_merge -- path/to/myfile.txt

ヒントを+1しますが、受け入れられませんが、私が求めたものではないためです。例のケースだけでなく、すべてのケースで機能するものが欲しい。さらに、「git checkout remote / branch_to_merge-path / to / myfile.txt」は、すでにマージを開始している場合は機能しません。マージの最中であることが通知され、実行できないようになります。
e-satis

1
@ e-satis:それは驚くべきことです。パスを使用したチェックアウトは通常のチェックアウトではないため(そしてHEADには影響しないため)、私はそのバグを検討します。私はそれを信じることができないので、私は今それを試してみるつもりだ
sehe

1
@ e-satis:Soooo ...私は正しかった。git checkout remote/branch_to_merge -- path/to/myfile.txtマージの競合を解決する間、魅力のように動作します。(git 1.7.1)
sehe

1
今のgit mergetoolをベースにしたソリューションを追加しました
sehe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.