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

11

我是新手使用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个回答

12

我假设你所谓的“sync back”实际上是想让你的工作副本看起来像是之前某个时间点。为了达到这个目的,你需要使用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

是的,我确实在checkout和reset之间感到困惑。checkout似乎做了我想要的事情,并且显然更接近于'hg update hash'的等效操作。 - David Ebbo

10

使用git reset会更新指针(refs/heads/master)指向早期版本。它实际上并不会创建一个新的修订版本,以有效地回滚到那个早期版本,这就是您所说的“Mercurial equivalent”所做的事情(这有点像git revert所做的事情)。

但是,Git确实会保留关于refs/heads/master如何随时间变化的日志文件,以及一个用于HEAD的单独文件。您可以使用较为原始的形式查看它们,方法是

git reflog show HEAD

(或者主) 或者更常见的形式是简单地使用

git log -g

这种git log的模式显示reflog条目,而不是通过修订图遍历: git log -g -n 10将显示HEAD指向的最后10个内容-因此如果您只是普通地执行git commit,那么它将与git log -n 10相同。

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

git log -g master

只显示主分支更改的引用日志条目(切换分支根本不会出现在任何分支的引用日志中)。


澄清一下,我不是想创建一个新的版本来回滚更改,而只是将指针向后移动(这就是 'hg update' 所做的)。因此,在这个意义上,'git reset' 做了我想要的。我也尝试过 'git log -g',但它会给出一个长列表,很难与完整日志相关联。 - David Ebbo

4
如果你想回到之前的版本,请考虑使用(无界面)checkout命令代替(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

我认为你说的对,实际上 'git checkout' 可能正是我要的,而不是 'git reset'。但是我在使用 HEAD^ 语法时遇到了问题。当我运行 'git checkout HEAD^' 时,它会提示我输入 'More?',我不清楚它想要什么。 - David Ebbo
1
尝试像这样引用它:'HEAD^',或使用替代拼写'HEAD~1'甚至是'HEAD~'man git-rev-parse将帮助您全面了解情况。 - sehe
双引号解决了这个问题:"HEAD^"。可能是Windows命令行的一件事情。 - David Ebbo
当时标记为Windows会有所帮助。事实上,我没有隐式地看到它 :) - sehe
刚刚完成。我知道,有点晚了 :) - David Ebbo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接