我们都听说过,永远不要对已发布的作品进行 rebase,它很危险等等。但是,我还没有看到任何关于如何处理这种情况的食谱,以防发布 rebase .
现在,请注意,只有当存储库仅由已知(最好是少数)人群克隆时,这才是真正可行的,这样无论谁 push rebase 或重置,都可以通知其他人他们需要注意下次他们获取(!)。
如果您没有在 foo
上进行本地提交并且它会 rebase ,我看到的一个明显的解决方案将起作用:
git fetch
git checkout foo
git reset --hard origin/foo
这将简单地丢弃 foo
的本地状态,以支持其根据远程存储库的历史记录。
但是,如果在该分支上提交了实质性的本地更改,该如何处理这种情况呢?
最佳答案
在大多数情况下,在推送 rebase 后恢复同步实际上并不那么复杂。
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
即。首先,您为远程分支最初所在的位置设置了一个书签,然后您使用它来重放从该点开始的本地提交到 rebased 远程分支。
rebase 就像暴力:如果它不能解决你的问题,你只需要更多。 ☺
当然,如果您查找 rebase 前的 origin/foo
提交 ID 并使用它,您当然可以在没有书签的情况下执行此操作。
这也是您如何处理在提取之前忘记制作书签的情况。什么都没有丢失——你只需要检查远程分支的 reflog:
git reflog show origin/foo | awk '
PRINT_NEXT==1 { print $1; exit }
/fetch: forced-update/ { PRINT_NEXT=1 }'
这将打印 origin/foo
在更改其历史记录的最新提取之前指向的提交 ID。
然后你可以简单地
git rebase --onto origin/foo <i>$commit</i> foo
关于git - 在有人将 rebase 或重置推送到已发布的分支后,我如何恢复/重新同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4084868/