Відкат до старого Git в публічному репо


802

Як я можу йти про відкат назад до певного комітету в git ?

Найкращою відповіддю, яку хтось міг дати мені, було використання git revertX разів, поки я не досягну бажаного завдання.

Отже, скажімо, я хочу повернутись до зобов’язання, яке становить 20 фіксів, я повинен був би виконати його 20 разів.

Чи є простіший спосіб зробити це?

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


1
повернення git <commit> не працює?
miku

8
Як зазначено в моєму запитанні, це дійсно не допомагає мені, якщо я хочу повернутись до чогось 20 комісій назад.
Девід

7
Це питання дуже добре відповів тут stackoverflow.com/questions/4114095 / ...
user7610

4
Не ясно, що ви маєте на увазі під «відкотом». Це означає, що ви хочете тимчасово переключити свою робочу копію на певну редакцію? Або ви хочете назавжди повернути історію вашого сховища до певної редакції?

1
Ви повинні прийняти відповідь і, можливо, проголосувати будь-які інші відповіді, які вам подобаються.
Набіл Кадімі

Відповіді:


1193

Спробуйте це:

git checkout [revision] .

де [revision]хеш фіксувати (наприклад 12345678901234567890123456789012345678ab:).

Не забувайте .наприкінці, дуже важливо. Це стосується змін до всього дерева. Ви повинні виконати цю команду в корені проекту git. Якщо ви перебуваєте в будь-якому підкаталозі, ця команда змінює лише файли в поточному каталозі. Тоді виконайте зобов’язання, і ви повинні бути хорошими.

Ви можете скасувати це за допомогою

git reset --hard 

які видалять усі модифікації з робочого каталогу та області постановки.


7
@AlexReisner Цей період у кінцевих точках у каталозі, в якому ви зараз перебуваєте, що не обов'язково є цілим проектом git, правда? Якби ви хотіли застосувати зміни до всього проекту, ви б замість цього використали ': /', як у 'git add: /', якби ви зараз не були у корені проекту git?
MSpreij

10
Примітка: якщо ви додали нові файли до свого проекту з тих пір, це не видалить їх. Тож коли ви переходите до створення (залежно від вашої платформи), ви все одно можете отримати помилки. Видаліть нові файли, і ви готові йти.
TheWestIsThe ...

6
@MSpreij Ви повинні виконати цю команду в корені проекту git. Якщо ви перебуваєте в будь-якому підкаталозі, ця команда змінює лише файли в поточному каталозі.
летючий

3
Це чудово, коли ви можете клонувати проект в іншому каталозі та використовувати git checkout [редакція]. щоб повернутися до певної версії, а потім порівняти її з тим самим проектом в іншому каталозі. Економить багато часу.
Донато

4
Чорт, я забув "." яку шкоду я завдаю своєму сховищу?
Сова

196

Щоб відмовитись на певну комісію:

git reset --hard commit_sha

Для відкату 10 повертається назад:

git reset --hard HEAD~10

Ви можете використовувати "git revert", як у наступному дописі, якщо ви не хочете переписувати історію

Як повернути сховище Git до попереднього комітету?


4
Єдина різниця між цим підходом та "git checkout [редакція]". полягає в тому, що остання зберігає доопрацювання.
дешаньк

53
Ця відповідь є НЕВЕРСАЛЬНОЮ, оскільки ОП спеціально зазначає: "Я не можу використовувати скидання, оскільки ця репо є загальнодоступною"
Ярін

4
Якщо РЕПО є загальнодоступним, я думаю, що немає способу відмовити комісію у загальнодоступному сховищі без використання примусового натискання (git push -f), оскільки це вплине на людей, які ввели зміни перед відкатом. Отже, скидання може бути використане і в місцевій пісочниці публічного репо.
Нага Кіран

4
Чудово, що це уникає відшаруваної ГОЛОВИ! Тільки те, що я шукав.
кібер-монах

1
У моєму випадку це спрацювало, тоді використовуйте "git pull", щоб перейти назад до голови після тестування регресії тощо.
Пітер Квірінг

