我是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'也会提供完整的日志。
答案 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 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