Tim
Tim

Reputation: 99606

How do I resolve a conflict after git pull?

I have to solve some conflict after a git pull.

$ git pull
CONFLICT (rename/add): Renamed vignette_generator_mashed.h->vision_problem_8.h in 49423dd0d47abe6d839a783b5517bdfd200a202f. vision_problem_8.h added in HEAD
Added as vision_problem_8.h~HEAD_1 instead
Removed vignette_generator_cross_square.cc
Automatic merge failed; fix conflicts and then commit the result.

So I googled it a bit, and found people saying using git mergetool. But here is what I got:

$ git mergetool
merge tool candidates: meld kdiff3 tkdiff xxdiff meld gvimdiff emerge opendiff emerge vimdiff
No files need merging
$ git mergetool opendiff
merge tool candidates: meld kdiff3 tkdiff xxdiff meld gvimdiff emerge opendiff emerge vimdiff
opendiff: file not found

So does it mean I have to install something?

What if I simply want the version from git pull to overwrite everything?

Upvotes: 56

Views: 106924

Answers (5)

Yordan Georgiev
Yordan Georgiev

Reputation: 5460

If you have a proper branching strategy (i.e. features are merged into develop, just before merging or rebasing etc.), most often when you want to run a git pull on a branch. You basically want to get all the new stuff from the Git server and later on apply your own stuff, which in Git lingua franca is something like this:

# put all my changes on the stash 
git stash 

# fully reset the current branch to the state it is on the server
git clean -d -x -f ; git reset HEAD --hard ; git pull --force

# apply your own changes 
git stash pop

Instead of stashing, you could also put your current state into a temporary branch, but if there are conflicts you would have to manually resolve them eventually.

Upvotes: 0

mano2a0c40
mano2a0c40

Reputation: 93

I think you just forgot the -t switch at your command line. According to Git's help page, it stands for -t <tool>, --tool=<tool>, so it makes what you intended to.

Try:

git mergetool -t gvimdiff

Of course you may use your prefered merge tool instead of mine, gvimdiff. Meld is great too...

Upvotes: 7

saferJo
saferJo

Reputation: 557

What if I simply want the version from git pull to overwrite everything? If you want just that you should use:

 git fetch
 git reset --hard origin/your-branch-name

Upvotes: 6

Bluejack
Bluejack

Reputation: 51

If you run your merge from a subdirectory of your project, git will run the merge for your whole project. However, mergetool can only see (and merge) files in or below the working directory. So, if this scenario occurs, make sure you are trying to run your conflict resolution from the top-level directory in your project.

Upvotes: 5

Phil Miller
Phil Miller

Reputation: 38158

You don't need mergetool for this. It can be resolved pretty easily manually.

Your conflict is that your local commits added a file, vision_problem_8.h, that a remote commit also created, by a rename from vignette_generator_mashed.h. If you run ls -l vision_problem_8.h* you will probably see multiple versions of this file that git has preserved for you. One of them will be yours, another of them will be the remote version. You can use an editor or whatever tools you like to resolve the conflicting contents. When you're done, git add the affected files and commit to complete the merge.

If you just want to use the remote commit's version, then you can just move the copy that you didn't write into place and git add it.


Regarding the merge tools, have a look at git help mergetool. Basically, it's going to try running each of the included possibilities until it finds one, or use one you have explicitly configured.

Upvotes: 25

Related Questions