I would like to avoid recurrent branches intersections on my remote repository by using a rebase instead of a merge.
To give you a better understanding of what I would like to achieve, please consider the following situation:
$ git lg
* 2345678 hotfix (HEAD -> master)
* 1234567 foo (origin/master, origin/HEAD)
$ git push
! [rejected] master -> master (fetch first)
$ git fetch
$ git lg
* 2345678 hotfix (HEAD -> master)
| * 3456789 other change (origin/master, origin/HEAD)
|/
* 1234567 foo
Usually, the standard way of solving this issue is a merge followed by a push.
$ git merge origin/master
$ git lg
* 4567890 Merge remote-tracking branch 'origin/master'
|\
* | 2345678 hotfix (HEAD -> master)
| * 3456789 other change (origin/master, origin/HEAD)
|/
* 1234567 foo
$ git push
I don't like this solution because I could easily avoid the branching in this particular case. So, let's revert the change with git reset --hard head~1 and try another solution instead:
$ git rebase origin/master
First, rewinding head to replay your work on top of it...
Applying: hotfix
$ git lg
* 2345678 hotfix (master)
| * 5678901 hotfix (HEAD)
| * 3456789 other change (origin/master, origin/HEAD)
|/
* 1234567 foo
Now comes the unpleasant part where I have to move my master back on its HEAD:
$ git branch -D master
$ git checkout -b master
$ git push
$ git branch --set-upstram-to=origin/master master
Branch master set up to track remote branch master from origin.
$ git lg
* 5678901 hotfix (HEAD -> master, origin/master, origin/HEAD)
* 3456789 other change
* 1234567 foo
My question is how can I simplify my rebase and avoid the unpleasant part?
I think the easiest way is to change your pull workflow. There are a couple options here.
First, you can use the --rebase flag to pull
git pull --rebase
Per the docs, git pull executes a fetch followed by a merge in its default configuration. Using the --rebase flag will replace the merge with a rebase :)
Second, you can set a default to always do this with git pull
git config --global pull.rebase true
I would recommend the first approach, as setting a default of rebase makes me nervous. I created an alias git pr for git pull --rebase to make it easier. That way I can make the decision with each pull.
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