Subject: Re: [BUG] - git rebase -i performs rebase when it shouldn't?

From: Johannes Sixt <[email-masked]>
Date: Mon, 12 Apr 2010 17:47:08 +0200

Am 4/12/2010 17:28, schrieb Eugene Sajine:
> On Mon, Apr 12, 2010 at 11:13 AM, Johannes Sixt <[email-masked]> wrote:
>> Am 4/12/2010 16:09, schrieb Eugene Sajine:
>>> esajine@ESAJINEWWW /c/git_repos/test2 (topic)
>>> $ git rebase master
>>> Current branch topic is up to date.
>>> <======= Really? Topic is actually based on next – what does this "up
>>> to date" mean??
>>
>> Why should rebase bother? The difference between master and topic are
>> *two* commits. Since these two are already on top of master in linear
>> history, you get no advantage by doing a rebase operation. Therefore, you
>> see "already up to date".
> 
> You lost me completely...
> Rebase means change the base of the commit, change the fork point.

Rebase is meant to change the fork point for a history like this:

  --o--o--A--o--o--B  <-- master
           \
            o
             \
              o       <-- topic

topic forks from master at commit A; you use rebase to create history that
looks like this:

  --o--o--A--o--o--B     <-- master
                    \
                     o
                      \
                       o <-- topic

(OK, you knew that already.)

> Current fork point for topic is next. I want it to be master. What is
> up to date here???

You are already in the second situation above. The fact that you labeled
one commit "next" in between, like this:

  --o--o--A--o--o--B     <-- master
                    \
                     o   <-- next
                      \
                       o <-- topic

does not change the meaning of the command "git rebase master" in the
slightest: topic is "up to date" with respect to master.

> The message is poorly worded for sure.
> 
> I know that the form i have to use is:
> 
> git rebase --onto master next topic
> 
> but it is just because topic is not direct descendant of master, isn't it?

Watch out the wording that you use: "descendant of" has a well-defined
meaning in git, in particular, topic *is* a direct descendant of master.

What you wanted to say is: "but it is just because I have accidentally
begun to commit 'topic' on top of 'next', but I didn't want to do that".

And yes, you are right, because of this you need --onto in the rebase command.

> Come on! Please, please, explain me why it behaves DIFFERENTLY:
> 
> esajine@ESAJINEWWW /c/git_repos/test2 (topic)
> $ git rebase --onto master topic
> First, rewinding head to replay your work on top of it...
> fatal: Not a range.
> Nothing to do.
>                 <======== topic..HEAD is not a range, agreed
> 
> 
> esajine@ESAJINEWWW /c/git_repos/test2 (topic)
> $ git rebase -i --onto master topic
> Successfully rebased and updated refs/heads/topic. <=== BUG – here it
> printed me “noop” in file to edit, when I exited it should do nothing,
> but it still did something and I double checked it.

A historical accident, so to say. The implementor of interactive rebase
felt the "noop" behavior was useful, and I agree, FWIW.

-- Hannes