Search code examples
gitversion-control

Sync local git repo with remote in one shot discarding local changes/commits


I'm a not a git expert so this might look like a silly question.

I have local and remote repositories, I want to sync my local with the remote repository. I have many local changes, stashed changes, and few commits which are not yet pushed to remote.

One way can be to remove all local changes(using git clean), revert commits and than fetch/pull from remote. But I think there must be some single command which can do all this in one go. I tried using git reset --hard HEAD and then git pull but that gave me:

# Your branch and 'origin/master' have diverged,
# and have 1 and 9 different commits each, respectively.

Was looking at this question as well, but didn't help.


Solution

  • As commented, a git reset --hard origin/master would reset your master to upstream.

    But: your current master (with its local commit) would be "lost" (at least, no longer visible).

    So one step isn't the best approach.

    I would recommend something like:

    git checkout master
    git fetch origin
    git branch tmp
    git reset --hard origin/master
    git checkout tmp
    git rebase master
    git checkout master
    git merge tmp
    git branch -d tmp
    

    That way, you rebase your local commit(s) on top of the updated master

    x--x--x--x--x (master, origin/master)       x--x--x--x--x--y'--y' (tmp, master)
           \                                 =>
            y--y  (tmp)                           (after rebase+merge)