Git:分支丢失了历史记录?

3

发生了一些奇怪的事情——我的开发分支失去了所有历史记录,直到最后一次提交。有人能提出原因吗?

我最近所做的事情是安装了那个分叉的brotherbard GitX,并开始使用它(主要用于查看历史记录,但也尝试进行合并)。但在此之前,develop分支是从master开始并平行进行的,“feature-shape-fill”分支已经两次合并到develop中。我还在develop中使用了git stash。

现在,develop分支的git log只显示了最后一次提交。没有说什么“脱离”之类的话。

* 我已经对GitX(官方版本和这个分叉版本)感到担忧,因为在过去几周中,也发生了一些奇怪的事情——二进制的.fla文件在过去的几个提交中都没有被保存。所有文本文件都没问题,但那个二进制文件就像落后了4个提交一样。在切换分支时,其他工作目录根本没有更新(我是在控制台中工作的,而git并没有报告任何错误,对它来说一切都很好)。不知道这是否与gitx有关?

更新: 看起来这里提到的问题与http://groups.google.com/group/gitx/browse_thread/thread/71a0f759d115fee5相同。 这是我得到的:

$ git reflog
157cfca HEAD@{0}: checkout: moving from feature-shape-fill to develop
46a6163 HEAD@{1}: checkout: moving from develop to feature-shape-fill
157cfca HEAD@{2}: commit: Rotated drag tip
7f6c394 HEAD@{3}: commit: TextShapesCanvas is working,
4765eed HEAD@{4}: merge feature-shape-fill: Merge made by recursive.
ed44a2c HEAD@{5}: checkout: moving from feature-shape-fill to develop
46a6163 HEAD@{6}: commit: More tight packaging (thnx to TextLineMetrics),
59b6d2d HEAD@{7}: checkout: moving from develop to feature-shape-fill
ed44a2c HEAD@{8}: merge feature-shape-fill: Merge made by recursive.
67d08b3 HEAD@{9}: commit: Basic grid functionality, need to add text shapes and fix resize-generation
505479c HEAD@{10}: checkout: moving from feature-shape-fill to develop
59b6d2d HEAD@{11}: commit (amend): Simple retrovirus non-optomized algorithm
5ec1b70 HEAD@{12}: commit: Simple retrovirus non-optomized algorithm
b9eaf18 HEAD@{13}: commit: The most ugly suitable version of fill algorithm
757f1b7 HEAD@{14}: checkout: moving from feature-shape-fill-predefined to feature-shape-fill
757f1b7 HEAD@{15}: checkout: moving from feature-shape-fill to feature-shape-fill-predefined
757f1b7 HEAD@{16}: checkout: moving from feature-shape-fill-auto to feature-shape-fill
b8e284f HEAD@{17}: commit: Auto fill first steps
757f1b7 HEAD@{18}: checkout: moving from feature-shape-fill to feature-shape-fill-auto
757f1b7 HEAD@{19}: commit: Test document created, components::TextShape base draft
505479c HEAD@{20}: checkout: moving from develop to feature-shape-fill
505479c HEAD@{21}: checkout: moving from master to develop

看起来它们并没有丢失,但如何找回我的历史记录?

3个回答

2
你给出的图片显示你的develop分支是独立的,如果我没弄错的话。由于我了解它是基于master分支的,所以你可以将它放回到主分支上:
git rebase master develop

重要提示:在尝试以下操作之前,请先备份您原来的.git目录,因为我不确定这样做是否会产生您想要的结果。

您还可以通过从master创建一个临时分支develop2并将develop合并到其中来获得类似的结果:

git checkout -b develop2 master
git merge develop

希望这能帮到您!我没有尝试过,所以在尝试上述操作之前,请务必先备份您的.git目录!


正如我在更新中所写的,我发现我可以访问那些丢失的提交,但如何将我的分支(作为提交历史记录)恢复?你的方法只会创建一个包含单个提交的 develop 分支(从 master 开始),对吗? - average dev
@Pavel:我猜所有的提交都会放在主分支的顶部。如果你只是备份了你的.git目录,你可以很快地尝试上面的命令,看看它们是否解决了你的问题。 - Eric O. Lebigot

0

我曾经遇到过完全相同的问题,某个提交的父 SHA 某种原因没有设置,导致该提交看起来好像存在于项目历史之外。EOL 提供的第一个选项可以将您的提交带回历史记录,但会丢失所有分支历史记录。(至少对我来说是这样的。)最终,我查看了我的 reflog,找到了将我的宝贵分支送入地狱之前的最后一次提交。我看到的行如下:

6d79889 HEAD@{24}: checkout: moving from online-payment-processing to gift-certificates
3da6ec3 HEAD@{25}: commit: fix computation of when to skip processing for special orders

基本上,提交是在检出不同分支之后进行的。(在我的情况下,分支online-payment-processing处于悬而未决的状态,“从移动”消息向我保证了以前的提交在我的分支上。)我知道HEAD处的提交被搞砸了(而不是历史上更早的提交),所以我发出了以下命令:

git rebase 3da6ec3 online-payment-processing

然后... ...它被修复了(经过一些冲突解决)并且我的分支历史记录也得到了恢复。


0

要查看仅开发分支如何更改的历史记录,请使用:

git reflog show develop

然后,通过它们的SHA(或位置,例如develop@{1})检出或添加分支/标签到旧提交,直到找到最后一个正常工作的提交。例如:

git branch test 7f6c394

从日志来看,这些其他提交似乎也是develop的一部分:ed44a2c、67d08b3、505479c。

将develop分支移动到最后一个良好的提交。您可能能够挑选其他提交,但这实际上取决于导致错误的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接