Git正在丢失单个文件的历史/内容

UsA*_*R33 8 git git-log

我在一家小公司工作,我们的Git回购有点搞砸了.我刚刚做了一个git pull,我今天早些时候做出的改变都消失了!

当我在主分支上的HEAD上工作时,在其历史记录中git log显示我的最后一次提交b94940c63ef965ce45b0d64ccfba4359134d2552.

现在,如果我git log filename为丢失更改的有问题的文件执行操作,则不显示该提交(仅显示先前的提交).

执行git log --follow filename,我的提交b94940c63ef965ce45b0d64ccfba4359134d2552显示为最新.

果然,如果我这样做:

git checkout b94940c63ef965ce45b0d64ccfba4359134d2552
git log filename
Run Code Online (Sandbox Code Playgroud)

然后显示提交,我的更改在文件中!

换句话说,我所做的提交显示在分支历史记录中(阻止分支合并),但是单个修改过的文件在其历史记录中没有该提交!(除非我明确签出该提交).

问题:

  1. 这究竟是怎么发生的?

  2. 我如何解决它?(我们的仓库中有多个文件存在问题)

UsA*_*R33 5

好了,找出了问题所在。当一个同事撤离时,他遇到了一些冲突。他没有解决问题,而是git重置每个暂存的文件。这类似于对单个旧文件执行git checkout old_version。因此,主服务器上的HEAD最终引用了一些具有old_version的文件。

现在,我正在手动恢复他炸掉的内容。

故事的寓意:修改单个文件上的git操作(签出,重置等)非常危险。

  • 这不是真正的道德。道德是:“学会解决合并冲突。” 它适用于任何VCS,基于围绕它存在多少问题,它似乎是开发人员中实践最少的技能。 (6认同)

Nay*_*uki 0

首先,您应该掌握 Git 命令的作用以及存储库中存储的数据。

  • 使用Giggle或 Gitk等历史可视化工具来查看您的提交历史记录,并查看哪些提交是基于哪些提交。

  • git pull做了两件事:它从远程存储库检索新的提交,并将远程存储库的头与当前头(在当前分支中)合并。

因此,鉴于此,您将来可能需要更加小心。git pull您可以git fetch手动合并需要合并的内容,而不是使用。这样您就可以控制所做的编辑。

至于你目前的情况,我认为 Git 不会丢失数据。你说你的档案还在历史中。因此,现在您可能需要进行一些创造性的重置(恢复到旧版本)或修补程序(可能手动),以使项目文件进入您希望的状态。