没有合并和冲突,git丢失了我的编辑历史记录

时间:2014-08-28 03:28:25

标签: git git-commit git-log

我于2014年8月27日星期三19:43:46 +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 clone获得相同的日志历史记录。 添加一些输出:

$ git log --oneline --graph --color=auto --decorate --all ui/login/Login.java
  • b77af0c(HEAD,origin / master,origin / HEAD,master)recover login
  • 9f88669临时修复
  • c5a5ae9添加一些评论
  • 7e65405配置编辑 ... ...

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

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

2 个答案:

答案 0 :(得分:1)

即使编辑很难确定,但我认为这里有足够的信息来猜测发生了什么,此时:你做了提交(在master,因为那是你唯一的分支),但是你把它扔掉了分支,可能是通过运行git reset --hard(几乎肯定是git reset的一些变体)。

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

bbdbbb7214de8611a787c92daf93dbc2719600d0
a5f8bcbf7fdfa995325a338a02ad8eef611ac9f8

位于顶部,但您的主git log输出均未显示。实际上,833dee1...中也会遗漏b391737... git reset

关于git的好处是提交实际上仍然在你的存储库中。感谢reflogs,默认情况下,提交至少会持续30天。您需要做的就是复活或复制它们。

如果你想恢复那个提交(以及你之前通过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... 提交最多提交,而git reflog是,则可以将新分支指向那里。查看reflog,git log -g或{ {1}},找到你想要带回的任何“遗失”提交。)

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

答案 1 :(得分:0)

从所提供的信息中了解情况有点难以理解。

您列出了一些提交,但没有做任何事情来显示它们所在的分支或合并历史记录是什么。您似乎丢失的提交完全可能与您当前正在查看的提交的分支不同。

另一种可能性是,您最近的提交可能包含的时间戳比您丢失的时间戳早,这一点可能会被误导。可以重新提交提交,在较新的提交之上应用较旧的提交,因此当您查看历史记录时,首先会看到较旧的提交。

或者另一种可能性是你以某种方式丢弃了你的提交,将它们分离到你的本地存储库中,而没有推送它们并将它们与其他历史记录合并。如果您对上游分支执行了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;这将向您显示您已检出的特定版本的历史记录;这样你就可以看到有没有时间检查过你的遗漏提交,然后切换到另一个没有包含它的提交。