我是git的新手,可能没有使用正确的术语,所以忍受我:)
假设我有一个包含5个更改的存储库,例如
D:\test\gitrepo2>git log --oneline
3a5fd33 555
3cfbfae 444
e9a78c8 333
a618586 222
b80d5e1 111
Run Code Online (Sandbox Code Playgroud)
我了解到我可以通过以下方式同步回到早期版本:
D:\test\gitrepo2>git reset e9a78c8 --hard
HEAD is now at e9a78c8 333
Run Code Online (Sandbox Code Playgroud)
我的问题是:完成此操作后,如何获取完整日志,以便我可以回到最新版本?
运行日志不再显示这些修订:
D:\test\gitrepo2>git log --oneline
e9a78c8 333
a618586 222
b80d5e1 111
Run Code Online (Sandbox Code Playgroud)
我也尝试添加--all开关,这没有什么区别.在Mercurial中,在相同的情况下,即使在我更新到早期版本之后,运行"hg log"也会提供完整的日志.
我假设通过"同步回来"你真的意味着你只是希望你的工作副本看起来像以前的时间点.要做到这一点,你想要的checkout不是reset:
> git checkout e9a78c8
Run Code Online (Sandbox Code Playgroud)
此时,您的存储库如下所示:
> git log master --oneline
3a5fd33 555 <--- master is still here
3cfbfae 444
e9a78c8 333 <--- HEAD (working copy) is here
a618586 222
b80d5e1 111
Run Code Online (Sandbox Code Playgroud)
现在要回的最新提交的master,只是git checkout master一次.
通过使用reset,你得到了这个:
> git log master --oneline
e9a78c8 333 <--- HEAD (working copy) and master are here
a618586 222
b80d5e1 111
Run Code Online (Sandbox Code Playgroud)
使用git reset更新指针(refs/heads/master)指向早期版本.它实际上并没有做出有效回滚到早期版本的新版本,我认为这是你的"Mercurial等价物"所做的(这有点像是什么git revert).
但是,Git会记录refs/heads/master如何随时间变化的日志文件,以及HEAD的单独文件.您可以使用相当原始的形式查看此内容
git reflog show HEAD
Run Code Online (Sandbox Code Playgroud)
(或掌握)或通过简单使用以更熟悉的形式
git log -g
Run Code Online (Sandbox Code Playgroud)
这种git日志模式显示了reflog条目,而不是遍历修订图:git log -g -n 10将显示HEAD指向的最后10个内容 - 所以它就像git log -n 10你所做的一样是纯粹的git commits.
但是,它也会显示更改分支,重置等.
git log -g master
Run Code Online (Sandbox Code Playgroud)
将仅显示主分支更改的reflog条目(更改分支根本不会出现在任何分支reflog中).