Як повернути репозиторій Git в попередню фіксацію

Як я можу повернутися з поточного стану в моментальний знімок, зроблений на певній фіксації?

Якщо я роблю git log , то я отримую наступний висновок:

 $ git log commit a867b4af366350be2e7c21b8de9cc6504678a61b' Author: Me <me@me.com> Date: Thu Nov 4 18:59:41 2010 -0400 blah blah blah... commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4 Author: Me <me@me.com> Date: Thu Nov 4 05:13:39 2010 -0400 more blah blah blah... commit 0766c053c0ea2035e90f504928f8df3c9363b8bd Author: Me <me@me.com> Date: Thu Nov 4 00:55:06 2010 -0400 And yet more blah blah... commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50 Author: Me <me@me.com> Date: Wed Nov 3 23:56:08 2010 -0400 Yep, more blah blah. 

Як повернутися до фіксації з 3 листопада, тобто зафіксувати 0d1d7fc ?

6500
06 нояб. заданий Crazy Serb 06 нояб. 2010-11-06 19:58 '10 о 19:58 2010-11-06 19:58
ответ 41 відповідь
  • 1
  • 2

Це сильно залежить від того, що ви маєте на увазі під "revert".

Тимчасово переключіться на іншу фіксацію

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

 # This will destroy any local modifications. # Don't do it if you have uncommitted work you want to keep. git reset --hard 0d1d7fc32 # Alternatively, if there work to keep: git stash git reset --hard 0d1d7fc32 git stash pop # This saves the modifications, then reapplies that patch after resetting. # You could get merge conflicts, if you've modified things which were # changed since the commit you reset to. work you want to keep # This will destroy any local modifications. # Don't do it if you have uncommitted work you want to keep. git reset --hard 0d1d7fc32 # Alternatively, if there work to keep: git stash git reset --hard 0d1d7fc32 git stash pop # This saves the modifications, then reapplies that patch after resetting. # You could get merge conflicts, if you've modified things which were # changed since the commit you reset to. 

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

Скасувати опубліковані коммітов з новими коммітов

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

git-revert manpage дійсно покриває багато цього в описі.  Ще одна корисна посилання - це розділ git-scm.com, в якому йде мова про git-revert . 

Якщо ви вирішите, що не хочете повертатися в кінці кінців, ви можете повернути реверс (як описано тут) або повернути назад до повернення (див. Попередній розділ).

Ви також можете знайти ця відповідь в цьому випадку:
Як перемістити HEAD назад в попереднє місце? (Окрема головка)

8356
06 нояб. відповідь дан Cascabel 06 нояб. 2010-11-06 20:04 '10 о 20:04 2010-11-06 20:04

Повернення робочої копії до останньої фіксації

Щоб повернутися до попереднього фіксації, ігноруючи будь-які зміни:

 git reset --hard HEAD 

де HEAD є останнім фіксатором у вашій поточної гілці

border=0

Повернення робочої копії до старішої фіксації

Щоб повернутися до фіксації, який більше, ніж остання фіксація:

1396
21 авг. відповідь дан boulder_ruby 21 Серпня. 2012-08-21 09:19 '12 в 9:19 2012-08-21 9:19

Тут багато складних і небезпечних відповідей, але насправді це легко:

 git revert --no-commit 0766c053..HEAD git commit 

Це поверне все, починаючи з HEAD, до хеша commit, що означає, що воно відтворює цей стан фіксації в робочому дереві, як якщо б кожна фіксація з тих пір була повернута. Потім ви можете зафіксувати поточний дерево, і воно створить абсолютно нову фіксацію, істотно еквівалентну фіксації, яку ви "повернули".

(Прапор --no-commit дозволяє git повертати все коммітов одночасно - в іншому випадку вам буде запропоновано відправити повідомлення для кожної фіксації в діапазоні, засмічуючи вашу історію непотрібними новими коммітов.)

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

одна тисяча триста шістьдесят один
12 февр. відповідь дан Yarin 12 февр. 2014-02-12 07:18 '14 в 7:18 2014-02-12 7:18

Кращим варіантом для мене і, можливо, для інших є опція Git reset:

 git reset --hard <commidId>  git clean -f 

Це був найкращий варіант для мене! Це просто, швидко і ефективно!


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

Також з коментарів, якщо ви хочете використовувати менш "ballzy" метод, ви можете використовувати

git clean -i

173
22 окт. відповідь дан Pogrindis 22 Жовтня. 2013-10-22 14:53 '13 о 14:53 2013-10-22 14:53

Перш ніж відповісти, додайте трохи фону, пояснивши, що це за HEAD .

