git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] doc: add caveat about roundtripping format-patch

From
PWPhillip Wood <phillip.wood123@gmail.com>
Date
Feb 9, 2026, 16:42 UTC
Message-ID
<bf5d1e84-2a59-4e1b-a524-c8b251dbae70@gmail.com>
In-Reply-To
<format-patch_caveats.281@msgid.xyz>
Hi Kristoffer

Thanks for working on this. I've left a few comments below but I think what you have here is pretty good already.

On 08/02/2026 00:11, kristofferhaugsbakk@fastmail.com wrote:
> From: Kristoffer Haugsbakk <code@khaugsbakk.name>
> 
> git-format-patch(1), git-send-email(1), and git-am(1) deal with

I found the mention of git-send-email here and in the documentation a bit distracting as it doesn't do any formatting itself - it just runs "git format-patch"

> † 1: There is also git-commit(1) to consider. However, making that
>       command warn or error out over such delimiters would be disruptive
>       to all Git users who never use email in their workflow.
This reference is formatted differently to the rest.
> [2]: Recently patch(1) caused this issue for a project, but it was noted
>       that git-am(1) has the same behavior[3]
> [3]: https://github.com/i3/i3/pull/6564#issuecomment-3858381425
> [4]: https://lore.kernel.org/git/xmqqldh4b5y2.fsf@gitster.g/
Show 11 quoted lines
> diff --git a/Documentation/format-patch-caveats.adoc b/Documentation/format-patch-caveats.adoc
> new file mode 100644
> index 00000000000..2accf2763fd
> --- /dev/null
> +++ b/Documentation/format-patch-caveats.adoc
> @@ -0,0 +1,39 @@
> +Patches produced by linkgit:git-format-patch[1] or
> +linkgit:git-send-email[1] are inline. This means that the output of
> +these two commands can lead to a different commit message when applied
> +with linkgit:git-am[1]. It can also mean that the patch is not applied
> +correctly.

Is this last sentence referring to diffs in the commit message being applied? I don't think there are circumstances where the patch itself is not applied correctly.

Show 15 quoted lines
> +The commit message might contain a three-dash line (`---`) which was
> +perhaps meant to be a thematic break. That means that the commit message
> +will be cut short. The presence of a line starting with "Index: " can
> +cause the patch not to be found, giving an error about an empty patch.
> +
> +Furthermore, the presence of an unindented diff in the commit message
> +will not only cut the message short but cause that very diff to be
> +applied, along with the patch in the patch section. The commit message
> +might for example have a diff in a GitHub MarkDown code fence:
> +
> +----
> +```
> +diff ...
> +```
> +----
I'm not sure the markdown really adds anything here
Show 12 quoted lines
> +The solution for this is to indent the diff instead:
> +
> +----
> +    diff ...
> +----
> +
> +This loss of fidelity might be simple to notice if you are applying
> +patches directly from a mailbox. However, a commit authored long ago
> +might be applied in a different context, perhaps because many changes
> +are being integrated via patch files and the
> +linkgit:git-format-patch[1] format is trusted to import changes of a
> +Git origin.

This last sentence lost me a bit. Is this talking about commits that have been pushed to a forge and then some downloads it as a patch? It would certainly be helpful to explain that even if you're not using an email based workflow, it is possible to be caught out by these issues.

