【问题标题】:git lost my edit history without merge and conflictgit 在没有合并和冲突的情况下丢失了我的编辑历史
【发布时间】:2014-10-21 19:28:28
【问题描述】:

我在 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

最新的提交是在 Thu Aug 21 15:54:39 2014 +0800,没有我的编辑日志。

怎么会这样?提交 833dee1 没有我编辑的文件,Login.java 的历史记录也丢失了我的编辑。
是否有一些命令可以找到 Login.java 的整个历史记录?

编辑

==========================================
我们只使用了一个分支master,并且日志不仅在本地,远程的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 更改变量
  • bbdbbb7 修改默认头像样式
  • a5f8bcb 登录页面样式
  • 8b4aff8 添加一些字符串
  • ab1e53c 添加一些字符串
  • 9ab6bea 编辑rec用户页面样式

【问题讨论】:

  • 上面没有显示提交的父子关系,也没有显示HEAD是什么,所以很难说。查看提交图(使用 gitk --allgit log --graph --oneline --decorate --all 之类的图形查看器)可能会很有启发性。
  • 我们只使用master分支,commit是按提交时间排序的
  • Commit a5f8bcbf7fdfa995325a338a02ad8eef611ac9f8 显然不是 in 您在上面显示的git log 输出。换句话说,它在分支master 上不存在。也许有人删除了它。
  • 上面提到的所有提交都在 git log 中,[git log --oneline --graph --color=auto --decorate 833dee16...bbdbbb72] 的输出表明了这一点。跨度>
  • @Malloc 当你粘贴输出时,你应该把它粘贴到 exactly 中,因为它来自 Git。 --graph 将显示一个图表,表明祖先是什么样的,--decorate 将显示每个分支指向的内容。如果没有这些信息,就很难为您提供更多帮助。

标签: git git-commit git-log


【解决方案1】:

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

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

另一种可能性是,您被以下事实误导:最近提交的时间戳可能比您丢失的时间戳更早。可以重新提交提交,将旧提交应用到新提交之上,因此当您查看历史记录时,您会首先看到旧提交。

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

【讨论】:

  • 我们只有一个master分支,所以Login.java的日志在a5f8bcb没有编辑的痕迹。
【解决方案2】:

即使进行了编辑也很难确定,但我认为这里有足够的信息来猜测发生了什么,此时:你提交了(在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... 是,您可以将新分支指向那里。查看引用日志,git refloggit log -g,找到任何“丢失”的提交,你想带回来。)

如果你只是想复制一些以前的提交,你可以使用git cherry-pick 来做到这一点。这将尝试在命名的提交中重复相同的更改,但将它们应用到您当前的工作树,然后从结果中进行新的提交(并为此新提交复制原始提交消息)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多