强迫git推后怎么拉?

And*_*cci 27 git

假设我从git repo中提取更改.然后,回购力量的作者推向中央回购.现在我不能拉,因为历史被重写了.

假设作者强行推送正确版本,我怎样才能提取新提交(并放弃旧提交)?

我知道这是糟糕的git工作流程,但有时你无法避免这种情况.

Die*_*Epp 53

扔掉你当地的变化

如果你要放弃你的工作,fetchreset.例如,如果您有一个名为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 resetgit rebase错误并且意外丢失了一些本地更改,您可以在reflog中找到更改.

在评论中,用户被提示git reflog expire--expire=now,但不要运行此命令,因为这将DESTROY您的安全网.拥有reflog的全部目的是让Git在你运行错误的命令时有时会挽回你的脖子.

基本上,这个命令将会立即破坏上面示例中的B,C,X,Y和Z提交,因此您无法将其恢复.运行此命令没有什么好处,除了它可能节省一点磁盘空间,但Git将在90天后清除数据,因此这种好处是短暂的.

  • @用户:我**强烈建议全部大写**,人们不要运行该命令,除非他们想要 **销毁 Git 保留的数据**,以防万一您运行错误的命令。 (2认同)
  • @user:对于阅读此评论的任何人,**不要**运行该命令.我甚至不确定命令试图实现什么,除了**破坏**保存数据的安全网,以防你输入错误命令,例如答案中的`git reset --hard`.再次,**不要**破坏reflog,除非你非常确定你想这样做(再次,你为什么要那样做?) (2认同)
  • 重点是,在这种情况下 git 不够智能。如果有人用力推动,我认为一定是出于某种原因。如果我在检查后没有更改分支上的任何内容,则可以用原点的更改覆盖我的分支。因此,当存在强制推送时,不应尝试合并导致冲突的更改,而应该中止简单的“git pull”,并且在这种情况下用户应该可以选择执行强制拉取。 (2认同)