web-dev-qa-db-ja.com

特定のファイル(「ours」、「mine」、「theirs」)に対してGitマージ戦略を選択します。

私はgit pull --rebaseの後にリベースしている最中です。マージの競合があるファイルがいくつかあります。特定のファイルに対する "彼らの"変更または "私の"変更をどうやって受け入れることができますか?

$ git status
# Not currently on any branch.
# You are currently rebasing.
#   (fix conflicts and then run "git rebase --continue")
#   (use "git rebase --skip" to skip this patch)
#   (use "git rebase --abort" to check out the original branch)
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:  CorrectlyMergedFile
#
# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add <file>..." to mark resolution)
#
#       both modified: FileWhereIWantToAcceptTheirChanges
#       both modified: FileWhereIWantToAcceptMyChanges

通常、私は単にファイルまたはマージツールを開き、手動ですべての「彼ら」または「私」の変更を承認します。しかし、便利なgitコマンドが欠けていると思います。

また、どのファイルが競合に当たるのか、おそらく競合が何であるのかがわかる場合にのみ、各ファイルに対してマージ戦略を選択できるようになります。

173
Steven Wexler

衝突したファイルごとに、次のように指定できます

git checkout --ours -- <paths>
# or
git checkout --theirs -- <paths>

から git checkout docs

git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>...

--ours
--theirs
インデックスからパスをチェックアウトするとき、マージされていないパスについてステージ#2(ours)または#3(theirs)をチェックアウトします。

前回の失敗したマージのため、インデックスにはマージされていないエントリが含まれる可能性があります。デフォルトでは、インデックスからそのようなエントリをチェックアウトしようとすると、チェックアウト操作は失敗し、チェックアウトは行われません。 -fを使用すると、これらのマージされていないエントリは無視されます。 --oursまたは--theirsを使用して、マージの特定の側からのコンテンツをインデックスからチェックアウトできます。 -mを使用すると、作業ツリーファイルに加えられた変更を破棄して、元の競合したマージ結果を再作成することができます。

214
user456814

この質問に答えても、git rebase vs mergeの場合に "theirs"と "ours"が何を意味するかについて例を挙げて説明します。 このリンク を参照してください

Git Rebase
theirsは、実際にリベースの場合は現在のブランチです。したがって、以下の一連のコマンドは、実際にはリモートブランチを介して現在のブランチの変更を受け入れています。

# see current branch
$ git branch
... 
* branch-a
# rebase preferring current branch changes during conflicts
$ git rebase -X theirs branch-b

Git Merge
mergeの場合、theirsoursの意味が逆になります。したがって、マージ中に同じ効果を得るには、つまりマージ中のリモートブランチ(ours)に対して現在のブランチの変更(theirs)を保持します。

# assuming branch-a is our current version
$ git merge -X ours branch-b  # <- ours: branch-a, theirs: branch-b
85
Abe

git checkout --ours|--theirstheirs]かoursのどちらかのバージョンを選択することで--- [ファイルを完全に上書きします(反対側からの変更が競合していない場合)。 、彼らは失われるでしょう)。

代わりに、ファイルに対して3者間マージを実行し、--ours|--theirsを使用して競合したハンクのみを解決したい場合は、両側から衝突しないハンクを配置したままにしておくと、git merge-fileに頼ることができます。詳細は この回答 を参照してください。

17
jakub.g