86

Ну, я думаю, питання полягає в тому, що ви маєте на увазі під «відкотом»? Якщо ви не можете, resetоскільки вона є загальнодоступною, і ви хочете зберегти історію фіксації недоторканою, ви маєте на увазі, що ви просто хочете, щоб ваша робоча копія відображала конкретну комісію? Використовуйте git checkoutі виконайте хеш.

Редагувати: Як було зазначено в коментарях, використання git checkoutбез вказівки гілки залишить вас у стані "без філії". Використовуйте git checkout <commit> -b <branchname>для оформлення каси у відділення або git checkout <commit> .для оформлення замовлення у поточному відділенні.


Чи це не ввело вас у дивний стан "Зараз немає жодної галузі"? Як вчинити зміни, щоб завершити відкат?
Олексій Рейснер

Ну, я просто пропоную використовувати git checkout- він може безкоштовно перевірити будь-яку галузь (поточну чи нову), яку він бажає. Я оновлю свою відповідь, щоб це було неоднозначно.
Бен

2
Я спробував це, але не думаю, що це правильний спосіб зробити це, оскільки він залишає застійні файли. Це не видаляє файли, які не були в останньому фіксації.
Девід

3
Якщо ви перебуваєте в робочому каталозі і ви залишаєтеся майстром, вам потрібно git resetвидалити ті файли, які ви скажете, що не хочете робити. Спробуйте зробити це в окрему галузь: git checkout <commit> -b <branchname>ви не будете мати застійних файли в цій галузі .
Бен

2
Проблема з використанням checkoutполягає в тому, що вона не видалить файли, додані в попередній комісій.

42

В оригінальному плакаті зазначено:

Найкращою відповіддю, яку хтось міг дати мені, було використання git revertX разів, поки я не досягну бажаного завдання.

Отже, скажімо, я хочу повернутись до зобов’язання, яке становить 20 фіксів, я повинен був би виконати його 20 разів.

Чи є простіший спосіб зробити це?

Я не можу використовувати скидання, оскільки ця репо-версія є загальнодоступною.

Не обов’язково використовувати git revertX разів. git revertможе прийняти діапазон комісій як аргумент, тому вам потрібно використовувати його лише один раз, щоб відновити діапазон комітетів. Наприклад, якщо ви хочете відновити останні 20 комітів:

git revert --no-edit HEAD~20..

Діапазон фіксації HEAD~20..короткий для HEAD~20..HEAD, і означає "починати з 20- го батьківського комітету HEAD і повертати всі комісії після нього до HEAD".

Це поверне останні 20 комісій, припускаючи, що жоден з них не є об'єднанням. Якщо є об'єднання об'єднань, ви не можете відновити їх усі в одній команді, вам потрібно буде відновити їх окремо

git revert -m 1 <merge-commit>

Зауважте також, що я перевірив, використовуючи діапазон із git revertвикористанням git версії 1.9.0. Якщо ви використовуєте старішу версію git, використання діапазону з git revertможливим або не може працювати.

У цьому випадку git revertвіддається перевага git checkout.

Зауважте, що на відміну від цієї відповіді, яка говорить про використанняgit checkout , git revert фактично видалить будь-які файли, додані до будь-якого з комітетів, які ви ревертуєте , що робить це правильним способом відновити діапазон змін.

Документація


Примітка . Це створює новий комітет із поверненими змінами. Ідеально підходить для питання ОП. Але переконайтесь, що саме цього ви хочете. (Приклади в документі git-revert, пов’язаному вище, є чудовими.) Якщо ви бажаєте дослідити попередні зобов'язання (тобто перед тим, як вибрати, до яких зобов’язань повернутися), скористайтеся варіантом оформлення замовлення, зазначеним в інших відповідях, маючи на увазі коментарі інших зроблено про видалені файли.
SherylHohman

@SherylHohman Повернення до попереднього комітету не створює нової комісії. Я не уявляю, що ти тут маєш на увазі.

27

Крок 1: перелік комісій:

git log

