Есть ли способ git checkout предыдущей ветки?

704

Я вроде хочу эквивалент cd -для мерзавца. Если я нахожусь в отделении 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 Вам нужно узнать об псевдонимах, как для вашей оболочки, так и для git.
Готье
@KitHo: я чувствую, что хочу делать это постоянно, но команда, которую я хочу, может даже не существовать в истории, если, например, я только что создал ветку.
M_M

Ответы:

1228

Из заметок о выпуске для 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, это было бы что-то другое
Мэтт Бриггс
9
Это не очень хорошо работает, когда вы дважды извлекаете коммит SHA, и в этом случае @ {- 1} указывает на то, где вы были до первой проверки ..
user716468
1
Я использую ZSH, и мне пришлось заключать @ {- 1} в кавычки. В противном случае мерзавец задохнулся:error: pathspec '@-' did not match any file(s) known to git. error: pathspec '@1' did not match any file(s) known to git.
Мерфи Рэндл
14
Вероятно, это первый раз, когда такой ответ заставляет меня неудержимо улыбаться. Думаю, это будет намного сложнее!
Оуэн
25
Дополнительные почести для используемой педагогики: покажите общие возможности, затем упомяните компактную, но менее общую стенографию! … Я довольно часто использую @{u}, которая является восходящей веткой текущей ветки. Это очень полезно, например, для git log @{u}..списка тех коммитов, которые еще не получены. И обратное, git log ..@{u}которое является просто локальными коммитами, которые еще не выдвинуты.
Benjohn
208

Самый простой способ сделать это в настоящее время:

git checkout -

... который является псевдонимом:

git checkout @{-1}

Git Checkout минус

Если вы хотите узнать больше об этом, я написал целую статью об этом здесь: Checkout The Previous Branch In Git .

marcgg
источник
3
Отлично. Я искал способ сделать это мерзавцем, чтобы создать точный псевдоним. Рад видеть, что это просто существует.
Табита
3
Есть ли способ перечислить предыдущие ветки, не проверяя их?
Erotemic
7
@Erotemic с использованием Bash -for i in{1..10}; do git rev-parse --symbolic-full-name @{-$i}; done
Bonsaigin
Удивительно видеть «Git Checkout -» псевдоним вещь! Это именно то, что я искал :)
Джеймс Тайлер
@ Erotemic в PowerShell это будет git reflog | ? { $_ -match ': checkout: moving from (.*) to (.*)'} | % { $Matches[1] } . В bash вы должны написать что-то эквивалентное (получить reflog и отфильтровать его в строки, содержащие строку ": checkout:", а затем извлечь имя ветви). Это на самом деле то, что делает мерзавец
Mariusz Pawelski
28

Как указывает @Karl и из git checkoutруководства:

В особом случае синтаксис "@ {- N}" для N-й последней ветви проверяет ветвь (вместо отсоединения). Вы также можете указать - что является синонимом "@ {- 1}".

Так что и так git checkout -и git checkout @{-1}будет работать в этом случае

Ближайший, я полагаю, использует git reflogи анализирует последние moving from branch1 to branch2иgit checkout branch1

manojlds
источник
11

Просто добавив некоторые подробности к предыдущим ответам, чтобы понять механизм, с помощью которого git checkout @{-N}работает. Он просматривает журнал, чтобы просмотреть историю проверок, поэтому, если вы хотите реализовать что-то подобное самостоятельно, вы сможете анализировать результаты git reflogпоиска checkout:строк. Вы можете проверить реализацию в исходном коде git sha1_name.c, в частности, функцию interpret_nth_prior_checkout.

ддд
источник
2
для ленивых
Мариуш Павельски
10

Git версия 2.23представила git switchкоманду, которую вы можете использовать для этого (и многое другое). Цитирование официальной документации:

Переключиться на указанную ветку. Рабочее дерево и индекс обновляются в соответствии с веткой. Все новые коммиты будут добавлены в кончик этой ветки.

В вашем конкретном случае вы можете git switch -вернуться к той ветке, в которой вы были ранее. Вы можете выполнить ту же команду еще раз, чтобы вернуться к первой ветви.

PS Дело не в том, что вы еще не знаете, как это сделать (я имею в виду, что прошло 7 лет с тех пор, как вы задали этот вопрос), но эта команда менее запутанна и дружелюбна для начинающих, поскольку она устраняет общую путаницу , возникающую при использовании git checkout.

Майк
источник
5

Я приземлился на этот вопрос с той же мыслью, чтобы проверить мою предыдущую ветку. Я использую Ohmyz в Mac. Ниже команда помогла мне.

$ gco -
$ git checkout -
Venkat.R
источник
Просто хедз-ап, что ohmyz очень медленный по сравнению с другими менеджерами пакетов zsh. Я бы порекомендовал взглянуть на антиген или zplug .
spex
2
В случае, если неясно, это работает, потому что плагин Oh My Zsh's Git определяет gcoкак короткий способ написания git checkout. Так gco -что просто звонки git checkout -.
Рори О'Кейн
Конечно, мой друг. Излишне объяснять это git checkout -. для отказоустойчивого обновлено.
Venkat.R
1

Наиболее популярным решением является:

git checkout @{-N}

Где N - количество шагов по веткам для возврата назад в историю оформления заказа.

Jackkobec
источник
1

Вот ссылки на части документации Git, которые описывают git checkout -иgit checkout @{-1} решения других ответов:

  • При указании ревизии Git для любой команды, @{-<n>}например,@{-1} означает « n- й ветвь / коммит извлечен перед текущей». Документация для git checkout <branch>повторов: «Вы можете использовать @{-N}синтаксис для ссылки на N-ую последнюю ветку / фиксацию, извлеченную с помощьюgit checkout операции».

  • Для <branch>аргументаgit checkout «вы также можете указать« -», который является синонимом« @{-1}».

Рори О'Кейн
источник