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
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…