我于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
c5a5ae9是在2014年8月21日15:54:39,很多天前,9f88669和b77af0c在我们发现问题后提交,git在a5f8bcb丢失了日志。
git log --oneline --graph --color=auto --decorate 833dee16...bbdbbb72
答案 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
;这将向您显示您已检出的特定版本的历史记录;这样你就可以看到有没有时间检查过你的遗漏提交,然后切换到另一个没有包含它的提交。