假设我从git repo中提取更改.然后,回购力量的作者推向中央回购.现在我不能拉,因为历史被重写了.
假设作者强行推送正确版本,我怎样才能提取新提交(并放弃旧提交)?
我知道这是糟糕的git工作流程,但有时你无法避免这种情况.
Die*_*Epp 53
如果你要放弃你的工作,fetch和reset.例如,如果您有一个名为remote origin的分支和一个名为的分支master:
$ git fetch origin
$ git reset --hard origin/master # Destroys your work
Run Code Online (Sandbox Code Playgroud)
如果你不想丢弃你的工作,你将不得不做一个git rebase --onto.假设旧的origin看起来像这样:
A ---> B ---> C
^
origin/master
Run Code Online (Sandbox Code Playgroud)
你有这个:
A ---> B ---> C ---> X ---> Y ---> Z
^ ^
| master
origin/master
Run Code Online (Sandbox Code Playgroud)
现在,上游变化改变了一些事情:
A ---> B ---> C ---> X ---> Y ---> Z
\ ^
---> B'---> C' master
^
origin/master
Run Code Online (Sandbox Code Playgroud)
您必须运行git rebase --onto origin/master <C> master,在上游更改之前<C>,旧origin/master分支的SHA-1 在哪里.这给你这个:
A ---> B ---> C ---> X ---> Y ---> Z
\
---> B'---> C'---> X'---> Y'---> Z'
^ ^
| master
origin/master
Run Code Online (Sandbox Code Playgroud)
注意B,C,X,Y和Z现在是如何"无法访问"的.它们最终将被Git从您的存储库中删除.在此期间(90天),Git会在reflog中保留一份副本,以防万一你犯了错误.
如果您git reset或git rebase错误并且意外丢失了一些本地更改,您可以在reflog中找到更改.
在评论中,用户被提示git reflog expire有--expire=now,但不要运行此命令,因为这将DESTROY您的安全网.拥有reflog的全部目的是让Git在你运行错误的命令时有时会挽回你的脖子.
基本上,这个命令将会立即破坏上面示例中的B,C,X,Y和Z提交,因此您无法将其恢复.运行此命令没有什么好处,除了它可能节省一点磁盘空间,但Git将在90天后清除数据,因此这种好处是短暂的.