git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
* How to interactively rebase-and-reword nth commit?
@ 2021-08-25 14:06 Konstantin Kharlamov
  2021-08-25 15:01 ` Ævar Arnfjörð Bjarmason
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: Konstantin Kharlamov @ 2021-08-25 14:06 UTC (permalink / raw)
  To: git

I think, one of the most frequent git features used is `rebase -i`. There's a common
workflow I think everyone knows: you have commits 1, 2, 3, then you decide "Nah, 2nd
commit needs a change", so you do `git rebase -i HEAD~2`, then in popped up editor
you modify the `pick` on the first line to become `edit`, then you do the change,
then `git rebase --continue`.

The boilerplate part here: even though you know that you want to edit HEAD~2, there
is no way to tell git that right away. Every time you have to launch editor, edit the
line manually, then save it, close it.

I have seen here some discussions about improving that, someone even posted patches,
but I'm not aware if it went anywhere. So I created 2 years ago a shell wrapper
`rebase-at`¹, which upon called as `rebase-at e HEAD~2`, does the thing described
above automatically. Under the hood I simply substitute EDITOR with `sed` command
that replaces `pick` on the first line (the HEAD~2 commit) with `e`. If used with
shell autocompletion, it is now practically instantaneous.

I'm almost happy with `rebase-at`, except I don't know of any way to make it work
with `reword` git action. You see, "rewording a commit" requires to run EDITOR twice:
first to substitute `pick` with `reword`, and then to actually edit the commit
message. But since EDITOR was substituted with sed, the 2nd run won't give you an
actual editor to change the commit message.

Any ideas, how can I tell `git` that I want to "reword" nth commit right away? Sure,
I am not the first one to stumble upon it, am I? Any ideas?

1: https://github.com/Hi-Angel/dotfiles/blob/0b9418224e4ce7c9783dbc2d9473fd1991b9b0b2/.zshrc#L148-L160



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: How to interactively rebase-and-reword nth commit?
  2021-08-25 14:06 How to interactively rebase-and-reword nth commit? Konstantin Kharlamov
@ 2021-08-25 15:01 ` Ævar Arnfjörð Bjarmason
  2021-08-25 15:54 ` Martin Ågren
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 7+ messages in thread
From: Ævar Arnfjörð Bjarmason @ 2021-08-25 15:01 UTC (permalink / raw)
  To: Konstantin Kharlamov; +Cc: git


On Wed, Aug 25 2021, Konstantin Kharlamov wrote:

> I think, one of the most frequent git features used is `rebase -i`. There's a common
> workflow I think everyone knows: you have commits 1, 2, 3, then you decide "Nah, 2nd
> commit needs a change", so you do `git rebase -i HEAD~2`, then in popped up editor
> you modify the `pick` on the first line to become `edit`, then you do the change,
> then `git rebase --continue`.
>
> The boilerplate part here: even though you know that you want to edit HEAD~2, there
> is no way to tell git that right away. Every time you have to launch editor, edit the
> line manually, then save it, close it.
>
> I have seen here some discussions about improving that, someone even posted patches,
> but I'm not aware if it went anywhere. So I created 2 years ago a shell wrapper
> `rebase-at`¹, which upon called as `rebase-at e HEAD~2`, does the thing described
> above automatically. Under the hood I simply substitute EDITOR with `sed` command
> that replaces `pick` on the first line (the HEAD~2 commit) with `e`. If used with
> shell autocompletion, it is now practically instantaneous.
>
> I'm almost happy with `rebase-at`, except I don't know of any way to make it work
> with `reword` git action. You see, "rewording a commit" requires to run EDITOR twice:
> first to substitute `pick` with `reword`, and then to actually edit the commit
> message. But since EDITOR was substituted with sed, the 2nd run won't give you an
> actual editor to change the commit message.
>
> Any ideas, how can I tell `git` that I want to "reword" nth commit right away? Sure,
> I am not the first one to stumble upon it, am I? Any ideas?
>
> 1: https://github.com/Hi-Angel/dotfiles/blob/0b9418224e4ce7c9783dbc2d9473fd1991b9b0b2/.zshrc#L148-L160

Have your GIT_EDITOR do one thing or the other depending on whether it's
asked to edit git-rebase-todo. This works for me:
    
    # rebase-at <action> <comit-ids-and-co>
    function rebase-at() {
        local action=$1
        shift 1
        GIT_EDITOR='perl -MFile::Basename=basename -wE '"'"'
            my $f = shift;
    	exec qw[sed -i -E], q[1s/\\w+/'$action'/], $f
    	    if basename($f) eq q[git-rebase-todo];
            exec "$ENV{EDITOR} $f";
        '"'" git rebase -i "$@"
    }

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: How to interactively rebase-and-reword nth commit?
  2021-08-25 14:06 How to interactively rebase-and-reword nth commit? Konstantin Kharlamov
  2021-08-25 15:01 ` Ævar Arnfjörð Bjarmason
