在签出先前的提交后如何返回最新的提交?


475

有时,我会检查一些先前版本的代码以进行检查或测试。我已经看到了有关要修改以前的提交的说明,但是假设我没有进行任何更改。完成例如以后git checkout HEAD^,如何返回分支的尖端?.. git log不再向我显示最新提交的SHA。


11
关于git log您的问题的句子,您可以随时运行git log --all(或更有用的是git log --oneline --graph --all)。
通配符

Answers:


605

如果您知道要返回的提交是某个分支的开头或已被标记,则可以

git checkout branchname

您还可以git reflog用来查看您的HEAD(或任何其他引用)过去指向的其他提交。


编辑添加:

在较新版本的Git中,如果您只运行git checkout或其他移动HEAD一次,也可以

git checkout -

切换回上次结帐之前的位置。这是通过类比成语的动机来实现的cd -,它可以返回到先前所在的任何工作目录。


27
我想提到的典型示例是“ git checkout master”。我学习使用git时遇到的困难之一就是不知道可以用哪些特定的关键字(例如“ master”)代替“ branchname”之类的占位符。
2012年

3
master实际上不是任何关键字,方式HEAD是。它只是新存储库中的默认分支名称。您可以运行git branch以获取存储库中的分支git tag -l列表以及标签列表。同样,origin是从中克隆存储库的远程服务器的默认名称,但没有什么特别的。
Phil Miller

3
如果不清楚,请git reflog提供一个哈希列表,此时可以使用git checkout [commit-hash]
jbnunn 2014年

我删除了一个文件并尝试了该命令,但它并未完全重置它。首先,它不是递归的。然后,当我在删除的文件上尝试此操作时,git随后告诉我HEAD已分离。该怎么办?
Daniel S.

1
@DanielS .:问题和我的答案是关于commits的,而您正在谈论文件。Git对待它们的方式相当不同。
菲尔·米勒

27

git checkout主

master是提示,或最后一次提交。 gitk只会显示您当时在树中的位置。 git reflog将显示所有提交,但是在这种情况下,您只需要提示,因此git checkout master。


1
这个。或git checkout branchname
亚历克斯

19

刚刚遇到了这个问题,并添加了一些内容

转到最近的提交:

git checkout $(git log --branches -1 --pretty=format:"%H")

说明:

git log --branches显示所有本地分支的提交日志
-1限制为一次提交→最新提交
--pretty=format:"%H"格式仅显示提交哈希
git checkout $(...),将subshel​​l的输出用作签出的参数

注意:

但是,这将导致头部分离(因为我们直接签出到提交)。可以通过使用sed解释提取分支名称来避免这种情况。


转到最近一次提交的分支:

git checkout $(git log --branches -1 --pretty=format:'%D' | sed 's/.*, //g')

说明:

git log --branches显示所有本地分支的提交日志
-1限制为一次提交→最新提交
--pretty=format:"%D"格式以仅显示引用名称
| sed 's/.*, //g'忽略所有引用,但多个引用中的最后一个(*)
git checkout $(...)使用subshel​​l的输出作为结帐参数

*)HEAD和远程分支首先列出,本地分支最后按字母降序列出,因此剩下的将是按字母顺序第一个分支名称

注意:

如果该提交有多个,则将始终仅使用(按字母顺序)第一个分支名称。


无论如何,我认为最好的解决方案就是显示最近提交的引用名称,以了解在何处签出:

git log --branches -1 --pretty=format:'%D'

例如git top,为该命令创建别名。


1
不知何故,我弄错了第二条命令...对其进行了修复,现在它将正确地检查您最近一次提交的分支。
816-8055 '19

命令的Bash / zsh别名重新回到头部alias git-head='git checkout $(git log --branches -1 --pretty=format:"%D" | sed "s/.*, //g")'
Hi-Angel


7

您可以为此使用以下git命令之一:

git checkout master
git checkout branchname

4

显示所有分支并提交
git log --branches --oneline

显示最后一次提交
git log --branches -1 --oneline

在最后一次提交之前显示
git log --branches -2 --oneline


第一个命令实际上会提交当前正在暂存的代码,还是我读错了?
Lazerbeak12345


0

如果您的分支不同于master,则一种简单的方法是检出该分支,然后检出master。瞧,您又回到了主人的顶端。可能有更聪明的方法...


0

你可以简单地做git pull origin branchname。它将再次获取最新的提交。


如果您不想从上游拉,我不建议您这样做。只有在准备好合并冲突时,才应处理合并冲突。
Lazerbeak12345

好吧,在这种情况下,即使您签出最新提交,头部也将保持分离状态。
Ankit Singh

-2

如果您的最新提交位于master分支上,则只需使用

git checkout master
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.