回滚到以前的版本后获取完整的git日志

时间:2011-04-20 22:57:38

标签: windows git

我是git的新手,可能没有使用正确的术语,所以忍受我:)

假设我有一个包含5个更改的存储库,例如

D:\test\gitrepo2>git log --oneline
3a5fd33 555
3cfbfae 444
e9a78c8 333
a618586 222
b80d5e1 111

我了解到我可以通过执行以下操作同步回早期版本:

D:\test\gitrepo2>git reset e9a78c8 --hard
HEAD is now at e9a78c8 333

我的问题是:完成此操作后,如何获取完整日志,以便我可以返回最新版本?

运行日志不再显示这些修订:

D:\test\gitrepo2>git log --oneline
e9a78c8 333
a618586 222
b80d5e1 111

我也尝试添加--all开关,这没有什么区别。在Mercurial中,在相同的情况下,即使在我更新到早期版本之后,运行'hg log'也会提供完整的日志。

3 个答案:

答案 0 :(得分:8)

我认为通过“同步回来”你真的意味着你只是希望你的工作副本看起来像以前的时间点。为此,您需要checkout,而不是reset

> git checkout e9a78c8

此时,您的存储库如下所示:

> git log master --oneline
3a5fd33 555   <--- master is still here
3cfbfae 444
e9a78c8 333   <--- HEAD (working copy) is here
a618586 222
b80d5e1 111

现在回到master上的最新提交,再次git checkout master

使用reset,你得到了这个:

> git log master --oneline
e9a78c8 333   <--- HEAD (working copy) and master are here
a618586 222
b80d5e1 111

答案 1 :(得分:7)

使用git reset更新指针(refs / heads / master)以指向早期版本。它实际上并没有做出有效回滚到早期版本的新版本,我认为这是你的“Mercurial等价物”所做的(这有点像git revert那样)。

但是,Git确实记录了refs / heads / master如何随时间变化的日志文件,以及HEAD的单独文件。您可以使用

以相当原始的形式查看此内容
git reflog show HEAD

(或掌握)或通过简单使用

以更熟悉的形式
git log -g

这种git日志模式显示了reflog条目,而不是遍历修订图:git log -g -n 10将显示HEAD指向的最后10个内容 - 所以如果你所有的话它将与git log -n 10相同做得很简单git commit s。

但是,它还会显示更改分支,重置等。

git log -g master

将仅显示主分支更改的reflog条目(更改分支根本不会出现在任何分支reflog中)。

答案 2 :(得分:2)

如果你想回去,可以考虑做一个(无头)结账(git checkout HEAD^


我认为你只需要

git log HEAD@{1}

所以,例如在一个新的回购

mkdir -pv /tmp/repo
cd /tmp/repo
git init
touch a 
git add .
git commit -am 1
echo something > a
git commit -am 2
git reset --hard HEAD^
git log HEAD@{1}

输出:

commit ca6f2c6c1b07895816a1b75973035a20a0238607
Author: Seth <sehe@xxxxxxxxx>
Date:   Thu Apr 21 01:17:06 2011 +0200

    2

commit d71ea3dfa89771af6d3ae2d0e88e1dc6ccce48b8
Author: Seth <sehe@xxxxxxxxx>
Date:   Thu Apr 21 01:16:56 2011 +0200

    1