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

Мне нужен эквивалент cd - для git. Если я нахожусь в ветке master и оформляю заказ foo, мне бы хотелось иметь возможность набрать что-то вроде git checkout -, чтобы вернуться к master, и снова набрать его, чтобы вернуться к foo.

Есть ли что-нибудь подобное? Было бы сложно реализовать?


person Matt Briggs    schedule 26.08.2011    source источник
comment
Я хотел бы ввести стрелку ВВЕРХ, чтобы найти мою предыдущую команду git checkout: p   -  person Kit Ho    schedule 26.08.2011
comment
это включает в себя перемещение рук из исходного положения, ввод gc- НАМНОГО быстрее, чем нажатие вверх, пока не найдете то, что ищете   -  person Matt Briggs    schedule 26.08.2011
comment
@MattBriggs, вы действительно набираете gc- или это сокращение для git checkout -   -  person jewbix.cube    schedule 06.03.2018
comment
@ jewbix.cube Вам нужно узнать о псевдонимах как для вашей оболочки, так и для git.   -  person Gauthier    schedule 17.08.2018
comment
@KitHo: Я хочу делать это постоянно, но нужная мне команда может даже не существовать в истории, если, например, я только что создал ветку.   -  person M_M    schedule 04.03.2019
comment
Оформить заказ github.com/kaunteya/git-checkout-interactive   -  person Kaunteya    schedule 12.04.2019
comment
Если вы используете последнюю версию git, используйте вместо этого git switch -.   -  person Bal Krishna Jha    schedule 13.10.2020


Ответы (8)


Из примечаний к выпуску 1.6.2

@{-1} - это способ сослаться на последнюю ветку, в которой вы были. Это приемлемо не только там, где ожидается имя объекта, но и везде, где ожидается имя ветки и действует так, как если бы вы ввели имя ветки.
Например. git branch --track mybranch @{-1}, git merge @{-1} и
git rev-parse --symbolic-full-name @{-1} будут работать должным образом.

а также

git checkout - - это сокращение от git checkout @{-1}.

person Karl Bielefeldt    schedule 26.08.2011
comment
вау, я должен был просто попробовать! понял - был шелл, и что если бы функциональность была в git, это было бы что-то другое - person Matt Briggs; 26.08.2011
comment
Отлично! Мой ответ был кувалдой, чтобы расколоть орех: p - person Andy; 26.08.2011
comment
Это не сработает, если вы дважды проверяете SHA фиксации, и в этом случае @ {- 1} указывает на то место, где вы были до первой проверки .. - person user716468; 01.03.2013
comment
Если кому-то интересно, примечания к выпуску 1.6.2 можно найти по адресу github.com/git/git/blob/master/Documentation/RelNotes/1.6.2.txt. - person ; 04.04.2013
comment
Я использую 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. - person Murphy Randle; 08.02.2014
comment
Откуда ты это знаешь? - person eighteyes; 21.03.2014
comment
Еще один потрясающий секрет git - person Code Whisperer; 15.07.2014
comment
Вероятно, это первый раз, когда такой ответ заставил меня бесконтрольно улыбнуться. Думал, это будет намного сложнее! - person Owen; 09.11.2015
comment
Я использую рыбу, а также @{-1} пришлось заключить в кавычки. Однако git checkout - работал нормально. - person Cypress Frankenfeld; 15.03.2016
comment
Я просто люблю ТАК за такие вещи. - person Scott; 25.03.2016
comment
Обратите внимание, что это НЕ работает везде, где ожидается имя ветки, например git push не будет выводить @{-1} как имя ссылки. Вы все равно должны ввести его вручную. - person void.pointer; 25.03.2016
comment
git checkout - не всегда работает так, как я ожидал. Например, иногда, когда я использую его, я получаю already on branch <branch>. Есть идеи, почему? - person tba; 05.05.2016
comment
Дополнительные похвалы за использованную педагогику: покажите общие возможности, затем упомяните компактное, но менее общее сокращение! … Я довольно часто использую @{u}, это восходящая ветвь текущей ветки. Это очень полезно, например, для git log @{u}.., в котором перечислены те коммиты, которые еще не были выполнены в восходящем направлении. И обратное git log ..@{u}, это просто локальные коммиты, которые еще не продвинуты. - person Benjohn; 23.11.2016
comment
Это так красиво, что я чуть не заплакал. - person Marton Tatai; 27.10.2017
comment
Есть ли способ использовать аннотацию @ {- N} для перечисления ветвей без необходимости оформления заказа? - person sashok_bg; 10.11.2019
comment
@Benjohn Ваши примеры перевернуты, то есть git log @{u}.. дает вам локальные коммиты, которые еще не отправлены, а git log ..@{u} дает вам коммиты, которые еще не были выполнены, но затем для этого требуется, чтобы git fetch в восходящей ветке уже было сделано, чтобы это работало. - person haridsv; 11.12.2020

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

git checkout -

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

git checkout @{-1}

git checkout minus

Если вы хотите узнать об этом больше, я написал об этом целую статью здесь: Оформить заказ Предыдущий Ветка в Git.

person marcgg    schedule 18.10.2015
comment
Идеально. Я искал способ сделать это с помощью git, чтобы создать этот точный псевдоним. Рад видеть, что он просто существует. - person Tabitha; 24.06.2016
comment
Есть ли способ перечислить предыдущие ветки, не просматривая их? - person Erotemic; 08.06.2017
comment
@Erotemic с использованием bash - for i in{1..10}; do git rev-parse --symbolic-full-name @{-$i}; done - person Bonsaigin; 20.09.2017
comment
Удивительно видеть, что псевдоним git checkout - это вещь! Это именно тот ux, который я искал :) - person james_s_tayler; 28.12.2017
comment
@Erotemic в PowerShell это будет git reflog | ? { $_ -match ': checkout: moving from (.*) to (.*)'} | % { $Matches[1] } . В bash вы должны написать что-то эквивалентное (получить reflog и отфильтровать его до строк, содержащих: checkout: string, а затем извлечь имя ветки). На самом деле это то, что git делает - person Mariusz Pawelski; 04.11.2018

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

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

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

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

person manojlds    schedule 26.08.2011

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

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

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

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

person Mike    schedule 22.08.2019

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

person ddd    schedule 27.07.2016
comment
для ленивых - person Mariusz Pawelski; 04.11.2018

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

$ gco -
$ git checkout -
person Venkat.R    schedule 02.08.2017
comment
Просто предупреждаем, что ohmyz очень медленный по сравнению с другими менеджерами пакетов zsh. Я бы рекомендовал взглянуть на антиген или zplug. - person spex; 10.05.2018
comment
Если неясно, это работает, потому что плагин Oh My Zsh для Git определяет gco как краткий способ записи git checkout. Итак, gco - просто звонит git checkout -. - person Rory O'Kane; 17.01.2019
comment
конечно мой друг. излишне объяснять его git checkout -. для отказоустойчивого обновления. - person Venkat.R; 17.01.2019
comment
@spex antigen все равно использует ohmyzsh для плагина git, как это может быть быстрее? - person Joe Cabezas; 29.06.2020

Самое популярное решение:

git checkout @{-N}

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

person Jackkobec    schedule 26.11.2018

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

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

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

person Rory O'Kane    schedule 16.01.2019