Git push rejected after feature branch rebase

git

Solution

The problem is that `git push` assumes that remote branch can be fast-forwarded to your local branch, that is that all the difference between local and remote branches is in local having some new commits at the end like that:

Z--X--R         <- origin/some-branch (can be fast-forwarded to Y commit)
       \        
        T--Y    <- some-branch

When you perform `git rebase` commits D and E are applied to new base and new commits are created. That means after rebase you have something like that:

A--B--C------F--G--D'--E'   <- feature-branch
       \  
        D--E                <- origin/feature-branch

In that situation remote branch can't be fast-forwarded to local. Though, theoretically local branch can be merged into remote (obviously you don't need it in that case), but as `git push` performs only fast-forward merges it throws and error.

And what `--force` option does is just ignoring state of remote branch and setting it to the commit you're pushing into it. So `git push --force origin feature-branch` simply overrides `origin/feature-branch` with local `feature-branch`.

In my opinion, rebasing feature branches on `master` and force-pushing them back to remote repository is OK as long as you're the only one who works on that branch.

Problem

OK, I thought this was a simple git scenario, what am I missing? I have a `master` branch and a `feature` branch. I do some work on `master`, some on `feature`, and then some more on `master`. I end up with something like this (lexicographic order implies the order of commits): ``` A--B--C------F--G (master) \ D--E (feature) ``` I have no problem to `git push origin master` to keep the remote `master` updated, nor with `git push origin feature` (when on `feature`) to maintain a remote backup for my `feature` work. Up until now, we're good. But now I want to rebase `feature` on top of the `F--G` commits on master, so I `git checkout feature` and `git rebase master`. Still good. Now we have: ``` A--B--C------F--G (master) \ D'--E' (feature) ``` Problem: the moment I want to backup the new rebased `feature` branched with `git push origin feature`, the push is rejected since the tree has changed due to the rebasing. This can only be solved with `git push --force origin feature`. I hate using `--force` without being sure I need it. So, do I need it? Does the rebasing necessarily imply that the next `push` should be `--force`ful? This feature branch is not shared with any other devs, so I have no problem de facto with the force push, I'm not going to lose any data, the question is more conceptual.

Original source

Related problems