First of all what is HEAD?

HEAD - це просто посилання на поточну фіксацію (останню) в поточній гілці. У будь-який момент часу може бути тільки один HEAD (виключаючи git worktree ).

Вміст HEAD зберігається всередині .git/HEAD і містить 40 байтів SHA-1 поточного фіксації.


detached HEAD

Якщо ви не використовуєте останню фіксацію - це означає, що HEAD вказує на попередню фіксацію в історії, вона називається detached HEAD .

2019

06 февр. відповідь дан CodeWizard 06 февр. 2015-02-06 00:56 '15 в 0:56 2015-02-06 00:56

Якщо ви хочете "розігнати", стерти останні повідомлення фіксації і помістити змінені файли в чергу, ви повинні використовувати команду:

 git reset --soft HEAD~1 
  • --soft вказує, що незаблоковані файли повинні бути збережені як робочі файли, протилежні --hard , які відкидають їх.
  • HEAD~1 - остання фіксація. Якщо ви хочете відкат 3 фіксації, ви можете використовувати HEAD~3 . Якщо ви хочете відкат до певного номера ревізії, ви також можете зробити це, використовуючи свій SHA-хеш.

Це надзвичайно корисна команда в ситуаціях, коли ви зробили неправильну річ, і хочете скасувати це останнє Ком.

Джерело: http://nakkaya.com/2009/09/24/git-delete-last-commit/

116
04 марта '14 в 20:25 2014-03-04 20:25 відповідь дан Stephen Ostermiller 04 березня '14 о 20:25 2014-03-04 20:25

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

 git add .  git checkout master -f 

Короткий опис:

  • Він не буде створювати ніяких коммітов, як це робить git revert .
  • Він не буде від'єднувати ваш ГОЛІВ, як git checkout <commithashcode> .
  • Він перекриє всі ваші локальні зміни і видалить все додані файли з моменту останнього фіксації в гілці.
  • Він працює тільки з іменами гілок, тому ви можете повернутися тільки до останнього фіксації в гілці таким чином.

Я знайшов набагато більш зручний і простий спосіб досягнення результатів, наведених вище:

 git add .  git reset --hard HEAD 

де HEAD вказує на останню фіксацію у вашій поточної гілці.

Це той же код, що і boulder_ruby, але я додав git add . до git reset --hard HEAD , щоб стерти всі нові файли, створені з моменту останнього коммітов, так як це те, що більшість людей чекають, коли повернуся до останньої фіксації.

104
29 июля '12 в 14:01 2012-07-29 14:01 відповідь дан Roman Minenok 29 липня '12 о 14:01 2012-07-29 14:01

Ви можете зробити це за допомогою наступних двох команд:

 git reset --hard [previous Commit SHA id here] git push origin [branch Name] -f 

Він видалить попередню фіксацію Git.

Якщо ви хочете зберегти свої зміни, ви також можете використовувати:

 git reset --soft [previous Commit SHA id here] 

Потім він збереже ваші зміни.

90
12 дек. відповідь дан kiran boghra 12 дек. 2014-12-12 09:52 '14 о 9:52 2014-12-12 9:52

Скажімо, у вас є такі коммітов в текстовому файлі з ім'ям ~/commits-to-revert.txt (я використовував git log --pretty=oneline для їх отримання)

 fe60adeba6436ed8f4cc5f5c0b20df7ac9d93219 0c27ecfdab3cbb08a448659aa61764ad80533a1b f85007f35a23a7f29fa14b3b47c8b2ef3803d542 e9ec660ba9c06317888f901e3a5ad833d4963283 6a80768d44ccc2107ce410c4e28c7147b382cd8f 9cf6c21f5adfac3732c76c1194bbe6a330fb83e3 fff2336bf8690fbfb2b4890a96549dc58bf548a5 1f7082f3f52880cb49bc37c40531fc478823b4f5 e9b317d36a9d1db88bd34831a32de327244df36a f6ea0e7208cf22fba17952fb162a01afb26de806 137a681351037a2204f088a8d8f0db6e1f9179ca 

Створіть Bash оболонку script для повернення кожного з них:

55
14 окт. відповідь дан Lance Caraccioli 14 Жовтня. 2011-10-14 00:51 '11 в 0:51 2011-10-14 00:51

Додаткові альтернативи рішень Jefromi

Jefromi solutions , безумовно, кращі, і ви обов'язково повинні їх використовувати. Однак, для повноти, я також хотів показати ці інші альтернативні рішення, які також можуть бути використані для повернення фіксації (в тому сенсі, що ви створюєте новий Комміт, який скасовує зміни в попередньому commit як це робить git revert ).

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

