我知道有时当我运行时git push
,我会收到此错误:
error: failed to push some refs
To prevent you from losing history, non-fast-forward updates were rejected
有人可以举例说明如果我推送非快进更新会丢失历史记录的情况吗?据我了解,当我这样做时git push
,git 只会将我的提交推送到远程存储库而不删除任何现有的提交,那么它将如何丢失历史记录?
谢谢!
我知道有时当我运行时git push
,我会收到此错误:
error: failed to push some refs
To prevent you from losing history, non-fast-forward updates were rejected
有人可以举例说明如果我推送非快进更新会丢失历史记录的情况吗?据我了解,当我这样做时git push
,git 只会将我的提交推送到远程存储库而不删除任何现有的提交,那么它将如何丢失历史记录?
谢谢!
当你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
。
假设您将本地推master
送到远程master
。
如果您的本地分支和远程分支发生了分歧(自上次拉取后两者都有提交),将如何处理?
一种方法是将本地的当前提交声明master
为新的远程master
。但这会丢失当前远程提交的历史记录master
,因为它们永远不会出现在您提交的祖先中。
(我想“丢失的”提交仍然会远程存在,但它们不会在master
分支上。)