git add –interactive “Your edited hunk does not apply”

Is this like in this git-add post?

Manually editing the hunk is immensely powerful, but also a bit complicated if you’ve never done it before.
The most important thing to keep in mind: The diff is always indented with one character in addition to whatever other indentation is there.
The character can either be:

  • a space (indicates an unchanged line),
  • a - indicating that the line was removed,
  • or a + indicating that the line was added.

Nothing else. It must be either a space, a – or a +. Anything else, and you’ll get errors
(there’s no character for a changed line, since those are handled by removing the old line, and adding the changed one as new).

Since you’ve got the diff open in your favorite text editor (you did configure Git to use your favorite text editor, right?), you can do whatever you want – as long as you make sure the resulting diff applies cleanly.

And therein lies the trick. If you’ve never done this before, Git will tell you “Your edited hunk does not apply. Edit again?” so often, you’ll start to hate yourself for your inability to figure this out, even though it seems so easy (or Git because it can’t figure out what you want).

One thing that tripped me up quite often was that I forgot the one character indent.
I’d mark a line with a – to be removed, but in most text editors that inserts a -, it doesn’t overwrite the space that was there before. This means you’re adding an additional space to the whole line, which in turn means the diff algorithm can’t find/match the line in the original file, which in turn means Git will yell at you.

The other thing is that the diff still has to make sense. “Sense” means that it can be applied cleanly. Exactly how you create a sensible diff seems to be a bit of an dark art (at least to me right now), but you should always keep in mind how the original file looked like, and then plan your -s and +s accordingly. If you edit your hunks often enough you’ll eventually get the hang of it.

See also this commit on git add -p.

Ortomala Lokni‘s answer refers to Joaquín Windmüller blog post “Selectively select changes to commit with git (or Imma edit your hunk)

Instead of counting lines, what Git would like to do is to coalesce overlapping hunks (when one is edited) before applying said edited hunk.
That was discussed mid-2018, and would avoid scenario like:

if you split a hunk, edit the first subhunk, transforming a
trailing context line to a deletion then if you try to stage the
second subhunk, it will fail.

Leave a Comment