当git说“强制更新”时,什么和哪里可能会丢失东西?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

我最近收到了来自git的“强制更新”警告,只有我承诺。我没有做任何重建,所以我不知道为什么会发生这种情况。我想知道的是,我应该在哪里寻找可能丢失的变化?

为了说明,让存储库的三个副本L,D和S(笔记本电脑,台式机,服务器)。

开始时,所有三个存储库都是同步的。然后在D上完成工作并推到S.然后L运行git pull并获得“强制更新”。这是否意味着已经对L进行了改变而被覆盖,还是他们在别的地方?我怎样才能找到他们?

提问于
用户回答回答于

“强制更新”意味着远程追踪分支最近。如果在某人执行强制推送到存储库之后获取(或拉出),则会发生这种情况。

但是,执行时git pull,你的本地分支不会丢失任何历史记录。由于远程分支的历史现在与本地分离,因此git pull将执行合并。如果你看最近的提交(只是运行git log),你应该看到一个合并提交,第一个父代是你本地分支的前一个状态,第二个父代是你远程分支的新值。

为了说明,我刚刚重现了强制更新方案,并且git pull打印出以下内容:

> git pull
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 2 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (2/2), done.
From /Volumes/UserData/Users/kballard/Dev/Scratch/foo/server
 + 7193788...a978889 master     -> origin/master  (forced update)
Merge made by the 'recursive' strategy.
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 d

拉的提取部分打印(forced update),但新的值origin/master随后合并到本地分支。

用户回答回答于

例如:

  • D提交并推master送到S.
  • L读取。
  • D改变心意(修改提交,或master以任何方式改变历史)。
  • D将修改后的(非快进)压master入S.

在提取L时,将警告“强制更新”,因为先前的分支提示不再可通过分支引用到达master。但这正是D想要的。

要找什么

 + 7193788...a978889 master     -> origin/master  (forced update)

该行只会出现一次。对可能丢失的提交的引用是7193788。

如何探索它

如果L想保留对可能丢失的内容的引用,那么L可能会在上面的例子中出现:git branch whateverbranchname 7193788。无论当地结帐的当前状态如何,都可以完成此操作。

或者只是git checkout 7193788为了探究它,然后git checkout master回到主人身边。这可能需要先执行任何本地更改。

良好的做法

请注意,在没有与其他用户进行适当合作的情况下推送共享存储库中已更改的历史记录被认为是不好的做法(因为它会导致尚未共享更改的人员进行额外的工作)。

换句话说,在共享存储库上执行提取操作时,没有人应该看到“强制更新”。如果有人推动了一个不好的提交,他们应该考虑推动一个更正的提交,而不是改变现有的历史。或者,他们应该在推动改变的历史之前与他人达成一致。后一种选择在公共存储库上是不可能的。

扫码关注云+社区