How to avoid merge commits from Git pull when pushing to remote
GitMergePullGit Problem Overview
I have a repository and some local changes to commit. Before committing, I pulled the changes onto my local using Egit in Eclipse.
It creates a merge commit and I submit my commit over it.
Now when I am trying to push to origin, it is showing that it will push my commit as well as merge commit. But ideally, merge commit should not be a part of remote repository.
How to avoid this?
Git Solutions
Solution 1 - Git
Use rebase option whenever you pull from remote repository. Please follow the below steps,
- Commit your changes - It will create a new commit in your local.
- Now do
git pull --rebase <remote-name> <branch-name>
. - Basically the rebase take out your commits that you committed on the current branch HEAD as a patch. Then it will apply all the remote commits on top of HEAD and then applies your commits on top of it.
- So best practice is to commit changes then pull remote commits by using rebase option.
Solution 2 - Git
You can run
git config --global branch.autosetuprebase always
to make git pull --rebase
the default behaviour for git pull.
Solution 3 - Git
When you have uncommitted changes, you can do,
git stash
git pull --rebase <remote> <branch>
git stash apply
Solution 4 - Git
If you don't want a merge commit the best way to synchronize your local branch to the remote branch is to do a rebase. It is recommended that you do first a git fetch
and then git rebase
, however, as others have mentioned you can do both at the same time:
git pull --rebase --autostash
If you always do this you can configure git pull
to do this automatically:
git config --global pull.rebase true
git config --global rebase.autostash true
Solution 5 - Git
The usual strategy is to work on a branch. When the remote master changes, pull the changes to master and instead of merging, rebase the branch.
See Git Rebase at Atlassian.
Solution 6 - Git
Scenario:
Suppose a is PR raised in GIT repo : from feature/my_bug_fix
into release/project-007
.
But GIT is not allowing merge due to conflicts between above branches.
Then do this:
$ git checkout feature/my_bug_fix
$ git pull --rebase origin release/project-007
$ # resolve any conflicts encountered during the process
$ git rebase --continue
$ git push origin feature/my_bug_fix --force
It is an effective & clean way to resolve conflicting branches. Additionally, by using --rebase you will not get merge commits which would otherwise appear if you used git merge.
Moreover:
pull = fetch + merge
pull --rebase = fetch + rebase
So, choose the way the branch is to be handled.
You should now better understand the difference between merge and rebase :)