有没有办法git checkout以前的分支?

Mat*_*ggs 631 git git-checkout

我想要相当于cd -git.如果我在分支机构master并且我结账foo,我希望能够输入类似于git checkout -返回的内容master,并且能够再次键入它以返回foo.

有这样的事吗?难以实施吗?

Kar*_*ldt 1089

来自1.6.2发行说明

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

git checkout -是一个简写git checkout @{-1}.

  • 哇,我完全应该尝试过!想 - 是一个shell-ism,如果功能是在git中,那将是不同的东西 (41认同)
  • 使用的教学法的额外荣誉:展示一般设施,然后提到紧凑但不太一般的速记!...我经常使用`@ {u}`,这是当前分支的上游分支.它对于例如`git log @ {u} ..`非常有用,它列出了尚未提取的上游提交.相反的`git log .. @ {u}`,这只是尚未推送的本地提交. (22认同)
  • 这可能是第一次SO回答让我无法控制地微笑.认为这将是如此困难! (12认同)
  • 当您两次签出提交SHA时,这不能很好地工作,在这种情况下,@ { - 1}指向您在第一次结账前的位置. (9认同)
  • 这太美了,我差点哭了。 (5认同)

mar*_*cgg 181

现在最简单的方法是:

git checkout -
Run Code Online (Sandbox Code Playgroud)

...这是别名:

git checkout @{-1}
Run Code Online (Sandbox Code Playgroud)

git checkout减去

如果你想了解更多这方面的信息,我在这里写了一篇关于它的文章:在Git中查看以前的分支.

  • @Erotemic使用bash - `for for in {1..10}; 做git rev-parse --symbolic-full-name @ { - $ i}; done` (7认同)
  • 完善.我正在查找git的方法来做到这一点,所以我可以创建这个确切的别名.很高兴看到它存在. (3认同)
  • 有没有办法列出以前的分支而不检查它们? (3认同)

man*_*lds 28

正如@Karl所指出的那样git checkout:

作为一种特殊情况,第N个最后一个分支的"@ { - N}"语法检查分支(而不是分离).您也可以指定 - 这与"@ { - 1}"同义.

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

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


Mik*_*ike 24

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

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

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

PS这并不是说你已经不知道该怎么做(我的意思是已经7年,因为你问到这个问题),但该命令减少混乱和友好的初学者,因为它解决了一个共同的困惑使用时产生的git checkout


小智 11

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

  • [对于懒惰者](https://github.com/git/git/blob/cd69ec8cde54af1817630331fc441f493866f0d4/sha1-name.c#L1269) (2认同)

Ven*_*t.R 8

我带着同样的想法登陆了这个问题,以查看我以前的分支。我使用ohmyzMac。下面的命令帮助了我。

$ gco -
$ git checkout -
Run Code Online (Sandbox Code Playgroud)

  • 如果不清楚,这是因为 [Oh My Zsh's Git plugin](https://github.com/robbyrussell/oh-my-zsh/wiki/Plugin:git) 将 `gco` 定义为一种简短的写作方式` git 结帐`。所以`gco -` 只是调用`git checkout -`。 (3认同)