Як повернутися до останнього комітету після перевірки попереднього зобов’язання?


476

Я іноді перевіряю чи перевіряю якусь попередню версію коду. Я бачив інструкції, що робити, якщо я хочу змінити попередні зобов’язання, але припустимо, що я не вношу зміни. Після того, як я зробив, наприклад git checkout HEAD^, як я повернусь до кінця гілки? .. git logбільше не показує мені SHA останньої версії.


11
Що стосується git logречення вашого запитання, ви завжди можете бігти git log --all(або більш корисно git log --oneline --graph --all).
Wildcard

Відповіді:


605

Якщо ви знаєте, що комісія, до якої ви хочете повернутися, - це керівник якоїсь філії, або вона позначена тегами, тоді ви можете просто

git checkout branchname

Ви також можете використовувати, git reflogщоб побачити, на що ще вказує ваша ЗВ'ЯЗКА (або будь-яка інша відповідь) у минулому.


Відредаговано, щоб додати:

У новіших версіях Git, якщо ви тільки запустили git checkoutчи щось інше, щоб перемістити свій HEADраз, ви також можете це зробити

git checkout -

щоб повернутись туди, де він був до останньої каси. Це було мотивоване аналогією з ідіомою оболонки, cd -щоб повернутися до будь-якого робочого каталогу, в якому раніше було.


27
Я хотів би зазначити, що типовим прикладом може бути "майстер виїзної каси". Однією з труднощів, з якими я навчився використовувати git, було те, що я не знав, які конкретні ключові слова (наприклад, "майстер") я насправді можна замінити на слова-заповнювачі на зразок "ім'я гілки".
AbePralle

3
masterнасправді це не якесь ключове слово, до речі HEAD. Це лише назва філії за замовчуванням у новому сховищі. Ви можете запустити, git branchщоб отримати список філій у вашому сховищі та git tag -lсписок тегів. Так само originє за замовчуванням ім'я пульта, з якого клонується сховище, але в ньому немає нічого особливого.
Філ Міллер

3
Якщо це було не зрозуміло, git reflogнадається список хешей, в який момент ви можете використовувати git checkout [commit-hash].
jbnunn

Я видалив файл і спробував команду, але він не повністю скидає його. Перш за все, це не рекурсивно. Потім, коли я спробую це у файлі, який я видалив, git після цього говорить мені, що HEAD від'єднаний. Що робити?
Даніель С.

1
@DanielS.: Питання і відповідь мій був про фіксацій , в той час як ви говорите про файлах. Гіт ставиться до них досить по-різному.
Філ Міллер

27

git checkout master

майстер - це підказка, або остання фіксація. gitk покаже лише вам, де ви знаходитесь на дереві в той час. git reflog покаже всі зобов’язання, але в цьому випадку вам просто потрібна порада, тому майстер оформлення замовлення git.


1
Це. Абоgit checkout branchname
Олексій

19

Щойно перейшов до цього питання, і є що додати

Щоб перейти до останньої комісії:

git checkout $(git log --branches -1 --pretty=format:"%H")

Пояснення:

git log --branchesпоказує журнал комітетів з усіх локальних гілок,
-1обмеження на один фіксатор → останній
--pretty=format:"%H"формат фіксації , щоб показати лише хеш фіксування
git checkout $(...) використання виводу підпакетів як аргумент для оформлення замовлення

Примітка:

Це призведе до відстороненої голови (тому що ми підписуємося безпосередньо на комітет). Цього можна уникнути, отримавши назву гілки за допомогою sed, поясненої нижче.


Щоб перейти до гілки останнього комітету:

git checkout $(git log --branches -1 --pretty=format:'%D' | sed 's/.*, //g')

Пояснення:

git log --branchesпоказує журнал комітетів з усіх локальних гілок,
-1обмеження на один фіксатор → останній
--pretty=format:"%D"формат фіксації , щоб відображати лише імена ref,
| sed 's/.*, //g'ігнорувати всі, крім останнього з декількох запитів
git checkout $(...) використовувати вихідний підзахист як аргумент для оформлення замовлення

*) HEAD та віддалені гілки вказуються першими, локальні гілки - останніми в алфавітному порядку за зменшенням, тому одна, що залишилася, буде алфавітно першою назвою гілки

Примітка:

Це завжди використовуватиме (за алфавітом) першу назву гілки, якщо їх є кілька.


У будь-якому випадку, я думаю, що найкращим рішенням було б просто відобразити імена ref для найсвіжіших комісій, щоб знати, куди слід оформити замовлення:

git log --branches -1 --pretty=format:'%D'

Наприклад, створити псевдонім git topдля цієї команди.


1
Якось я придумав другу команду ... Виправив її, вона тепер правильно перевірить вас із гілки останнього комітету.
816-8055

Псевдонім Bash / zsh для команди повернутися до головиalias git-head='git checkout $(git log --branches -1 --pretty=format:"%D" | sed "s/.*, //g")'
Привіт-Ангел

9

Погляньте на графічний графічний інтерфейс ... gitkвін показує всі коміти. Іноді легше працювати графічно ... ^^


так, це насправді, як я це робив у минулому, але у мене зараз не доступний графічний інтерфейс
Лев Алексєєв,

7

Для цього можна використовувати одну з наступних команд git:

git checkout master
git checkout branchname

4

показувати всі гілки та виконувати
журнал git log - Branches --oneline

показати останню фіксацію
журнал фіксування git - Branches -1 --lineline

показати перед останнім фіксацією
git log --branches -2 --lineline


Чи буде перша команда насправді здійснювати, який код наразі ставиться, чи я неправильно читаю це?
Lazerbeak12345


0

Якщо у вас є відділення, відмінне від головного, один простий спосіб - перевірити цю гілку, а потім перевірити майстра. Вуаля, ти знову на кінчику господаря. Мабуть, розумніші способи ...


0

Можна просто зробити git pull origin branchname. Він знову отримає останню версію.


Я не рекомендую цього, якщо ви не хочете тягнути з верхів'я. Ви повинні вирішувати конфлікти злиття лише тоді, коли вони готові.
Lazerbeak12345

Ну, у такому випадку голова залишатиметься відокремленою, навіть якщо ви зареєструєтесь до останнього зобов'язання.
Анкіт Сінгх

-2

Якщо ваша остання фіксація знаходиться на головній гілці, ви можете просто скористатися

git checkout master
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.