> +One might want to use a general-purpose utility like patch(1) instead,
"Given these limitations, one might be tempted to ..."?
> +given these limitations. However, patch(1) will not only look for
> +unindented diffs (like linkgit:git-am[1]) but will try to apply indented
> +diffs as well.
This is useful context.
Thanks
Phillip
Show 76 quoted lines
> diff --git a/Documentation/git-am.adoc b/Documentation/git-am.adoc
> index 0c94776e296..18f5b950825 100644
> --- a/Documentation/git-am.adoc
> +++ b/Documentation/git-am.adoc
> @@ -259,10 +259,13 @@ message.  Any line that is of the form:
>   * a line that begins with "Index: "
>   
>   is taken as the beginning of a patch, and the commit log message
>   is terminated before the first occurrence of such a line.
>   
> +This means that the content of the commit message can inadverently
> +interrupt the processing (see the <<caveats,CAVEATS>> section below).
> +
>   When initially invoking `git am`, you give it the names of the mailboxes
>   to process.  Upon seeing the first patch that does not apply, it
>   aborts in the middle.  You can recover from this in one of two ways:
>   
>   . skip the current patch by re-running the command with the `--skip`
> @@ -281,10 +284,16 @@ Before any patches are applied, ORIG_HEAD is set to the tip of the
>   current branch.  This is useful if you have problems with multiple
>   commits, like running 'git am' on the wrong branch or an error in the
>   commits that is more easily fixed by changing the mailbox (e.g.
>   errors in the "From:" lines).
>   
> +[[caveats]]
> +CAVEATS
> +-------
> +
> +include::format-patch-caveats.adoc[]
> +
>   HOOKS
>   -----
>   This command can run `applypatch-msg`, `pre-applypatch`,
>   and `post-applypatch` hooks.  See linkgit:githooks[5] for more
>   information.
> diff --git a/Documentation/git-format-patch.adoc b/Documentation/git-format-patch.adoc
> index 9a7807ca71a..36851aaf5e1 100644
> --- a/Documentation/git-format-patch.adoc
> +++ b/Documentation/git-format-patch.adoc
> @@ -796,10 +796,14 @@ CAVEATS
>   Note that `format-patch` will omit merge commits from the output, even
>   if they are part of the requested range. A simple "patch" does not
>   include enough information for the receiving end to reproduce the same
>   merge commit.
>   
> +'''
> +
> +include::format-patch-caveats.adoc[]
> +
>   SEE ALSO
>   --------
>   linkgit:git-am[1], linkgit:git-send-email[1]
>   
>   GIT
> diff --git a/Documentation/git-send-email.adoc b/Documentation/git-send-email.adoc
> index ebe8853e9f5..0b118df6498 100644
> --- a/Documentation/git-send-email.adoc
> +++ b/Documentation/git-send-email.adoc
> @@ -690,10 +690,15 @@ Links of a few such community maintained helpers are:
>   	  (cross platform client that can send emails using the ProtonMail API)
>   
>   	- https://github.com/AdityaGarg8/git-credential-email[git-msgraph]
>   	  (cross platform client that can send emails using the Microsoft Graph API)
>   
> +CAVEATS
> +-------
> +
> +include::format-patch-caveats.adoc[]
> +
>   SEE ALSO
>   --------
>   linkgit:git-format-patch[1], linkgit:git-imap-send[1], mbox(5)
>   
>   GIT
> 
> base-commit: 3e0db84c88c57e70ac8be8c196dfa92c5d656fbc
Previous: Kristoffer HaugsbakkNext: Kristoffer Haugsbakk
Message 50 of 65 in “git-am applies commit message diffs”
  1. Matthias BeyerFeb 6, 2026
  2. Jacob KellerFeb 6, 2026
  3. Matthias BeyerFeb 6, 2026
  4. Jeff KingFeb 6, 2026
  5. 0/3 commit-msg.sample: reject messages that would confuse "git am"Phillip Wood, Feb 7, 2026
  6. 1/3 templates: add .gitattributes entry for sample hooksPhillip Wood, Feb 7, 2026
  7. 2/3 templates: detect commit messages containing diffsPhillip Wood, Feb 7, 2026
  8. 3/3 templates: detect messages that contain a separator linePhillip Wood, Feb 7, 2026
  9. Junio C HamanoFeb 7, 2026
  10. Kristoffer HaugsbakkFeb 7, 2026
  11. Junio C HamanoFeb 9, 2026
  12. Jeff KingFeb 9, 2026
  13. Phillip WoodFeb 9, 2026
  14. Jeff KingFeb 10, 2026
  15. Jeff KingFeb 9, 2026
  16. Phillip WoodFeb 9, 2026
  17. Matthias BeyerFeb 9, 2026
  18. Jeff KingFeb 10, 2026
  19. Patrick SteinhardtFeb 9, 2026
  20. Jacob KellerFeb 10, 2026
  21. Patrick SteinhardtFeb 10, 2026
  22. Junio C HamanoFeb 10, 2026
  23. Jacob KellerFeb 11, 2026
  24. Jacob KellerFeb 11, 2026
  25. Jeff KingFeb 11, 2026
  26. Kristoffer HaugsbakkFeb 11, 2026
  27. Junio C HamanoFeb 11, 2026
  28. Jeff KingFeb 10, 2026
  29. 0/2 commit-msg.sample: reject messages that would confuse "git am"Phillip Wood, Feb 13, 2026
  30. 1/2 templates: add .gitattributes entry for sample hooksPhillip Wood, Feb 13, 2026
  31. 2/2 templates: detect commit messages containing diffsPhillip Wood, Feb 13, 2026
  32. Kristoffer HaugsbakkFeb 13, 2026
  33. Junio C HamanoFeb 13, 2026
  34. Phillip WoodFeb 14, 2026
  35. Junio C HamanoFeb 13, 2026
  36. Phillip WoodFeb 14, 2026
  37. Junio C HamanoFeb 14, 2026
  38. Junio C HamanoFeb 13, 2026
  39. Florian WeimerFeb 6, 2026
  40. Jeff KingFeb 6, 2026
  41. Florian WeimerFeb 6, 2026
  42. Jeff KingFeb 6, 2026
  43. Kristoffer HaugsbakkFeb 6, 2026
  44. Jakob HaufeFeb 6, 2026
  45. Kristoffer HaugsbakkFeb 7, 2026
  46. Kristoffer HaugsbakkFeb 7, 2026
  47. doc: add caveat about roundtripping format-patchkristofferhaugsbakk@fastmail.com, Feb 8, 2026
  48. Junio C HamanoFeb 8, 2026
  49. Kristoffer HaugsbakkFeb 8, 2026
  50. Phillip WoodFeb 9, 2026
  51. Kristoffer HaugsbakkFeb 9, 2026
  52. Phillip WoodFeb 10, 2026
  53. Kristoffer HaugsbakkFeb 10, 2026
  54. doc: add caveat about roundtripping format-patchkristofferhaugsbakk@fastmail.com, Feb 9, 2026
  55. Junio C HamanoFeb 9, 2026
  56. Kristoffer HaugsbakkFeb 9, 2026
  57. Phillip WoodFeb 10, 2026
  58. Kristoffer HaugsbakkFeb 10, 2026
  59. doc: add caveat about round-tripping format-patchkristofferhaugsbakk@fastmail.com, Feb 12, 2026
  60. Junio C HamanoFeb 12, 2026
  61. Phillip WoodFeb 13, 2026
  62. Kristoffer HaugsbakkFeb 13, 2026
  63. Junio C HamanoFeb 13, 2026
  64. Christoph Anton MittererFeb 10, 2026
  65. Kristoffer HaugsbakkFeb 10, 2026

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.