git - 在有人将 rebase 或重置推送到已发布的分支后,我如何恢复/重新同步?

标签 git rebase git-rebase git-reset

我们都听说过,永远不要对已发布的作品进行 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/

相关文章:

git - SourceTree 中没有分支

Linux 混帐 : Unable to access remote: error setting certificate verify locations

Git rebase 不断失败,需要手动 merge 干预

git:如何通过等效的 git 命令自动化交互式 rebase /替换它

git - 如何在 rebase 期间为所有提交运行测试

Git rebase 失败, 'Your local changes to the following files would be overwritten by merge'。没有局部变化?

git - 在 Git 中,本地分支可以相互跟踪——这有什么用?

git - 卡在 git commit 窗口

git 从历史记录中删除 merge 提交

git - 如何通过 SHA1 哈希重写 Git 提交?