Let's say I have a feature branch called FeatureA, and it is out of sync with (remote) development on which it is based. Normally I would rebase my branch by calling git rebase development (after syncing my local development with origin/development naturally).
Today, I do it different and call git pull --rebase origin development from my feature-branch instead. Now, what is the difference?
git pull --rebase origin development is a shortcut to these commands:
git fetch origin development
git rebase origin/development
That is, fetch origin/development and then rebase the current branch on top of it.
UPDATE
As @torek pointed out:
Yes, except that the two-argument version of fetch does not update origin/development in git 1.8.3 or earlier. (The rebase result is the same, but origin/development does not move.)
Short version: if the rebase goes well, it works fine. If not, it still works as well as it should, it just might be a bit confusing in a graphical viewer.
As always, git pull is basically git fetch followed by ... well, in this case, git rebase rather than git merge. So:
origin
development branch and put that in FETCH_HEAD
git merge <commit-ID-from-FETCH_HEAD>, use git rebase with that IDSo let's say the commit graph in your local tree looks like this (we'll assume you ran a git fetch at some point that updated origin/development with their commits E and F):
C - D <-- FeatureA
/
A - B <-- development
\
E - F <-- origin/development
And, let's further assume that on origin, there's one more commit now on their branch named development. The fetch-from-origin step will pick it up and make FETCH_HEAD point to that, so let's draw it in as node G:
C - D <-- FeatureA
/
A - B <-- development
\
E - F <-- origin/development
\
G <-- FETCH_HEAD
(If your git is new enough, 1.8.4 or later, origin/development will also be updated at this time, to point at node G. If not, your local copy of their development, stored in your origin/development, lags behind. It won't really matter for the rebase, it will just change how you'll see the results in a git log --graph view or a graphical commit-tree viewer.)
Now the rebase will copy your FeatureA commits in the usual method for a rebase, and make FeatureA point to the copies, abandoning the original commits. We'll call the rebased ones C' and D':
C - D [abandoned]
/
A - B <-- development
\
E - F <-- origin/development
\
G <-- FETCH_HEAD
\
C' - D' <-- FeatureA
If you run a plain git fetch at this point, or if you have the newer-enough git so that origin/development has moved; and if we drop the "abandoned" parts and simplify the drawing, it becomes:
A - B <-- development
\
E - F - G <-- origin/development
\
C' - D' <-- FeatureA
If you fast-forward-merge your local branch-label development to match origin/development, it's even simpler to draw (drop the kink down from B to E and put both development and origin/development to the right of the arrow pointing to G).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With