@ 2021-08-25 15:54 ` Martin Ågren
  2021-08-25 16:32   ` Konstantin Kharlamov
  2021-08-26  6:28 ` ZheNing Hu
  2021-08-27  2:04 ` Jeff King
  3 siblings, 1 reply; 7+ messages in thread
From: Martin Ågren @ 2021-08-25 15:54 UTC (permalink / raw)
  To: Konstantin Kharlamov; +Cc: Git Mailing List

Hi Konstantin,

On Wed, 25 Aug 2021 at 16:07, Konstantin Kharlamov <hi-angel@yandex.ru> wrote:
> I'm almost happy with `rebase-at`, except I don't know of any way to make it work
> with `reword` git action. You see, "rewording a commit" requires to run EDITOR twice:
> first to substitute `pick` with `reword`, and then to actually edit the commit
> message. But since EDITOR was substituted with sed, the 2nd run won't give you an
> actual editor to change the commit message.

I think GIT_SEQUENCE_EDITOR is for pretty much exactly such a use-case:

  This environment variable overrides the configured Git editor when
  editing the todo list of an interactive rebase. See also git-
  rebase(1) and the sequence.editor option in git-config(1).

Does that help, by not stomping on EDITOR/GIT_EDITOR?

Martin

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: How to interactively rebase-and-reword nth commit?
  2021-08-25 15:54 ` Martin Ågren
@ 2021-08-25 16:32   ` Konstantin Kharlamov
  0 siblings, 0 replies; 7+ messages in thread
From: Konstantin Kharlamov @ 2021-08-25 16:32 UTC (permalink / raw)
  To: Martin Ågren; +Cc: Git Mailing List

Amazing, thank you, simple replacing EDITOR with GIT_SEQUENCE_EDITOR worked for
me!

On Wed, 2021-08-25 at 17:54 +0200, Martin Ågren wrote:
> Hi Konstantin,
> 
> On Wed, 25 Aug 2021 at 16:07, Konstantin Kharlamov <hi-angel@yandex.ru> wrote:
> > I'm almost happy with `rebase-at`, except I don't know of any way to make it
> > work
> > with `reword` git action. You see, "rewording a commit" requires to run
> > EDITOR twice:
> > first to substitute `pick` with `reword`, and then to actually edit the
> > commit
> > message. But since EDITOR was substituted with sed, the 2nd run won't give
> > you an
> > actual editor to change the commit message.
> 
> I think GIT_SEQUENCE_EDITOR is for pretty much exactly such a use-case:
> 
>   This environment variable overrides the configured Git editor when
>   editing the todo list of an interactive rebase. See also git-
>   rebase(1) and the sequence.editor option in git-config(1).
> 
> Does that help, by not stomping on EDITOR/GIT_EDITOR?
> 
> Martin



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: How to interactively rebase-and-reword nth commit?
  2021-08-25 14:06 How to interactively rebase-and-reword nth commit? Konstantin Kharlamov
  2021-08-25 15:01 ` Ævar Arnfjörð Bjarmason
  2021-08-25 15:54 ` Martin Ågren
@ 2021-08-26  6:28 ` ZheNing Hu
  2021-08-27  2:04 ` Jeff King
  3 siblings, 0 replies; 7+ messages in thread
From: ZheNing Hu @ 2021-08-26  6:28 UTC (permalink / raw)
  To: Konstantin Kharlamov; +Cc: Git List