Альтернатива 1: Жорсткий і м'який скидання

Це дуже небагато змінена версія рішення Charles Bailey для Повернути фіксацію SHA-хешем в Git? :

53
29 июня '14 в 20:51 2014-06-29 20:51 відповідь дан user456814 29 червня '14 о 20:51 2014-06-29 20:51

Ніщо тут не працювало для мене, крім цієї точної комбінації:

 git reset --hard <commit_hash> git push origin <branch_name> --force 

Ключ тут - це примусове натискання, ніяких додаткових повідомлень про фіксацію / фіксації і т.д.

53
13 февр. відповідь дан serdarsenay 13 февр. 2018-02-13 01:40 '18 о 1:40 2018-02-13 1:40

Ось набагато простіший спосіб повернутися до попереднього фіксації (і мати його в некерованому стані, робити з ним все, що вам подобається):

 git reset HEAD~1 

Отже, немає необхідності в фіксації ідентифікаторів і т.д. :)

50
29 февр. відповідь дан Paul Walczewski 29 февр. 2016-02-29 11:40 '16 о 11:40 2016-02-29 11:40

Добре, повернутися до попереднього коммітов в git досить просто ...

Повернути назад без збереження змін:

 git reset --hard <commit> 

Поверніться назад зі збереженням змін:

 git reset --soft <commit> 

Поясніть: використовуючи git reset, ви можете скинути до певного стану, зазвичай це відбувається за допомогою хеш-кодування коммітов, як ви бачили вище.

Але, як ви бачите, різниця полягає в використанні двох прапорів --soft і --hard , за замовчуванням git reset з використанням прапора --soft , але завжди рекомендується використовувати цей прапор, я пояснюю кожен прапор:


--soft

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


--hard

Будьте обережні з цим прапором, він скидає робоче дерево, і всі зміни в відстежуються файлах зникають!


Я також створив зображення нижче, яке може статися в реальному житті, працюючи з git:

2019

Припускаючи, що ви говорите про господаря і в відповідному філіалі (це говорить про те, що це може бути будь-яка робоча гілка, про яку ви турбуєтеся):

 # Revert local master branch to November 3rd commit ID git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50 # Revert remote master branch to November 3rd commit ID git push -f origin 0d1d7fc32e5a947fbd92ee598033d85bfc445a50:master ID # Revert local master branch to November 3rd commit ID git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50 # Revert remote master branch to November 3rd commit ID git push -f origin 0d1d7fc32e5a947fbd92ee598033d85bfc445a50:master ID # Revert local master branch to November 3rd commit ID git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50 # Revert remote master branch to November 3rd commit ID git push -f origin 0d1d7fc32e5a947fbd92ee598033d85bfc445a50:master 

Я знайшов відповідь з повідомлення в блозі Видалити віддалений репозиторій Git для певного коммітов .

45
10 мая '16 в 20:21 2016-05-10 20:21 відповідь дан markreyes 10 травня '16 о 20:21 2016-05-10 20:21

Після всіх змін, коли ви натискаєте всі ці команди, вам, можливо, доведеться використовувати:

 git push -f ... 

І не тільки git push .

34
05 сент. відповідь дан sivi 05 сент. 2013-09-05 17:03 '13 о 17:03 2013-09-05 17:03

Існує команда (не частина ядра Git, але вона знаходиться в пакеті git-extras ) спеціально для повернення і виконання старих коммітов:

 git back 

На сторінці man вона також може використовуватися як така:

 # Remove the latest three commits git back 3 
32
08 авг. відповідь дан Shadow Man 08 Серпня. 2013-08-08 21:30 '13 о 21:30 2013-08-08 21:30

Поверніться до останнього фіксації і ігноруйте всі локальні зміни:

 git reset --hard HEAD 
27
26 июля '16 в 16:13 2016-07-26 16:13 відповідь дан Mohammed Irfan Tirupattur 26 липня '16 о 16:13 2016-07-26 16:13

Виберіть необхідний фіксатор і перевірте його

 git show HEAD git show HEAD~1 git show HEAD~2 

поки не отримаєте необхідну фіксацію. Щоб змусити HEAD вказувати на це, do

 git reset --hard HEAD~1 

або git reset --hard HEAD~2 або щось ще.

26
26 февр. відповідь дан tonythomas01 26 февр. 2014-02-26 15:52 '14 о 15:52 2014-02-26 15:52

