在推送非快进提交时git如何失去历史?

use*_*425 3 git commit git-push revision-history

我知道有时当我跑步时git push,我得到这个错误:

error: failed to push some refs
To prevent you from losing history, non-fast-forward updates were rejected
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

gtu*_*rri 5

当你push,你发送你的提交,但你也更新远程分支.

说远程回购是:

A <- B <- C (master)
Run Code Online (Sandbox Code Playgroud)

现在你克隆它,使用commit A开始一些dev,最后得到:

A <- B <- C (origin/master)
  <- D <- E (master)
Run Code Online (Sandbox Code Playgroud)

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

A <- D <- E (master)
  <- B <- C
Run Code Online (Sandbox Code Playgroud)

因此提交B和C仍然存在,但是它们无法通过分支到达.如果有人现在克隆了回购,他将在当地拥有:

A <- D <- E (master; origin/master)
Run Code Online (Sandbox Code Playgroud)

即:从他的观点来看,承诺B和C都会丢失


编辑:

  • "提交仍然存在"意味着:

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

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

  • "但是他们无法通过分支到达"意味着:

当我推动力量后别人克隆了这个遥控器时,他会得到这个.git/objects/ab/cdef文件.但是,除非他正在寻找它,否则将不会意识到此提交一旦存在.例如,它不会显示gitk --all.