Konstantin Kharlamov <hi-angel@yandex.ru> 于2021年8月25日周三 下午10:08写道:
>
> I think, one of the most frequent git features used is `rebase -i`. There's a common
> workflow I think everyone knows: you have commits 1, 2, 3, then you decide "Nah, 2nd
> commit needs a change", so you do `git rebase -i HEAD~2`, then in popped up editor
> you modify the `pick` on the first line to become `edit`, then you do the change,
> then `git rebase --continue`.
>
> The boilerplate part here: even though you know that you want to edit HEAD~2, there
> is no way to tell git that right away. Every time you have to launch editor, edit the
> line manually, then save it, close it.
>
> I have seen here some discussions about improving that, someone even posted patches,
> but I'm not aware if it went anywhere. So I created 2 years ago a shell wrapper
> `rebase-at`¹, which upon called as `rebase-at e HEAD~2`, does the thing described
> above automatically. Under the hood I simply substitute EDITOR with `sed` command
> that replaces `pick` on the first line (the HEAD~2 commit) with `e`. If used with
> shell autocompletion, it is now practically instantaneous.
>
> I'm almost happy with `rebase-at`, except I don't know of any way to make it work
> with `reword` git action. You see, "rewording a commit" requires to run EDITOR twice:
> first to substitute `pick` with `reword`, and then to actually edit the commit
> message. But since EDITOR was substituted with sed, the 2nd run won't give you an
> actual editor to change the commit message.
>
> Any ideas, how can I tell `git` that I want to "reword" nth commit right away? Sure,
> I am not the first one to stumble upon it, am I? Any ideas?
>
> 1: https://github.com/Hi-Angel/dotfiles/blob/0b9418224e4ce7c9783dbc2d9473fd1991b9b0b2/.zshrc#L148-L160
>
>

Ha, this is simply a dream feature for me.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: How to interactively rebase-and-reword nth commit?
  2021-08-25 14:06 How to interactively rebase-and-reword nth commit? Konstantin Kharlamov
                   ` (2 preceding siblings ...)
  2021-08-26  6:28 ` ZheNing Hu
@ 2021-08-27  2:04 ` Jeff King
  2021-08-27  9:18   ` Konstantin Kharlamov
  3 siblings, 1 reply; 7+ messages in thread
From: Jeff King @ 2021-08-27  2:04 UTC (permalink / raw)
  To: Konstantin Kharlamov; +Cc: git

On Wed, Aug 25, 2021 at 05:06:03PM +0300, Konstantin Kharlamov wrote:

> Any ideas, how can I tell `git` that I want to "reword" nth commit right away? Sure,
> I am not the first one to stumble upon it, am I? Any ideas?

Have you looked at the new --fixup options in 2.32? E.g.:

  git commit --fixup reword:HEAD~2

will immediately drop you in an editor to adjust the commit message. The
result is a new "fixup" commit which is then applied when you
autosquash. So you could do multiple such adjustments, and then:

  GIT_EDITOR=: git rebase -i --autosquash

to apply them all to the appropriate spots.

-Peff

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: How to interactively rebase-and-reword nth commit?
  2021-08-27  2:04 ` Jeff King
@ 2021-08-27  9:18   ` Konstantin Kharlamov
  0 siblings, 0 replies; 7+ messages in thread
From: Konstantin Kharlamov @ 2021-08-27  9:18 UTC (permalink / raw)
  To: Jeff King; +Cc: git

On Thu, 2021-08-26 at 22:04 -0400, Jeff King wrote:
> On Wed, Aug 25, 2021 at 05:06:03PM +0300, Konstantin Kharlamov wrote:
> 
> > Any ideas, how can I tell `git` that I want to "reword" nth commit right
> > away? Sure,
> > I am not the first one to stumble upon it, am I? Any ideas?
> 
> Have you looked at the new --fixup options in 2.32? E.g.:
> 
>   git commit --fixup reword:HEAD~2
> 
> will immediately drop you in an editor to adjust the commit message. The
> result is a new "fixup" commit which is then applied when you
> autosquash. So you could do multiple such adjustments, and then:
> 
>   GIT_EDITOR=: git rebase -i --autosquash
> 
> to apply them all to the appropriate spots.
> 
> -Peff

Thank you for the suggestion! I think I gonna stick to the `rebase-at` now that I know the way to solve my problem with GIT_SEQUENCE_EDITOR. The "rebase-at" workflow sounds better optimized to me, due to lack of the `git rebase -i --autosquash` step.

I get that the idea with autosquash that you can remove the commit if you realize you did something wrong. But I usually have a copy of the local branch on a remote repo, so in rare cases I realize I want to undo the change I can simply run `git reset --hard origin/mybranch` ☺ (otherwise, reflog is also a thing).


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2021-08-27  9:19 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-25 14:06 How to interactively rebase-and-reword nth commit? Konstantin Kharlamov
2021-08-25 15:01 ` Ævar Arnfjörð Bjarmason
2021-08-25 15:54 ` Martin Ågren
2021-08-25 16:32   ` Konstantin Kharlamov
2021-08-26  6:28 ` ZheNing Hu
2021-08-27  2:04 ` Jeff King
2021-08-27  9:18   ` Konstantin Kharlamov

Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).