有什么办法git checkout上一个分支吗?


702

我有点想要cd -git 的等效项。如果我在分支机构master并且结帐foo,我希望能输入类似git checkout -回去的文字master,并能够再次输入它返回到foo

像这样的东西存在吗?实施起来会很难吗?


2
我想输入向上箭头以找到我之前的git checkout命令:p
Kit Ho,

11
这涉及到将手从原始位置移开,键入gc-会更快,然后向上按直到找到所需的内容
Matt Briggs

@MattBriggs您实际键入的gc-git checkout -
还是jewbix.cube的

2
@ jewbix.cube您需要了​​解有关Shell和git的别名。
Gauthier

@KitHo:我发现自己想要不断地执行此操作,但是,例如,如果我刚刚创建了分支,则我想要的命令甚至可能在历史记录中不存在。
M_M

Answers:


1224

1.6.2发行说明中

@{-1}是一种引用您所在的最后一个分支的方法。
不仅在期望使用对象名称的地方,而且在期望使用分支名称的任何地方都可以接受,并且就像您键入分支名称一样。
例如git branch --track mybranch @{-1}git merge @{-1}
git rev-parse --symbolic-full-name @{-1}将按预期工作。

git checkout -是的简写git checkout @{-1}


46
哇,我完全应该尝试一下!想通了-这是一种外壳主义,如果功能是git,那将有所不同
Matt Briggs

9
当您两次检出一次提交SHA时,此方法不能很好地工作,在这种情况下,@ {-1}指向您在第一次检出之前的位置
。–

1
我正在使用ZSH,并且必须用@ {-1}括在引号中。否则git会窒息:error: pathspec '@-' did not match any file(s) known to git. error: pathspec '@1' did not match any file(s) known to git.
Murphy Randle 2014年

14
这可能是第一次SO回答使我无法控制地微笑。以为这会困难得多!
Owen

25
对于所用教学法的额外赞誉:显示一般设施,然后提及紧凑但不那么普遍的速记!…我经常使用@{u},这是当前分支的上游分支。这对于例如git log @{u}..列出哪些尚未提交的上游提交非常有用。相反git log ..@{u},这只是尚未推送的本地提交。
约翰

207

如今,最简单的方法是:

git checkout -

...是以下内容的别名:

git checkout @{-1}

git checkout减去

如果您想了解更多信息,我在这里写了整篇文章:Checkout The Previous Branch In Git


3
完善。我正在查找执行此操作的git方法,以便可以创建此确切的别名。很高兴看到它只是存在。
塔比莎

3
有没有办法列出以前的分支而不将其检出?
Erotemic '17

7
@Erotemic使用for i in{1..10}; do git rev-parse --symbolic-full-name @{-$i}; done
bash-– Bonsaigin

看到'git checkout-'别名真是太神奇了!那正是我想要的
辅助设备

在Powershell中@Erotemic是这样git reflog | ? { $_ -match ': checkout: moving from (.*) to (.*)'} | % { $Matches[1] } 。在bash中,您必须编写等效的内容(获取reflog并将其过滤为包含“:checkout:”字符串的行,然后提取分支名称)。这实际上就是git所做的
Mariusz Pawelski,

28

正如@Karl指出的和来自git checkout手册的内容:

作为特殊情况,最后第N个分支的“ @ {-N}”语法签出该分支(而不是分离)。您还可以指定-与“ @ {-1}”同义。

因此,无论git checkout -并且git checkout @{-1}在这种情况下会工作

最近我相信使用git reflog和分析最新的moving from branch1 to branch2git checkout branch1


11

只需在前面的答案中添加更多细节,以了解其git checkout @{-N}工作机理。它通过reflog来检查结帐历史,因此,如果您想自己实现类似的功能,则应该能够解析git reflog寻找checkout:行的输出。您可以检查git源中的实现sha1_name.c,特别是功能interpret_nth_prior_checkout



10

Git版本2.23引入了git switch可用于执行此操作的命令(以及更多)。引用官方文档:

切换到指定的分支。工作树和索引将更新以匹配分支。所有新的提交都将添加到该分支的提示中。

在您的特定情况下,您可以发出命令git switch -以返回到先前所在的分支。您可以再次执行同一命令以返回第一个分支。

PS这并不是说您还不知道该怎么做(我的意思是您问这个问题已有7年了),但是此命令对于初学者而言不那么混乱和友好,因为它解决了使用时出现的常见混乱git checkout


5

我以同样的思想来到这个问题,以结帐我以前的分支。我使用ohmyzMac。下面的命令帮助了我。

$ gco -
$ git checkout -

请注意,与其他zsh软件包管理器相比,ohmyz超级慢。我建议看一下抗原zplug
spex

2
如果不清楚,这是可行的,因为Oh My Zsh的Git插件定义gco为一种简短的编写方式git checkout。所以gco -就打电话git checkout -
罗里·奥肯

当然是我的朋友。不用解释它了git checkout -。故障安全更新。
Venkat.R

1

最受欢迎的解决方案是:

git checkout @{-N}

其中N-分支的步数,以移回结帐历史记录。


1

以下是Git文档各部分的指针,这些文档描述了其他答案给出的git checkout -git checkout @{-1}解决方案:

  • 当为任何命令指定Git版本时@{-<n>},例如@{-1}表示“第n个分支/提交在当前命令之前签出。” 该文档git checkout <branch>重申:“您可以使用@{-N}语法来引用使用git checkout操作检出的第N个最后一个分支/提交。”

  • 对于的<branch>论点git checkout,“您还可以指定与' -'同义的' @{-1}'。”

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.