3

我知道有时当我运行时git push,我会收到此错误:

error: failed to push some refs
To prevent you from losing history, non-fast-forward updates were rejected

有人可以举例说明如果我推送非快进更新会丢失历史记录的情况吗?据我了解,当我这样做时git push,git 只会将我的提交推送到远程存储库而不删除任何现有的提交,那么它将如何丢失历史记录?

谢谢!

4

2 回答 2

5

当你push发送你的提交时,你也会更新远程分支。

假设远程仓库是:

A <- B <- C (master)

现在你克隆它,从提交 A 开始做一些开发,最后得到:

A <- B <- C (origin/master)
  <- D <- E (master)

如果您强制推送,远程仓库将如下所示:

A <- D <- E (master)
  <- B <- C

所以提交 B 和 C 仍然存在,但它们无法通过分支访问。如果有人现在克隆 repo,他将在本地拥有:

A <- D <- E (master; origin/master)

即:从他的角度来看,提交 B 和 C 丢失了


编辑:

  • “提交仍然存在”是指:

说我的提交 B 有 sha1 abcdef。然后,有一个文件objects/ab/cdef(在远程仓库的根目录中,在我的本地克隆的 .git 目录中)代表这个提交。

如果你push -f,它不会删除这个远程文件,因此,提交 B 仍然存在于远程仓库中。(至少,只要它不是垃圾收集的)

  • “但它们无法通过分支到达”意味着:

当我推力后其他人克隆这个遥控器时,他会得到这个.git/objects/ab/cdef文件。但是,除非他正在寻找它,否则他不会知道这个提交曾经存在过。例如它不会由 显示gitk --all

于 2013-11-17T09:06:21.523 回答
0

假设您将本地推master送到远程master

如果您的本地分支和远程分支发生了分歧(自上次拉取后两者都有提交),将如何处理?

一种方法是将本地的当前提交声明master为新的远程master。但这会丢失当前远程提交的历史记录master,因为它们永远不会出现在您提交的祖先中。

(我想“丢失的”提交仍然会远程存在,但它们不会在master分支上。)

于 2013-11-17T09:01:24.643 回答