Есть ли способ 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 .


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


11

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



10

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

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

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

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


5

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

$ gco -
$ git checkout -

Просто хедз-ап, что 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 - количество шагов по веткам для возврата назад в историю оформления заказа.


1

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.