Better conflict resolution with Mergiraf


Using Mergiraf for conflict resolution

Mergiraf is a driver for git conflict resolution that is syntax aware. Meaning Mergiraf implements conflict resolution on top of a syntax tree representation (powered by tree-sitter) instead of being only line based like the default Git driver.

To use it, install the binary and follow the usage guide, a basic Git config setup.

[merge]
    conflictStyle = "diff3"
[merge "mergiraf"]
    name = mergiraf
    driver = mergiraf merge --git %O %A %B -s %S -x %X -y %Y -p %P -l %L

Then in ~/.config/git/attributes:

* merge=mergiraf

Using pnpm’s merge driver for pnpm-lock.yaml conflicts

One small improvement is to use a different driver for lock files as those are a bad fit for Mergiraf.

Improve on the configuration by either:

  • Using the default Git conflict resolution on pnpm-lock files, and on conflict run pnpm install (can automatically resolve the conflict):
* merge=mergiraf
pnpm-lock.yaml merge=git

Or use pnpm’s dedicated merge driver:

* merge=mergiraf
pnpm-lock.yaml merge=pnpm-lock

And then install the conflict solver, for example:

pnpm add -g @pnpm/merge-driver
pnpm dlx npm-merge-driver install \
  --driver-name pnpm-lock \
  --driver "pnpm-merge-driver %A %O %B %P" \
  --files pnpm-lock.yaml

Then Mergiraf will run on most files and pnpm merge driver on pnpm-lock.yaml.

On a final note, I highly recommend https://blog.gitbutler.com/how-git-core-devs-configure-git for a primer on recommended Git config options/better Git defaults.