• Pl chevron_right

      Michael Catanzaro: git config am.threeWay

      news.movim.eu / PlanetGnome • 1 day ago • 1 minute

    If you work with patches and git am , then you’re probably used to seeing patches fail to apply. For example:

    $ git am CVE-2025-14512.patch
    Applying: gfileattribute: Fix integer overflow calculating escaping for byte strings
    error: patch failed: gio/gfileattribute.c:166
    error: gio/gfileattribute.c: patch does not apply
    Patch failed at 0001 gfileattribute: Fix integer overflow calculating escaping for byte strings
    hint: Use 'git am --show-current-patch=diff' to see the failed patch
    hint: When you have resolved this problem, run "git am --continue".
    hint: If you prefer to skip this patch, run "git am --skip" instead.
    hint: To restore the original branch and stop patching, run "git am --abort".
    hint: Disable this message with "git config set advice.mergeConflict false"

    This is sad and frustrating because the entire patch has failed, and now you have to apply the entire thing manually. That is no good.

    Here is the solution, which I wish I had learned long ago:

    $ git config --global am.threeWay true

    This enables three-way merge conflict resolution, same as if you were using git cherry-pick or git merge . For example:

    $ git am CVE-2025-14512.patch
    Applying: gfileattribute: Fix integer overflow calculating escaping for byte strings
    Using index info to reconstruct a base tree...
    M	gio/gfileattribute.c
    Falling back to patching base and 3-way merge...
    Auto-merging gio/gfileattribute.c
    CONFLICT (content): Merge conflict in gio/gfileattribute.c
    error: Failed to merge in the changes.
    Patch failed at 0001 gfileattribute: Fix integer overflow calculating escaping for byte strings
    hint: Use 'git am --show-current-patch=diff' to see the failed patch
    hint: When you have resolved this problem, run "git am --continue".
    hint: If you prefer to skip this patch, run "git am --skip" instead.
    hint: To restore the original branch and stop patching, run "git am --abort".
    hint: Disable this message with "git config set advice.mergeConflict false"

    Now you have merge conflicts, which you can handle as usual. This seems like a better default for pretty much everybody, so if you use git am , you should probably enable it.

    I’ve no doubt that many readers will have known about this already, but it’s new to me, and it makes me happy, so I wanted to share. You’re welcome, Internet!