Git conflict (rename/rename)

spacemonkey picture spacemonkey · Feb 6, 2013 · Viewed 25.9k times · Source

After merging branched I've received a conflict (rename/rename) on bunch of files, with file~HEAD, and file~my_test_branch created. How to resolve these?

Thanks

Answer

javabrett picture javabrett · Jan 12, 2015

Given the following test-setup:

git init resolving-rename-conflicts
cd resolving-rename-conflicts
echo "this file we will rename" > will-be-renamed.txt
git add -A
git commit -m "initial commit"
git checkout -b branch1
git rename will-be-renamed.txt new-name-1.txt
git commit -a -m "renamed a file on branch1"
git checkout -b branch2 master
git rename will-be-renamed.txt new-name-2.txt
git commit -a -m "renamed a file on branch2"
git checkout master

Then merging branch1 and branch2

git merge --no-ff branch1
git merge --no-ff branch2

Yields:

CONFLICT (rename/rename): Rename "will-be-renamed.txt"->"new-name-1.txt" in branch "HEAD" rename "will-be-renamed.txt"->"new-name-2.txt" in "branch2"
Automatic merge failed; fix conflicts and then commit the result.

git status

On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add/rm <file>..." as appropriate to mark resolution)

    added by us:        new-name-1.txt
    added by them:      new-name-2.txt
    both deleted:       will-be-renamed.txt

no changes added to commit (use "git add" and/or "git commit -a")

If you want to keep one file, say new-name-2.txt:

git add new-name-2.txt
git rm new-name-1.txt will-be-renamed.txt
git commit

Of course in chosing one file or the other, you may have other changes to make to files that reference this file by-name. Also, if there are other non-rename changes to the file, pre-or-post rename on the branches, you will need to manually diff and merge those to retain them in the file you are retaining.

If you instead want to keep both files:

git add new-name-1.txt new-name-2.txt
git rm will-be-renamed.txt
git commit