Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to resolve git merge conflict, from command line, using a given strategy, for just one file?

Tags:

Let's say I did a git merge and have a conflict in some file, say package.json or pom.xml, and perhaps some other files.

I would like to

  1. automatically resolve merge conflicts for certain files from command line, while
  2. letting myself resolve manually all the other conflicts, if any, and
  3. making sure I don't lose valuable changes from any branch.

Because of 2), I can't use git merge -Xours as this would resolve all conflicts. I want to resolve only conflicts in one particular file.

Because of 3), I can't use git checkout --ours package.json as this might lose some changes from the input branch.

The use case is for instance: auto-merging script that will resolve trivial well-known conflicts in a predefined way, and fail if there are some other conflicts in other files.

The typical case I often have is having two branches with version field in package.json diverged like below:

$ git diff
diff --cc package.json
index 75c469b,f709434..0000000
--- a/package.json
+++ b/package.json
@@@ -1,6 -1,6 +1,12 @@@
  {
    "name": "test",
++<<<<<<< HEAD
 +  "version": "2.0.1",
++||||||| merged common ancestors
++  "version": "1.0.0",
++=======
+   "version": "1.0.2",
++>>>>>>> master

Is it possible to resolve the conflict for just one file, using given strategy? Something like:

git-resolve-conflict --ours package.json
like image 553
jakub.g Avatar asked Aug 24 '16 14:08

jakub.g


People also ask

How do I manually resolve merge conflicts in Git?

Git commands that can help resolve merge conflicts Passing the --merge argument to the git log command will produce a log with a list of commits that conflict between the merging branches. diff helps find differences between states of a repository/files. This is useful in predicting and preventing merge conflicts.

Which command in Git can be used to see files in merge conflict?

Git status is the most frequently used command to display the status of modified files, staging area, and commits. During the merging process, it is used to identify conflicted files. The Git log with --merge arguments produces the list of commits that are in conflict with the source branch.


1 Answers

This can be achieved using git-merge-file although its API is rather low-level.

In order to have an easy-to-use command, you can use the following bash script (to be imported to .bashrc, or you can also install it with npm install -g git-resolve-conflict):

git-resolve-conflict() {
  STRATEGY="$1"
  FILE_PATH="$2"

  if [ -z "$FILE_PATH" ] || [ -z "$STRATEGY" ]; then
    echo "Usage:   git-resolve-conflict <strategy> <file>"
    echo ""
    echo "Example: git-resolve-conflict --ours package.json"
    echo "Example: git-resolve-conflict --union package.json"
    echo "Example: git-resolve-conflict --theirs package.json"
    return
  fi

  git show :1:"$FILE_PATH" > ./tmp.common
  git show :2:"$FILE_PATH" > ./tmp.ours
  git show :3:"$FILE_PATH" > ./tmp.theirs

  git merge-file "$STRATEGY" -p ./tmp.ours ./tmp.common ./tmp.theirs > "$FILE_PATH"
  git add "$FILE_PATH"

  rm ./tmp.common
  rm ./tmp.ours
  rm ./tmp.theirs
}

(Note: I keep updating the script in my GitHub repo, check the repo for the latest improvements: https://github.com/jakub-g/git-resolve-conflict/blob/base/lib/git-resolve-conflict.sh)

In the particular example as described in the question, the usage would be as follows:

git-resolve-conflict --ours package.json

For a step by step study see:

https://github.com/jakub-g/git-resolve-conflict

Bonus:

If you have multiple package.json files in subfolders, and want to resolve the merge for all of them which are in conflicted state:

for ITEM in $(git diff --name-only --diff-filter=U | grep package.json$); do git-resolve-conflict --ours $ITEM; done
like image 103
jakub.g Avatar answered Sep 20 '22 19:09

jakub.g