All of lore.kernel.org
 help / color / mirror / Atom feed
From: Timothy Eccleston <timothy.perisho.eccleston@gmail.com>
To: phillip.wood@dunelm.org.uk
Cc: git@vger.kernel.org
Subject: Re: Unified workflow for `git add/checkout --patch`?
Date: Mon, 25 Oct 2021 12:47:45 -0700	[thread overview]
Message-ID: <CACYzLDdx5Nd6PotGp7oNOzkD2qVriu=U1mXMG80yxO9x2+rz2w@mail.gmail.com> (raw)
In-Reply-To: <47c45a9e-649d-89cc-3d7e-3dcea54bccb5@gmail.com>

Hi Phillip,
Thanks for taking an interest!

In the workflow I'm describing, I don't add any arguments - i.e. the
defaults work for me. But, I see your point about the mismatch between
INDEX and HEAD. However, it looks like `git checkout -p` already uses
INDEX as its default when you add the `--patch` argument:
https://git-scm.com/docs/git-checkout#Documentation/git-checkout.txt--p.*

Essentially, I'm sifting through the diffs between workspace and INDEX
and deciding for each whether to:
- leave it for later (just lying around in the workspace, or perhaps
even `git stash`ed away)
- add it to the INDEX,
- undo it entirely,
- edit it (add part and then leave or undo the rest).

I was going to suggest that we just add a second layer of "directing"
hotkeys for "add", "checkout", "leave", and "stash" to pair with the
ones (below) that already exist in the `git add -p` command:
```
Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]? ?
y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk or any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk or any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
e - manually edit the current hunk
? - print help
```

So, you'd chain 2 single letter commands, like "sa" to stash ("s") all
"a" the hunks in this file, but my new "directing" hotkeys aren't
quite orthogonal to the existing hotkeys. For example, "n" and "j" are
both sort of like "leave". I'm guessing we'd have to create a whole
new set of commands.

Best,
Tim

P.S. *Concerning the git checkout defaults. I also assumed that the
plain git checkout command targets HEAD, but in the docs, all I can
find are side effects for the HEAD pointer when the command is run. It
looks like with no arguments it targets the current branch, but that's
a noop, since you're already on that branch. I feel like I'm missing
something still, but it also doesn't appear relevant to this "patch"
workflow anyway.

On Mon, Oct 25, 2021 at 3:08 AM Phillip Wood <phillip.wood123@gmail.com> wrote:
>
> Hi Tim
>
> On 21/10/2021 23:19, Timothy Eccleston wrote:
> > Hi,
> > I really like both these features:
> > - git add -p
> > - git checkout -p
> >
> > My typical workflow
> > I like to use them after a long and complex coding sessions where I
> > want to double-check my work, making edits and adding sets of patches
> > into sequential commits to keep related changes together topically.
> >
> > In the process of using git add -p to grab some patches, I may notice
> > other patches I don't want (especially after I've used the "e" command
> > in `git add -p` to edit a patch - I usually want to drop the
> > remaining, unstaged version of the patch right then). But, instead, I
> > have to go through git add -p and then git checkout -p and likely back
> > and forth several times, each time skipping through all the same
> > undecided or postponed patches I am waiting on for later.
> >
> > Note: I recently discovered the "j" and "J" subcommands which are
> > useful to postpone decisions on certain patches, but only if I
> > restrict myself to just git add or git checkout. If I want to do both,
> > I still have to cycle back through from the top each time. I suppose I
> > could use stash -p to really hide patches I'm saving for later, but I
> > still have to exit my workflow and start another command, requiring
> > multiple passes. OTOH, a unified git add/checkout/stash --patch would
> > be amazing!
> >
> > My request
> > It would be really nice if there were a unified command workflow where
> > I could add or checkout patches or even partial patches (after editing
> > a patch in git add), on a case by case basis in a single pass.
>
> I think I kind of see what you want but I'm a bit confused as how it
> could be implemented. To clarify do you want to checkout the index to
> discard the changes in the worktree or checkout HEAD (the later would be
> difficult as 'add -p' shows the differences between the index and the
> worktree)? Have you any thoughts on how the user would select whether to
> add a change to the index or discard it from the worktree? It gets a bit
> tricky if you want to stage an edited version of a hunk and discard the
> unstaged portion from the worktree but I guess we could apply the
> reverse of the original hunk to discard all the changes and then apply
> the staged version of the hunk to get just the changes the user wants. I
> think the main challenge would be with the user interface.
>
> Best Wishes
>
> Phillip
>
> > Does anyone know a way to do this or do you think it's worth making a
> > new feature in git to handle it?
> >
> > Thanks!
> > Tim
> >
>

      reply	other threads:[~2021-10-25 20:16 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <CACYzLDcFjwaJkgVUemD_KqkoGhV_5OYrECddDuxa-o5FpZ6XMA@mail.gmail.com>
2021-10-21 22:19 ` Unified workflow for `git add/checkout --patch`? Timothy Eccleston
2021-10-25 10:08   ` Phillip Wood
2021-10-25 19:47     ` Timothy Eccleston [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CACYzLDdx5Nd6PotGp7oNOzkD2qVriu=U1mXMG80yxO9x2+rz2w@mail.gmail.com' \
    --to=timothy.perisho.eccleston@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=phillip.wood@dunelm.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.