Як скасувати "git reset"?


1312

Який найпростіший спосіб скасувати

git reset HEAD~

командувати? Наразі єдиний спосіб, який я можу придумати, - це зробити "git clone http: // ..." з віддаленого репо.


2
Якщо хтось шукає, як скасувати жорсткий скидання, ознайомтесь із пунктом Скасування скидання git --hard HEAD ~ 1 . Рішення дуже схожі.


2
Це не дублікат питань, пов’язаних із --hard! Ризик випадкового запуску цієї команди набагато вищий. Наприклад, ви хочете зняти з нього один файл git reset foo-file. Ви пишете лише першу частину імені файлу, клацніть на вкладку для автоматичного завершення, вона фактично завершується іменем гілки, ви цього не помічаєте і git reset foo-branchзамість цього запускаєте команду . Voilà
Yushin Washio

Відповіді:


2388

Коротка відповідь:

git reset 'HEAD@{1}'

Довга відповідь:

Git веде журнал усіх оновлень ref (наприклад, замовлення, скидання, фіксація, об'єднання). Ви можете переглянути його, ввівши:

git reflog

Десь у цьому списку є зобов'язання, які ви втратили. Скажімо, ви просто ввели git reset HEAD~і хочете скасувати його. Мій рефлог виглядає так:

$ git reflog
3f6db14 HEAD@{0}: HEAD~: updating HEAD
d27924e HEAD@{1}: checkout: moving from d27924e0fe16776f0d0f1ee2933a0334a4787b4c
[...]

Перший рядок говорить про те, що HEAD0 позицій тому (іншими словами, поточна позиція) - 3f6db14; вона була отримана шляхом скидання до HEAD~. Другий рядок говорить про те, що HEAD1 позиція тому (іншими словами, стан до скидання) - d27924e. Це було отримано шляхом перевірки певного комітету (хоча це зараз не важливо). Отже, щоб скасувати скидання, запустіть git reset HEAD@{1}(або git reset d27924e).

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

Останнє зауваження: Можливо, буде легше подивитися на reflogконкретну гілку, яку ви хочете скасувати, скажімо, майстер, а не HEAD:

$ git reflog show master
c24138b master@{0}: merge origin/master: Fast-forward
90a2bf9 master@{1}: merge origin/master: Fast-forward
[...]

Це повинно мати менше шуму, ніж загальне HEAD reflog.


25
Як більш наочну і приємну альтернативу reflogдля цієї мети я люблю використовувати git log --graph --decorate --oneline $(git rev-list -g --all). На ньому показано дерево всіх
комітетів

1
Скажімо, у мене є каталог із наявними в ньому файлами. У цьому каталозі я запускаю git init, а потім відразу після цього git reset --hard. Немає рефлог або навіть журналів для початку. Ці файли зараз досить тости?
AlanSE

@AlanSE, на жаль ці файли тости, наскільки я знаю. Якщо ви ніколи не робили git add(тобто ніколи не інсценізували цю версію файлу), тоді git checkoutабо git reset --hardбуде видалено єдину копію (робочий каталог) без резервної копії. Я б хотів, щоб цього не сталося.
Марк Лодато

2
git reset HEAD~12oops ... git reset HEAD@{12}nooo .. 'git reflog' на допомогу! ой простоgit reset HEAD@{1}
Денніс

Прочитавши чудову статтю про git-scm.com/blog/2011/07/11/reset.html про скидання, я трохи менше загадкований.
Андрій Дроздюк

192

Старе питання, і розміщені відповіді чудово працюють. Але я задзвоню інший варіант.

git reset ORIG_HEAD

ORIG_HEADпосилається на комітет, на який HEADраніше посилалися.


1
Це здається чудовим - чи змогли б ви допрацювати? Чи "ORIG" тут короткий для "оригінал" або "походження"? ... Тобто, чи скидається вона до місця, де був HEAD, перш ніж почати мавпати з ним? Або до того, де знаходиться походження HEAD? Що станеться, якщо ви перемістили HEAD кілька разів до git reset ORIG_HEAD? Дякую.
Бенджон

ORIG означає оригінальний, ORIG_HEAD означає оригінальну ГОЛОВУ, перед скиданням
Сем Галлахер

"Окремі операції, такі як об'єднання та скидання, записують попередню версію HEAD в ORIG_HEAD безпосередньо перед коригуванням її на нове значення. Ви можете використовувати ORIG_HEAD для відновлення або повернення до попереднього стану або для порівняння." Уривок з книги: "Контроль версій з Git"
Амірреза

56

Моя ситуація була дещо іншою, я робив git reset HEAD~три рази.

Щоб скасувати це, я повинен був зробити

git reset HEAD@{3}

тому ви повинні вміти робити

git reset HEAD@{N}

Але якщо ви виконали скидання git за допомогою

git reset HEAD~3

вам потрібно буде зробити

git reset HEAD@{1}

Оскільки {N} представляє кількість операцій в Reflog. Як зазначив Марк у коментарях.


2
Прийнятий варіант не дає прикладу йти вперед, NI опинився в ситуації назад, коли я хотів переслати більше 1. Пробував кілька, і це спрацювало. Хотів додати це тут. Буде корисно для людей, які шукають скасувати скидання за допомогою gset reset HEAD ~ 3
zainengineer

3
але якщо хтось зробив скидання Git HEAD ~ 3, він може швидко зрозуміти, як його скасувати, потрібен скидання GIT HEAD @ {3}, не вдаючись до рефлогування git reset HEAD ~ 3 тощо. Це звичайна ситуація
zainengineer

1
Я думаю, що кожен, хто бачить {1} / {2}, зрозуміє, що число може бути будь-яким ревізійним номером, який reflogдає вам команда. Погодились, що ваша думка про те, що цифри однакові для будь-якого напрямку ~ 3 / @ {3}, але насправді не потрібно було відповідати новим.
Клінт

30

1.Використовуйте git reflogдля оновлення всіх посилань.

2.git reset <id_of_commit_to_which_you_want_restore>

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