当git说"强制更新"时,可能会丢失什么内容?

Sea*_*ton 24 git

我最近收到了git对存储库的"强制更新"警告,只有我承诺.我没有做任何重新基地,所以我不知道为什么会这样.我想知道的是,我应该在哪里找到可能丢失的变化?

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

要开始,所有三个存储库都是同步的.然后在D上完成工作并推送到S.然后L运行git pull并获得"强制更新".这是否意味着L上的更改已被覆盖,或者是否在其他地方?我怎么才能找到它们?谢谢.

Lil*_*ard 20

"强制更新"意味着远程跟踪分支是最近的.如果您在某人强行推送到存储库后获取(或拉取),则会发生这种情况.

但是,执行时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
Run Code Online (Sandbox Code Playgroud)

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

  • 不,我想我的意思可能是“重置”。但这个答案已经有 4.5 年历史了,所以我不能肯定地说当我写下这个答案时我脑子里在想什么。 (4认同)
  • 谢谢回复.但是,我没有看到你的输出,我得到了这个:+ 3c4a314 ... e58bcd9 git-annex - > origin/git-annex(强制更新)+ 805d6cc ... 8fc53c5 master - > origin/master(强制更新) )已经是最新的.为什么没有合并? (2认同)
  • @肖恩惠顿;“已经是最新的”意味着您的本地分支已经包含远程分支。听起来好像有人强制推送远程分支以回溯它,但没有添加任何新的提交。您可以检查“git log origin/master..master”以查看本地有哪些不在远程的提交。 (2认同)

Sté*_*hon 6

我想知道的是,我应该在哪里寻找可能丢失的更改?

凯文(Kevin)在写作时不会错失任何本地历史是正确的。尽管如此,某些远程历史记录可能会丢失,尽管会故意丢失。

例如:

  • D提交并推master送到S。
  • L获取。
  • D改变主意(修改提交或master以任何方式更改历史记录)。
  • D将修改后的(非快进)推master到S。

提取时,L将警告“强制更新”,因为以前的分支提示无法通过分支引用访问master。但这还是D想要的。

要找什么

从凯文的答案:

 + 7193788...a978889 master     -> origin/master  (forced update)
Run Code Online (Sandbox Code Playgroud)

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

如何探索

如果L要保持什么可能丢失的参考,在上面的例子中的问题大号威力:git branch whateverbranchname 7193788。无论本地结帐的当前状态如何,都可以执行此操作。

或者只是git checkout 7193788以超然的头脑去探索它,然后例如git checkout master回到大师手中。这可能需要先提交任何本地更改。

好的做法

请注意,在没有与其他用户适当配合的情况下将更改的历史记录推送到共享存储库中是不正确的做法(因为这会给尚未共享更改的人带来额外的工作)。

换句话说,在共享存储库上进行访存时,没有人会惊讶地看到“强制更新”。如果有人推送了错误的提交,他们应该考虑只是将更正的提交推到最前面,而不更改现有历史记录。或者,他们应在推翻历史记录之前与他人达成协议。后一种选择在公共存储库上是不可能的。