How do I recover/resynchronise after someone pushes a rebase or a reset to a published branch?
Solution 1:
Getting back in synch after a pushed rebase is really not that complicated in most cases.
git checkout foo
git branch old-foo origin/foo # BEFORE fetching!!
git fetch
git rebase --onto origin/foo old-foo foo
git branch -D old-foo
Ie. first you set up a bookmark for where the remote branch originally was, then you use that to replay your local commits from that point onward onto rebased remote branch.
Rebasing is like violence: if it doesn’t solve your problem, you just need more of it. ☺
You can do this without the bookmark of course, if you look up the pre-rebase origin/foo
commit ID, and use that.
This is also how you deal with the situation where you forgot to make a bookmark before fetching. Nothing is lost – you just need to check the reflog for the remote branch:
git reflog show origin/foo | awk '
PRINT_NEXT==1 { print $1; exit }
/fetch: forced-update/ { PRINT_NEXT=1 }'
This will print the commit ID that origin/foo
pointed to before the most recent fetch that changed its history.
You can then simply
git rebase --onto origin/foo $commit foo
Solution 2:
I'd say the recovering from upstream rebase section of the git-rebase man page covers pretty much all of this.
It's really no different from recovering from your own rebase - you move one branch, and rebase all branches which had it in their history onto its new position.