How can I use git rebase without requiring a forced push?

In an attempt to achieve git nirvana, I’m spending the day learning how to leverage rebase for situations where I currently merge.

When running through what I consider to be a git 101 flow (which I spell out below), I have to push --force when pushing my changes back to the origin.

I’m not the only one – I know that this is covered ground (see 1,2,3,4,5), and I understand the technical reasons why a force is necessary. My issue is this — there are many (many) blog entries singing the praises of rebase and how it’s changed their lives (see 1,2,3,4 to list a few), but none of them mentions that push --force is part of their flow. However, nearly every answer to the existing stackoverflow questions say things like “yeah, if you’re gonna rebase, ya gotta use push --force“.

Given the number and religiosity of rebase advocates, I have to believe that using ‘push –force’ is not an inherent part of a rebase flow, and that if one often has to force their pushes, they’re doing something wrong.

push --force is a bad thing.

So here’s my flow. In what way could I achieve the same results without a force?

Simple Example

Two branches:

  • v1.0 – a release branch, contains only patches
  • master – everything for the next major release.

I’ve got a few patch commits and a few commits for the next release.

premerge

I’d like to incorporate the patches into my master so that they’re not lost for the next release. Pre-enlightenment I’d simply:

git checkout master
git merge v1.0

But now I’m trying

git checkout master
git rebase v1.0

So now I’m here:

enter image description here

Time for:

git push

No dice.

  • Git rebase from one branch to another
  • Git Rebase - Missing Merge requests while rebasing with master
  • GIT rebase overwritten all changes
  • Git commit squashing (rebase -i): how do commits actually work?
  • git rebase - does pick effectively do nothing?
  • Why is an interactive rebase squishing my commits together?
  • Recommended git workflow for test and production instances
  • git squash commits for public server, but keep detailed commits for private server
  • 5 Solutions collect form web for “How can I use git rebase without requiring a forced push?”

    Rebasing is a great tool, but it works best when you use it to create fast-forward merges for topic branches onto master. For example, you might rebase your add-new-widget branch against master:

    git checkout add-new-widget
    git rebase -i master
    

    before performing a fast-forward merge of the branch into master. For example:

    git checkout master
    git merge --ff-only add-new-widget
    

    The benefit of this is that your history won’t have a lot of complex merge commits or merge conflicts, because all your changes will be rebased onto the tip of master before the merge. A secondary benefit is that you’ve rebased, but you don’t have to use git push --force because you are not clobbering history on the master branch.

    That’s certainly not the only use case for rebase, or the only workflow, but it’s one of the more sensible uses for it that I’ve seen. YMMV.

    @CodeGnome is right. You should not rebase master on v1.0 branch but v1.0 branch on master, that will make all the difference.

    git checkout -b integrate_patches v1.0
    git rebase master
    git checkout master
    git merge integrate_patches
    

    Create a new branch that points to v1.0, move that new branch on top of master and then integrate the new version of the V1.0 patches to the master branch.
    You will end up with something like :

    o [master] [integrate_patches] Another patch on v1.0
    o A patch on v1.0
    o Another change for the next major release
    o Working on the next major release
    |  o [v1.0] Another path on v1.0
    |  o A patch on v1.0
    | /
    o Time for the release
    

    This way to use rebase is recommended by the official git documentation.

    I think you are right about git push --force : you should only use it if you made a mistake and pushed something you did not want.

    You have to force push if you rebase, and you have already published your changes, right?

    I use rebase a whole bunch, but I either publish to something private where a force push doesn’t matter (eg: my own clone on GitHub, as part of a pull request), or I rebase before I push for the first time.

    This is the heart of the workflow where you use rebase, but don’t force push much: don’t publish things until they are ready, don’t rebase after you push.

    I think there’s a good use-case for this rebase-then-force-push pattern that’s not a result of a mistaken push: working on a feature branch by yourself from multiple locations (computers). I do this often, since I sometimes work at the office on my desktop, and sometimes from home/customer-site on my laptop. I need to rebase occasionally to keep up with the main branch and/or to make merges cleaner, but I also need to force-push when I leave one machine to go work on another (where I just pull). Works like a charm, as long as I’m the only one working on the branch.

    Here’s what I use (assuming your branch name is foobar):

    git checkout master              # switch to master
    git rebase   foobar              # rebase with branch
    git merge -s ours origin/master  # do a basic merge -- but this should be empty
    git push origin master           # aaand this should work
    
    Git Baby is a git and github fan, let's start git clone.