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

Re: How to reset selected lines?

From
Jeff King <peff@peff.net>
Date
Aug 14, 2019, 14:52 UTC
Message-ID
<20190814145219.GA12093@sigill.intra.peff.net>
In-Reply-To
<20190814114844.gvb5znje7cpzehkd@localhost.localdomain>
On Wed, Aug 14, 2019 at 05:18:44PM +0530, Pratyush Yadav wrote:
Show 18 quoted lines
> > So "git add -p", for example, also works by creating diffs, modifying
> > them, and feeding the result to "apply". You can see the implementation
> > in git-add--interactive.perl, where it literally calls diff and apply
> > commands.
> > 
> > And that leads us to the answer to the first question. That script
> > implements "add -p", but also "checkout -p" (which is what you want),
> > "reset -p", "stash -p", etc. They differ only in what we diff and how we
> > apply the result; the main engine of slicing and dicing the diff through
> > user interaction is the same. See the %patch_modes hash for the list.
> 
> Ah, so that means I do have to dive into generating diffs. Too bad, I 
> was hoping for a cleaner (read: easier) way.
> 
> On that note, I don't suppose there is a way to use 
> git-add--interactive's diff engine from a script, is there?  That'd 
> allow me to not write potentially buggy code and solve problems someone 
> already solved.

The actual diffing is all done by lower-level commands. So I'm not sure there's much "engine" to reuse from the script. It takes care of asking the user about which lines to look at, how to split the diff, etc, but that's the part you'd want a totally different interface for.

The one thing you _might_ want to pick up is the line recounting bits. We used to just call "apply --recount", but I think there were some corner cases that it couldn't handle well. The details are in 2b8ea7f3c7 (add -p: calculate offset delta for edited patches, 2018-03-05) and 3a8522f41f (add -p: don't rely on apply's '--recount' option, 2018-03-05), and probably some mailing list around those.

You could probably start with just not handling those corner cases, though (either relying on "apply --recount", or just using whatever git-gui already does now for staging).

-Peff
Previous: Pratyush YadavNext: Johannes Sixt
Message 5 of 7 in “How to reset selected lines?”
  1. Pratyush YadavAug 13, 2019
  2. Jeff KingAug 13, 2019
  3. Junio C HamanoAug 13, 2019
  4. Pratyush YadavAug 14, 2019
  5. Jeff KingAug 14, 2019
  6. Johannes SixtAug 13, 2019
  7. Pratyush YadavAug 14, 2019

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.