如何在检查出以前的提交后回到最近的提交?

我有时会检查一些以前版本的代码来检查或测试。如果我希望修改以前的提交,我已经看到了关于该怎么做的说明——但假设我不做任何更改。在我完成了例如git checkout HEAD^之后,我如何回到分支的尖端?git log不再显示我最近提交的SHA。

416465 次浏览

看看图形化的GUI…gitk显示所有提交。有时图形化工作更容易…^ ^

如果你知道你想要返回的提交是某个分支的头,或者被标记了,那么你可以

git checkout branchname

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


编辑补充:

在新版本的Git中,如果您只运行git checkout或其他东西来移动HEAD一次,您也可以这样做

git checkout -

换回上次结账前的位置。这是由于类似于shell成语cd -,以便返回到之前所在的任何工作目录。

Git checkout master

大师是秘诀,还是最后的承诺。gitk将只显示你在树中的位置。git reflog将显示所有提交,但在本例中,您只需要提示,因此git checkout master。

刚才碰到这个问题,有什么想补充的

转到最近的提交:

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

解释:

git log --branches显示来自所有本地分支的提交日志 -1限制一次提交→最近一次提交
--pretty=format:"%H"格式只显示提交哈希
git checkout $(...)使用subshell的输出作为checkout的参数

注意:

这将导致一个分离的头(因为我们直接签出到提交)。这可以通过使用sed提取分支名称来避免,如下所述。


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

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

解释:

git log --branches显示来自所有本地分支的提交日志 -1限制一次提交→最近一次提交
--pretty=format:"%D"格式只显示ref名称
| sed 's/.*, //g'忽略除最后一个引用外的所有引用(*)
git checkout $(...)使用subshell的输出作为checkout的参数

*) HEAD和远程分支按字母降序排列在前面,本地分支按字母降序排列在最后,因此剩下的将是按字母降序排列的第一个分支名称

注意:

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


不管怎样,我认为最好的解决方案是显示最近提交的引用名称,以知道签出到哪里:

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

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

你可以使用以下git命令之一:

git checkout master
git checkout branchname

如果您的最新提交是在主分支上,您可以简单地使用

git checkout master

如果您有一个不同于master的分支,一个简单的方法是签出该分支,然后签出master。瞧,你又回到了大师的顶端。也许有更聪明的方法……

git reflog //find the hash of the commit that you want to checkout
git checkout <commit number>>

显示所有分支并提交
Git日志——分支——oneline

show last commit
Git日志——分支-1——oneline

show before last commit
Git日志——分支-2——oneline

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

对于git版本>=2.33.0

git switch -d -

允许您检出到先前检出的提交。因此,您可以通过在两次提交之间切换来来回执行。请注意,-d标志允许您在分离状态下浏览提交。