James Lin
James Lin

Reputation: 26538

git rebase confusion

let's say if I have 2 branches topic and master if I am on topic branch, and run git rebase master does it rebase master or rebase topic branch?

doing git rebase --help gave me this

Assume the following history exists and the current branch is "topic":

             A---B---C topic
            /
       D---E---F---G master

From this point, the result of either of the following commands:

       git rebase master
       git rebase master topic

would be:

                         A'--B'--C' topic
                        /
           D---E---F---G master

NOTE: The latter form is just a short-hand of git checkout topic followed by git rebase master. When rebase exits topic will remain the checked-out branch.

And if I want to achieve this D---E---F---G---A---B---C master, should I switch to master and run git rebase -i topic?

And if I run git rebase -i topic try to squash A,B,C to C to become D---E---F---G---C master, I get noop

Upvotes: 2

Views: 1330

Answers (1)

Roman
Roman

Reputation: 20246

Assuming you start out with a tree that looks like this

         A---B---C topic
        /
   D---E---F---G master

You'll want to run 2 commands git rebase master to make it look like this

                     A'--B'--C' topic
                    /
   D---E---F---G master

then from master run git merge topic, which will do a fast forward merge, and you'll end up with a tree that looks like this

                             topic
                            /
   D---E---F---G---A---B---C -- master

Can I just checkout master and run git rebase topic??

Running that command would result in a tree that looks like this

                             topic
                            /
   D---A---B---C---E---F---G -- master

This is the (somewhat edited) git documentation for rebase, hopefully this will help:

All changes made by commits in the current branch but that are not in upstream are saved to a temporary area.

If you are on topic and run git rebase master, that means commits A, B and C are going into a temporary area.

The current branch is reset to upstream. This has the exact same effect as git reset --hard upstream.

At this point the temporary state of the tree looks like this

                 topic
                /
   D---E---F---G -- master

The commits that were previously saved into the temporary area are then reapplied to the current branch, one by one, in order.

Commits A, B, C that were saved into the temporary area are "recommitted" to the branch you are currently on topic.

                             topic
                            /
   D---E---F---G---A---B---C -- master

Running git rebase topic from master would perform the exact same steps, except instead of putting commits A, B, C into the temporary area, it would put commits E, F G into the temporary area.

Upvotes: 3

Related Questions