All of lore.kernel.org
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: John Tapsell <johnflux@gmail.com>
Cc: git@vger.kernel.org
Subject: Re: git rebase --interactive squash/squish/fold/rollup
Date: Wed, 17 Jun 2009 09:33:19 -0700	[thread overview]
Message-ID: <7vvdmurfao.fsf@alter.siamese.dyndns.org> (raw)
In-Reply-To: <43d8ce650906170555m644564b3v3722168f7217c326@mail.gmail.com> (John Tapsell's message of "Wed\, 17 Jun 2009 13\:55\:26 +0100")

John Tapsell <johnflux@gmail.com> writes:

>> branch, hack, commit.
>> hack, commit, hack, commit
>
> What if you used  commit --append  instead?
>
> The trouble though of squashing all the commits into one is that it
> makes it impossible to bisect later.  Are you really sure that your
> final commit cannot be broken into small commits?  Ideally each commit
> is small but self contained.  Squashing should be done only to fix
> cases where you introduced a bug then fixed it, or to fix a partial
> implementation etc.

I think you meant --amend, but it often happens to me that after preparing
a three-patch series:

	[1/3] Clean up the surrounding code I will touch
        [2/3] Lay the groundwork
        [3/3] Implement a cool new feature

I find that there are more clean-up that should have been done in [1/3].
The way "rebase -i" expects me to work is:

	$ edit ;# more clean-ups
	$ git commit -a -m 'squash to "clean up"'
        $ git rebase -i HEAD~5

which will give me
        
        pick 1/3 Clean up ...
        pick 2/3 Lay the groundwork
        pick 3/3 Implement
        pick 4/3 squash to "clean up"

that I'll change to 

        pick 1/3 Clean up ...
        squash 4/3 squash to "clean up"
        pick 2/3 Lay the groundwork
        pick 3/3 Implement

and then I'll need to edit the commit message for the first two combined.
More than half of the time (but not necessarily all the time), the edit
involves just removing the single-liner 'squash to "clean up"',

You _could_ work this way instead using "amend".  Immediately after
finishing the three-patch series:

	$ git rebase -i HEAD~4

which gives me

        pick 1/3 Clean up ...
        pick 2/3 Lay the groundwork
        pick 3/3 Implement

that I'll change to

        edit 1/3 Clean up ...
        pick 2/3 Lay the groundwork
        pick 3/3 Implement

and then perform extra clean-up when "rebase -i" let's me amend the first
one.

But this is much less convenient than being able to accumulate fix-ups as
separate commits on top of the mostly finished main series, and then being
able to later insert these fix-ups into the main series to be squashed
using "rebase -i", if (and only if) what you need to do are many small
fixups (imagine there are not just a single '[4/3] squash to "clean up"'
but a lot more fix-up commits in the above example).  Depending on the
style you work, "go back to amend" is Ok, or you may even prefer to.  But
some people do not switch context as rapidly as others.  After finding a
small "missed piece", having to go back to edit and come back is much more
heavyweight operation than being able to make a small "fix-up" commit on
top and keep going.  The latter keeps your thought process less disrupted.

And it is very likely that the "small fixups" won't change what the
original commit log message of the commit in the main needs to say
(otherwise they won't be "small").

So I can see why a variant of "squash" that does not change (nor even ask
for a replacement of) the commit log message from the one that is being
amended could be useful.  I am tempted to suggest calling that a "fixup"
operation, but some people may expect "fixup" to mean a variant of "edit"
that does not bother you by dropping you back to the shell to touch the
tree that is recorded (i.e. "fixing up the commit log message only"), so
it is not a very good word.

  parent reply	other threads:[~2009-06-17 16:33 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-06-17 12:06 git rebase --interactive squash/squish/fold/rollup Minty
2009-06-17 12:55 ` John Tapsell
2009-06-17 13:45   ` Minty
2009-06-17 16:33   ` Junio C Hamano [this message]
2009-06-17 16:40     ` John Tapsell
2009-06-17 16:48     ` Paolo Bonzini
2009-06-17 17:05     ` John Koleszar
2009-06-17 20:50       ` John Tapsell
2009-06-17 18:20     ` Clemens Buchacher
2009-06-18 22:31       ` Minty
2009-06-17 21:33     ` [PATCH] rebase -i: auto-squash commits Nanako Shiraishi
2009-06-17 22:08       ` Johannes Schindelin
2009-06-18  0:11         ` [PATCH] " Nicolas Sebrecht
2009-06-18  5:07           ` Junio C Hamano
2009-06-18  8:06             ` Johannes Schindelin
2009-06-18  8:11               ` Jakub Narebski
2009-06-18  8:21                 ` Junio C Hamano
2009-06-18  8:26                   ` Johannes Schindelin
2009-06-18  8:17               ` Teemu Likonen
2009-06-18  8:29                 ` Johannes Schindelin
2009-06-18  8:44                   ` Teemu Likonen
2009-06-18 12:16                     ` Johannes Schindelin
2009-06-18 13:10                       ` Jakub Narebski
2009-06-18 14:04                   ` John Koleszar
2009-06-18  8:20               ` Junio C Hamano
2009-06-18  8:33                 ` Johannes Schindelin
2009-06-18  8:44                   ` Michael J Gruber
2009-06-19  7:18                   ` Miles Bader
2009-06-18 11:18                 ` Nicolas Sebrecht
2009-06-18  8:34               ` Matthieu Moy
2009-06-18  8:44                 ` Johannes Schindelin
2009-06-18  8:59                   ` Matthieu Moy
2009-06-18 10:59             ` Nicolas Sebrecht
2009-06-18  5:21       ` [PATCH] " Junio C Hamano
2009-06-18 21:55         ` [PATCH v2] rebase -i --autosquash: " Nanako Shiraishi
2009-06-18 22:35           ` Alex Riesen
2009-06-19 23:07           ` Wincent Colaiuta
2009-06-20  1:46             ` Nanako Shiraishi
2009-06-18  7:20       ` [PATCH] rebase -i: " Michael Haggerty
2009-06-18  7:54         ` Junio C Hamano

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=7vvdmurfao.fsf@alter.siamese.dyndns.org \
    --to=gitster@pobox.com \
    --cc=git@vger.kernel.org \
    --cc=johnflux@gmail.com \
    /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.