Чи є спосіб зібрати замовлення попереднього відділення?


704

Я начебто хочу еквівалент cd -git. Якщо я перебуваю у відділенні, masterі я замовляю замовлення foo, я б хотів, щоб я мав змогу набрати щось на зразок, git checkout -щоб повернутися master, і мати можливість знову набрати його, щоб повернутися foo.

Чи існує щось подібне? Чи важко було б це здійснити?


2
Я хотів би набрати стрілку UP, щоб знайти свою попередню команду git checkout: p
Kit Ho

11
що передбачає переміщення рук з домашнього положення, введення gc- ШЛИШЕ швидше, ніж натискання, поки ви не знайдете те, що шукаєте
Matt Briggs

@MattBriggs ви насправді набираєте gc-або це була стенограма дляgit checkout -
jewbix.cube

2
@ jewbix.cube Вам потрібно дізнатися про псевдоніми як для вашої оболонки, так і для git.
Готьє

@KitHo: Я вважаю, що хочу це робити постійно, але команда, яку я хочу, може навіть не існувати в історії, якщо, наприклад, я просто створив гілку.
M_M

Відповіді:


1229

З приміток до випуску 1.6.2

@{-1}це спосіб позначити останню гілку, на якій ви були. Це
приймається не лише там, де очікується ім'я об’єкта, але й десь очікується ім'я гілки, і воно діє так, ніби ви ввели ім'я гілки.
Наприклад git branch --track mybranch @{-1}, git merge @{-1}і
git rev-parse --symbolic-full-name @{-1}буде працювати, як очікувалося.

і

git checkout -- це стенограма для git checkout @{-1}.


47
уау, я цілком повинен був просто спробувати! подумав - це оболонка, і якщо функціональність була в git, то це було б щось інше
Метт Бріггс

9
Це не спрацьовує, коли ви двічі
перевіряєте комісію

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.
Мерфі Рандл

15
Це, мабуть, перший раз, коли відповідь ТА змусила мене нестримно посміхатися. Думав, що це буде набагато важче!
Оуен

25
Додаткові кудо для педагогіки, що використовуються: Покажіть загальну основу, а потім згадайте компактну, але менш загальну стенограму! … Я досить часто використовую @{u}, що є верхньою гілкою поточної гілки. Це дуже корисно для, наприклад, git log @{u}..списків верхніх комітетів, які ще не витягнуті. І зворот, git log ..@{u}який є лише місцевими зобов'язаннями, які ще не підштовхнуті.
Benjohn

208

Найпростіший спосіб зробити це сьогодні:

git checkout -

... що є псевдонімом:

git checkout @{-1}

git checkout мінус

Якщо ви хочете дізнатися більше про це, я написав про це цілу статтю тут: Оформити замовлення Попередня філія в Git .


3
Ідеально. Я шукав, яким чином це зробити, щоб я міг створити цей точний псевдонім. Радий бачити, що це просто існує.
Табіта

3
Чи є спосіб перелічити попередні гілки, не перевіряючи їх?
Erotemic

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

Дивовижне бачити "git checkout -" псевдонім - річ! Це саме той укс, який я шукав :)
Джеймс Тейлер

@Erotemic у повному обсязі це було б git reflog | ? { $_ -match ': checkout: moving from (.*) to (.*)'} | % { $Matches[1] } . У bash вам потрібно написати щось еквівалентне (отримати рефлог і відфільтрувати його до рядків, що містять рядок ": checkout:", а потім витягти ім'я гілки). Це насправді те, що робить git
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

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

$ gco -
$ git checkout -

Лише голова про те, що ohmyz надто повільний порівняно з іншими менеджерами пакунків zsh. Я рекомендував би переглянути антиген або zplug .
spex

2
Якщо це не зрозуміло, це працює, тому що плагін Git My My Zsh визначає gcoяк короткий спосіб написання git checkout. Тож gco -просто дзвінки git checkout -.
Rory

мій друг. зайве пояснювати це 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.