Ви можете виконати всі ці початкові кроки самостійно і повернутися до git-репо.

  1. Витягніть останню версію свого сховища з Bitbucket, використовуючи команду git pull --all .

  2. Запустіть команду git log з -n 4 з вашого терміналу. Число після -n визначає кількість коммітов в журналі, починаючи з останнього фіксації у вашій локальній історії.

    $ git log -n 4

  3. Скиньте git reset --hard HEAD~N історії вашого сховища, використовуючи git reset --hard HEAD~N де N - кількість фіксацій, які ви хочете повернути назад. У наступному прикладі голова буде встановлена ​​одна фіксація, остання фіксація в історії сховища:

  4. Натисніть на зміну в git repo за допомогою git push --force щоб примусово натиснути на зміну.

Якщо ви хочете, щоб репозиторій git мав попередню фіксацію

 git pull --all git reset --hard HEAD~1 git push --force 
24
06 апр. відповідь дан Nanhe Kumar 06 Квітня. 2017-04-06 15:20 '17 о 15:20 2017-04-06 15:20

Це ще один спосіб прямого reset для недавнього фіксації

 git stash git stash clear 

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

PS: У нього невелика проблема; він також видаляє всі недавно збережені зміни схованки. Я думаю, в більшості випадків це не має значення.

20
05 мая '16 в 14:43 2016-05-05 14:43 відповідь дан Point Networks 05 травня '16 в 14:43 2016-05-05 14:43

Щоб повністю очистити каталог кодера від деяких випадкових змін, ми використовували:

 git add -A . git reset --hard HEAD 

Просто git reset --hard HEAD позбудеться від змін, але він не позбудеться "нових" файлів. У їхньому випадку вони випадково перетягнули важливу папку десь випадкову, і всі ці файли оброблялися як нові за допомогою Git, тому reset --hard не виправив її. Запустивши git add -A . заздалегідь, він явно відстежував їх все за допомогою Git, який був знищений за допомогою reset.

20
11 окт. відповідь дан Chris Moschini 11 Жовтня. 2015-10-11 03:10 '15 о 3:10 2015-10-11 3:10

Щоб зберегти зміни від попередньої фіксації в HEAD і перейти до попередньої фіксації, виконайте:

 git reset <SHA> 

Якщо зміни не потрібні від попередньої фіксації до HEAD і просто відмініть всі зміни, виконайте наступні дії:

 git reset --hard <SHA> 
20
28 июля '15 в 11:35 2015-07-28 11:35 відповідь дан Vishnu Atrai 28 липня '15 о 11:35 2015-07-28 11:35

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

 git reset --hard origin/master 

https://superuser.com/questions/273172/how-to-reset-master-to-origin-master

19
05 февр. відповідь дан nevster 05 февр. 2015-02-05 04:28 '15 в 4:28 2015-02-05 4:28

Revert - це команда відкат коммітов.

 git revert <commit1> <commit2> 

приклад:

git revert 2h3h23233

Він здатний приймати діапазон від HEAD, як показано нижче. Тут 1 говорить: "Поверніть останню фіксацію".

git revert HEAD~1..HEAD

а потім do git push

16
20 авг. відповідь дан Sireesh Yarlagadda 20 Серпня. 2015-08-20 17:45 '15 о 17:45 2015-08-20 17:45

Revert Most Recent Commit:

 git reset --hard HEAD 

HEAD - це просто посилання на поточну фіксацію (останню) в поточній гілці. У будь-який момент часу може бути тільки один HEAD .

Поверніться до старішої команді: найшвидшим способом відновлення старої версії є використання команди reset :

 # Resets index to former commit git reset 56e05fced # Moves pointer back to previous HEAD git reset --soft HEAD@{1} # Updates working copy to reflect the new commit git reset --hard 

Це перемотати вашу гілку HEAD в зазначену версію. Все фіксації, які з'явилися після цієї версії, фактично скасовані; ваш проект точно так же, як і в той момент.

Команда reset має кілька опцій, один з найцікавіших - прапор --soft . Якщо ви використовуєте його замість --hard , Git збереже всі зміни в цих "скасованих" в якості локальних змін.

Відновлення версії в новому локальному філії

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

Тим не менш, є також більш безпечний спосіб, якщо ви віддасте перевагу залишити свою поточну гілку HEAD недоторканою. Так як "гілки" настільки дешеві і легкі в Git, ми можемо легко створити нову гілку, яка починається з цієї старої версії:

 git checkout -b old-project-state 0ad5a7a6 

Зазвичай команда checkout використовується для простого перемикання гілок. Однак, надаючи параметр -b, ви також можете створити нову гілку (в даному прикладі - старе стан проекту). Якщо ви не хочете, щоб він починався з поточної ревізії HEAD, вам також необхідно надати хеш-фіксацію - стару ревізію проекту, яку ми хочемо відновити.