web-dev-qa-db-ja.com

gitの「両方追加」マージ競合を解決しますか?

私はgitでリベースを行っていますが、衝突の1つは「両方追加」です。つまり、ブランチとリベースするブランチでまったく同じファイル名が個別に追加されています。 git statusは私に言う:

# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#       both added:         src/MyFile.cs

私の質問は、これをどのように解決するのですか?マージツールを使用する必要がありますか、それともコマンドラインからのみ実行できる方法がありますか? git rm src/MyFile.csの場合、gitはどのファイルバージョンを削除し、どのファイルを保持するのかをどのように判断しますか?

124
Jez

git rmを使用すると、gitはそのパスのすべてのバージョンをインデックスから削除するため、解決アクションではどちらのバージョンも使用できません。

git checkout --ours src/MyFile.csを使用して、リベースするブランチからバージョンを選択するか、git checkout --theirs src/MyFile.csを使用して、リベースするブランチからバージョンを選択できます。

ブレンドが必要な場合は、マージツールを使用するか、手動で編集する必要があります。

126
CB Bailey

--theirsオプションと--oursオプションを使用して、ファイルの出所を特定するのは時々わかりにくいです。ほとんどの場合、私のものは--theirsで参照されるリベースするブランチにあります!

git checkout <tree-ish> -- src/MyFile.csを使用することもできます

<tree-ish>は、保持するファイルを含むブランチ名またはcommit-idで置き換えることができます。

git checkout 6a363d8 -- src/MyFile.cs

git checkout my_branch -- src/MyFile.cs

git checkout HEAD -- src/MyFile.cs

63
Anas Alkhatib

するとき...

git checkout --ours someFile

Git statusを実行しても何もしなかったように見えるかもしれません。

後でこれを行うことを忘れないでください。

git add someFile
git status
36
Tom