I have a local branch of a project (\"configUpdate\") that I\'ve forked from somebody else\'s project and I\'ve done a load of changes on it and would like to merge the changes
From your feature branch (e.g configUpdate
) run:
git fetch
git rebase origin/master
Or the shorter form:
git pull --rebase
Why this works:
git merge branchname
takes new commits from the branch branchname
, and adds them to the current branch. If necessary, it automatically adds a "Merge" commit on top.
git rebase branchname
takes new commits from the branch branchname
, and inserts them "under" your changes. More precisely, it modifies the history of the current branch such that it is based on the tip of branchname
, with any changes you made on top of that.
git pull
is basically the same as git fetch; git merge origin/master
.
git pull --rebase
is basically the same as git fetch; git rebase origin/master
.
So why would you want to use git pull --rebase
rather than git pull
? Here's a simple example:
You start working on a new feature.
By the time you're ready to push your changes, several commits have been pushed by other developers.
If you git pull
(which uses merge), your changes will be buried by the new commits, in addition to an automatically-created merge commit.
If you git pull --rebase
instead, git will fast forward your master to upstream's, then apply your changes on top.
I found out it was:
$ git fetch upstream
$ git merge upstream/master
Switch to your local branch
> git checkout configUpdate
Merge remote master to your branch
> git rebase master configUpdate
In case you have any conflicts, correct them and for each conflicted file do the command
> git add [path_to_file/conflicted_file] (e.g. git add app/assets/javascripts/test.js)
Continue rebase
> git rebase --continue
git rebase didn't seem to work for me. After git rebase, when I try to push changes to my local branch, I kept getting an error ("hint: Updates were rejected because the tip of your current branch is behind its remote counterpart. Integrate the remote changes (e.g. 'git pull ...') before pushing again.") even after git pull. What finally worked for me was git merge.
git checkout <local_branch>
git merge <master>
If you are a beginner like me, here is a good article on git merge vs git rebase. https://www.atlassian.com/git/tutorials/merging-vs-rebasing