Ви отримаєте список, як у цьому прикладі:

[Comp:Folder User$ git log
commit 54b11d42e12dc6e9f070a8b5095a4492216d5320
Author: author <author@gmail.com>
Date:   Fri Jul 8 23:42:22 2016 +0300

This is last commit message

commit fd6cb176297acca4dbc69d15d6b7f78a2463482f
Author: author <author@gmail.com>
Date:   Fri Jun 24 20:20:24 2016 +0300

This is previous commit message

commit ab0de062136da650ffc27cfb57febac8efb84b8d
Author: author <author@gmail.com>
Date:   Thu Jun 23 00:41:55 2016 +0300

This is previous previous commit message
...

Крок 2: скопіюйте потрібний хеш-фікш та вставте його для оформлення замовлення:

git checkout fd6cb176297acca4dbc69d15d6b7f78a2463482f

Це все.


11
git read-tree -um @ $commit_to_revert_to

зробимо це. Це "git checkout", але без оновлення HEAD.

Такого ж ефекту можна досягти і з

git checkout $commit_to_revert_to
git reset --soft @{1}

якщо ви віддаєте перевагу рядкові команди зручності разом.

Вони залишають вас зі своїм робочим деревом та індексом у бажаному стані, ви можете просто git commitзакінчити.


Це єдиний прямолінійний підхід, який працював як шарм! Я перевірив з голови, запустив цю команду, і вона успішно видалила додані файли, які ми ввели та відновили всі зміни. Відмінно.
kamranicus

6

Хочете від'єднати режим HEAD?

Якщо ви хочете відкатати X час до певного вчинення з ВИЗНАЧЕНОЮ ГОЛОВОЮ (це означає, що ви нічого не можете зіпсувати), то будь-якими способами використовуйте наступне:

(замініть X на кількість комісій, які ви хочете повернути назад)

git checkout HEAD~X

IE, щоб повернути один прихил:

git checkout HEAD~1

1
Я б зняв цю частину ... важко повірити ... Це здається особистим, а також хтось згадав про це в коментарі вище, і в @ken теж у своїй відповіді.
meJustAndrew

@meJustAndrew Це так багато відповідей на ТА, що просто бентежить людей, це дуже дратує.
Карл Моррісон

Яка проста і пряма відповідь.
Аммад

2

Скажімо, ви працюєте над проектом і через день або близько того. Ви помітили, що одна функція все ще дає помилки. Але ви не знаєте, яку зміну ви внесли, що спричинило помилку. Тому вам доведеться виловлювати попередні робочі місця. Щоб повернутися до певного комітету:

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 .

Гаразд, так що фіксація працює для вас. Більше помилок більше немає. Ви визначили проблему. Тепер ви можете повернутися до останньої версії:

git checkout 792d9294f652d753514dc2033a04d742decb82a5 .

І замовте певний файл, перш ніж він спричинив помилку (у моєму випадку я використовую приклад Gemfile.lock):

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 -- /projects/myproject/Gemfile.lock

І це один із способів обробляти помилки, створені вами у комітах, не усвідомлюючи помилки до пізніше.


2

Ви можете знайти ідентифікатор фіксації, пов'язаний з кожним комітом, у розділі комісій GitHub / BitBucket / Gitlab. Дуже просто, припустимо, ваш ідентифікатор фіксації - 5889575, тоді, якщо ви хочете повернутися до цієї частини у своєму коді, тоді вам просто потрібно ввести

git checkout 5889575 .

Це відведе вас до того моменту у вашому коді.


1

Я не впевнений, що змінилося, але я не в змозі перевірити певну комісію без можливості --detach. Повна команда, яка працювала на мене: git checkout --detach [commit hash]

Щоб повернутися з відокремленого стану, мені довелося оформити місцеве відділення: git checkout master


Перевірка masterвирішує проблему залишатися відірваним, під час роботи git reset --hardчи git checkout -- .роботи, але залишається відстороненою
DarkCygnus

0

Ось приклад для цього

    cd /yourprojects/project-acme 


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