3

我在一个处于以下状态的分支上工作

        A'--B'--C'--D'
       /
A--B--C--D

发生了一些非常糟糕的事情,我必须在本地和远程返回 B',以便远程存储库如下

         A'--B'
        /
 A--B--C--D

对于我做的本地存储库

git reset --hard <sha>

但我怎样才能为远程存储库做到这一点?

我应该能够做类似的事情

git push origin mybranch --reset

但它不在手册页中

我尝试创建一个提交,它会取消以前的提交,但是

混帐添加。

报告没有变化(预计因为我正好在上一次推送之后)

那么如何重置远程存储库?

4

2 回答 2

4

要使用您的覆盖跟踪的远程分支,请执行git push origin --force mybranch. (或使用-f代替--force,或在分支名称前加上+: git push origin +mybranch。)

请注意,您应该警告任何可能已更改您的分支的协作者它已被远程更改,因此他们不会将其覆盖回来。因为git push在他们的副本上会为远程分支做快进——除非你至少对它做了一个新的提交,并且git pull不会更新他们的本地版本的分支。合作者应该:

git fetch origin
git checkout mybranch
git rebase origin/mybranch

更新完整性:正如@CodeGnome 建议的那样,要完全删除提交,请git prune --expire now在包含它们的所有 Git 存储库上运行。但请注意,此命令将从 Git 中删除所有悬空对象,并会阻止在运行之前恢复您“丢失”的任何数据。通常没问题,但无论如何你都需要被警告。

更新:正如这个页面所暗示的,git prune --expire now不会清除 reflogs 中的提交。查看解决方案的链接。对于侵入性较小的解决方案,请尝试git reflog expire --all mybranch. 您必须在运行之前执行此操作git prune

有时更可取的是显式生成“撤消”提交以删除更改(因此旧版本及其删除的事实在历史记录中可见)。有一个git revert命令。

于 2012-06-29T04:23:45.407 回答
3

从历史中删除提交

您真正需要做的就是在 B' 分支上,然后去git push --force覆盖该分支的当前提交指针。如果您没有将遥控器设置为跟踪分支,则可能需要这样做git push --force origin <branchname>

C' 和 D' 将保留在 reflog 中并作为存储库中的对象,直到它们最终被修剪,但除非您开始深入研究管道,否则不应显示为任何日志历史记录的一部分。

从存储库中删除悬空对象

如果您希望 C' 和 D' 完全退出存储库,则可以调用git prune --expire now两个存储库。那应该完全移除悬空的物体。

于 2012-06-29T04:26:17.203 回答