git在没有合并和冲突的情况下丢失了我的编辑历史



我在8月27日星期三19:43:46 2014+0800提交

commit bbdbbb7214de8611a787c92daf93dbc2719600d0
Author: malloc (malloc@slowcast.com)
Date:   Wed Aug 27 19:51:17 2014 +0800

commit a5f8bcbf7fdfa995325a338a02ad8eef611ac9f8
Author: malloc (malloc@slowcast.com)
Date:   Wed Aug 27 19:43:46 2014 +0800

提交的编辑显示有3个文件已被修改。

git d --name-only a5f8bcb^..a5f8bcb
res/layout/layout_login.xml
base/BaseAct.java
ui/login/Login.java
(END)

然后其他人提交他们的修改。

commit 833dee16869ceb834cb1b8d8ac38bf3d0f147e66
Author: simon (simon@slowcast.com)
Date:   Wed Aug 27 20:13:42 2014 +0800

commit b391737ac94d5d779c1cb00b05a7c3bccee98915
Author: muham (muham@slowcast.com)
Date:   Wed Aug 27 20:00:35 2014 +0800

在b391737版本,Login.java是新版本,但在833dee1版本,Login.java的内容是旧版本。(以及其他已修改的文件)

检查提交833dee1,只有一个文件被提交

git d --name-only 833dee1^..833dee1
res/values/strings.xml
(END)

然后检查Login.java 的日志

git log ui/login/Login.java
commit c5a5ae9a48c2f1d44b6cd3654c20834ed49b3991
Author: simon (simon@slowcast.com)
Date:   Thu Aug 21 15:54:39 2014 +0800

commit 7e65405d19a946349ee4ac07176a37098f52867b
Author: shubin (nick@slowcast.com)
Date:   Fri Aug 15 15:22:01 2014 +0800

最后一次提交是在2014年8月21日星期四15:54:39+0800,没有我编辑的日志。

这怎么会发生?提交833dee1没有我编辑的文件,Login.java的历史记录也丢失了我的编辑
有没有什么命令可以让我找到Login.java的整个历史?

编辑

=============================================
我们只使用一个分支主机,并且日志不仅在本地,git克隆从远程获取相同的日志历史。添加一些输出:

$ git log --oneline --graph --color=auto --decorate --all ui/login/Login.java
  • b77af0c(HEAD,origin/master,origin/HEAD,master)恢复登录
  • 9f88669温度固定
  • c5a5ae9添加一些评论
  • 7e65405配置编辑。。。

c5a5ae9是在2014年8月21日15:54:39,许多天前,9f88669和b77af0c在我们发现问题后提交,git丢失了a5f8bcb的日志。

git log --oneline --graph --color=auto --decorate 833dee16...bbdbbb72
  • 833dee1变更var
  • bbdbbb7修改默认头像样式
  • a5f8bcb登录页面样式
  • 8b4ff8添加一些字符串
  • ab1e53c添加一些字符串
  • 9ab6bea编辑rec用户页面样式

即使进行了编辑,也很难确定,但我认为这里有足够的信息来猜测此时发生了什么:您进行了提交(在master上,因为这是您唯一的分支),但随后您可能通过运行git reset --hard(几乎可以肯定是git reset的某个变体)将其从分支中丢弃。

事实上,至少两个提交不在您的分支上:您显示:

bbdbbb7214de8611a787c92daf93dbc2719600d0
a5f8bcbf7fdfa995325a338a02ad8eef611ac9f8

在顶部,但您的主git log输出两者都不显示。事实上,该输出中也缺少833dee1...b391737...也是如此。

git的好处是提交实际上仍在您的存储库中。多亏了reflogs,提交在默认情况下至少可以保留30天。你所需要做的就是复活或复制它们。

如果您想恢复该提交(以及您通过git reset丢弃的任何以前的提交),请为提示最多的提交指定一个名称(分支或标记,任意一个都可以)。假设bbdbbb7...是最重要的提示,并且您希望为其创建一个分支:

git branch somework bbdbbb7 # you can use the full 40-char SHA1
                            # or an abbreviation, either does thes
                            # same job here

会成功的;现在git log --graph --decorate --oneline --all应该在新的分支名称somework下显示这两个提交。(如果bbdbbb7...而不是最重要的提交,而a5f8bcb...是,您可以将新分支指向那里。查看reflog,git refloggit log -g,以找到您想要恢复的任何"丢失"提交。)

如果您只是想复制以前的某个提交,则可以使用git cherry-pick来执行此操作。这将尝试在命名提交中重复相同的更改,但将其应用于当前工作树,然后根据结果进行新提交(并复制此新提交的原始提交消息)。

仅从提供的信息中就很难判断发生了什么。

您列出了一些提交,但没有显示它们在哪个分支中,或者合并历史记录是什么。您似乎丢失的提交完全有可能在与您当前查看的分支不同的分支上。

另一种可能性是,你被误导了,因为最近的提交可能有比你丢失的时间戳更旧的时间戳。可以重新建立提交的基础,在新的提交之上应用旧的提交,所以当你查看历史时,你会首先看到旧的提交。

或者另一种可能性是,您以某种方式丢弃了提交,将它们分离在本地存储库中,而从未推送它们并将它们与其他历史合并。如果您曾经对上游分支执行过git reset,则可能会发生这种情况。

以下是你如何了解正在发生的事情。最好的方法之一是将历史形象化。如果安装了gitk之类的图形工具,则可以使用它来完成此操作;如果没有安装,则只需在终端中使用git log --graph即可。

试着运行以下命令来查看发生了什么。如果你不确定如何解释输出,请编辑你的问题以包含它,我可以进一步解释。第一个应该显示该文件在本地和远程所有分支中的所有历史记录。第二个应该显示其中一个提交中包含的历史记录,而不是另一个。

$ git log --oneline --graph --color=auto --decorate --all ui/login/Login.java
$ git log --oneline --graph --color=auto --decorate 833dee16...bbdbbb72

您还可以查看存储库中所做操作的历史记录。只需键入git reflog;它将向您显示您已签出的特定版本的历史记录;因此,您将能够查看是否有一段时间您签出了丢失的提交,然后切换到另一个不包含它的提交。

相关内容

  • 没有找到相关文章

最新更新