Re: [PATCH] doc: add caveat about roundtripping format-patch
- From
- Phillip 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