Re: [PATCH 1/2] rebase -i: support --root without --onto
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Jun 26, 2012, 19:20 UTC
- Message-ID
- <7vtxxxc22x.fsf@alter.siamese.dyndns.org>
- In-Reply-To
- <bdb45972685db8899a46ebc62213e56c9a3d0c94.1340717793.git.chris@arachsys.com>
Chris Webb <chris@arachsys.com> writes:
> +do_pick () {
> + if test "$(git rev-parse HEAD)" = "$squash_onto"The idea to create a sentinel root upfront and special case it here is a good one.
> + then
I am not quite sure what is going on in this "then" clause.
> + git commit --allow-empty --allow-empty-message --amend \ > + --no-post-rewrite -n -q -C $1 &&
At this point, nobody touched the empty sentinel root yet; you rewrite its log message and authorship using the picked commit.
> + pick_one -n $1 &&
And then you create a new commit that records the update "$1" does relative to its parent (this hopefully only contains additions -- is it sensible to die-with-patch if it doesn't?), making sure that it does not fast-forward. Does this always make the result a root commit? If "$1" has parents, wouldn't it become a child of the commits its parents were rewritten to (if any) in pick_one_preserving_merges() that is called from pick_one?
> + git commit --allow-empty --allow-empty-message \ > + --amend --no-post-rewrite -n -q -C $1 ||
And then you rewrite the log and authorship of that one.
In short, my questions are:
(1) what is the purpose of the first "commit --amend" to update the
sentinel root commit? (2) Is the purpose of "pick_one -n" done here to create a root
commit? Does it always do so correctly?Show 22 quoted lines
> diff --git a/git-rebase.sh b/git-rebase.sh > index e616737..bde2be8 100755 > --- a/git-rebase.sh > +++ b/git-rebase.sh > @@ -31,7 +31,7 @@ SUBDIRECTORY_OK=Yes > OPTIONS_KEEPDASHDASH= > OPTIONS_SPEC="\ > git rebase [-i] [options] [--onto <newbase>] [<upstream>] [<branch>] > -git rebase [-i] [options] --onto <newbase> --root [<branch>] > +git rebase [-i] [options] [--onto <newbase>] --root [<branch>] > git-rebase [-i] --continue | --abort | --skip > -- > Available options are > @@ -364,6 +364,11 @@ and run me again. I am stopping in case you still have something > valuable there.' > fi > > +if test -n "$rebase_root" && test -z "$onto" > +then > + test -z "$interactive_rebase" && interactive_rebase=implied > +fi > +
This makes "git rebase --root" without $onto imply "-i", which makes sense, but it was a bit unexpected (it wasn't in the proposed log message).