Як мені скасувати останні коммітов в Git?

Я випадково передав неправильні файли в Git , але я ще не відправив Комміт на сервер.

Як я можу скасувати ці коммітов з локального сховища?

18990
29 мая '09 в 21:09 2009-05-29 21:09 заданий Hamza Yerlikaya 29 травня '09 о 21:09 2009-05-29 21:09
@ 92 відповідей

Скасувати фіксацію і повторити

20501
29 мая '09 в 21:13 2009-05-29 21:13 відповідь дан Esko Luontola 29 травня '09 о 21:13 2009-05-29 21:13

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

Скажімо, у вас це є, де C - це ваша ГОЛОВА, а (F) - це стан ваших файлів.

  (F) ABC ↑ master 

Ви хочете обнулити Комміт C і більше ніколи його не бачити. Ти робиш це:

 git reset --hard HEAD~1 

результат:

  (F) AB ↑ master 

Тепер Б - ГОЛОВА. Оскільки ви використовували --hard , ваші файли повертаються в свої статки при фіксації B.

Ах, але припустимо, що commit C - це не катастрофа, а зовсім небагато. Ви хочете скасувати Комміт, але збережіть свої зміни для невеликого редагування, перш ніж зробити кращий Ком. Починаючи знову тут, з C в якості вашої голови:

  (F) ABC ↑ master 

Ви можете зробити це, залишивши --hard :

border=0
 git reset HEAD~1 

В цьому випадку результат:

  (F) ABC ↑ master 

В обох випадках HEAD - це просто покажчик на останній Ком. Коли ви робите git reset HEAD~1 , ви говорите Git перемістити покажчик HEAD назад на один Ком. Але (якщо ви не використовуєте --hard ) ви залишаєте свої файли такими, якими вони були. Тепер git status показує зміни, які ви зареєстрували в C. Ви нічого не втратили!

Для легкого дотику ви можете навіть скасувати фіксацію, але залишити свої файли і індекс :

 git reset --soft HEAD~1 

Це не тільки залишає ваші файли в спокої, але навіть залишає ваш індекс в спокої. Коли ви зробите git status , ви побачите, що в індексі є ті ж файли, що і раніше. Фактично, відразу після цієї команди ви можете виконати git commit і ви будете переробляти той же Комміт, який тільки що у вас був.

Ще одна річ: припустимо, ви знищили Комміт, як в першому прикладі, але потім виявили, що він вам потрібен в кінці кінців? Не пощастило, правда?

Ні, ще є спосіб повернути його. Тип git reflog , і ви побачите список (частково) здійснювати ШАС (тобто, хеш), що ви перемістилися навколо в Знайти Комміт ви знищили, і зробити це .:

 git checkout -b someNewBranchName shaYouDestroyed 

Ви зараз воскресили цей Ком. Комітети насправді не знищуються в Git протягом приблизно 90 днів, тому зазвичай ви можете повернутися і врятувати того, від якого не хотіли позбутися.

10099
29 июля '11 в 1:22 2011-07-29 01:22 відповідь дан Ryan Lundy 29 липня '11 в 1:22 2011-07-29 1:22

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

Існує два способи "скасувати" ваш останній Комміт, в залежності від того, чи зробив ви загальнодоступний звіт (натиснув на віддалений репозиторій):

Як скасувати локальну фіксацію

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

 git log commit 101: bad commit # latest commit, this would be called 'HEAD' commit 100: good commit # second to last commit, this is the one we want 

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

 git reset --soft HEAD^ # use --soft if you want to keep your changes git reset --hard HEAD^ # use --hard if you don't care about keeping the changes you made changes git reset --soft HEAD^ # use --soft if you want to keep your changes git reset --hard HEAD^ # use --hard if you don't care about keeping the changes you made 

Тепер git log покаже, що наша остання фіксація була видалена.

Як скасувати публічну фіксацію

Якщо ви вже зробили свої коммітов загальнодоступними, вам потрібно буде створити новий Комміт, який "поверне" зміни, внесені вами в попередню фіксацію (поточний HEAD).

 git revert HEAD 

Тепер ваші зміни будуть скасовані і готові до фіксації:

 git commit -m 'restoring the file I removed by accident' git log commit 102: restoring the file I removed by accident commit 101: removing a file we don't need commit 100: adding a file that we need 

Для отримання додаткової інформації, ознайомтеся з Основами Git - Скасувати речі

1889
16 июня '11 в 20:27 2011-06-16 20:27 відповідь дан Andrew 16 червня '11 о 20:27 2011-06-16 20:27

Додати / видалити файли, щоб отримати те, що ви хочете:

 git rm classdir git add sourcedir 

Потім змініть фіксацію:

 git commit --amend 

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

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

1664
29 мая '09 в 21:16 2009-05-29 21:16 відповідь дан bdonlan 29 травня '09 о 21:16 2009-05-29 21:16
926
29 мая '09 в 21:13 2009-05-29 21:13 відповідь дан Lennart Koopmann 29 травня '09 о 21:13 2009-05-29 21:13

Щоб змінити останнім фіксацію

Замініть файли в індексі:

 git rm --cached *.class git add *.java 

Потім, якщо це приватний філія, змініть фіксацію:

 git commit --amend 

Або, якщо це загальна гілка, виконайте нову фіксацію:

 git commit -m 'Replace .class files with .java files' 


(Щоб змінити попередню фіксацію, використовуйте дивовижну інтерактивну rebase )


ProTip ™: додайте *.class в gitignore, щоб зупинити це повторення.


Щоб повернути фіксацію

Зміна коммітов - ідеальне рішення, якщо вам потрібно змінити останнім Комміт, але reset більш загальне рішення.

Ви можете скинути git на будь-який фіксатор за допомогою:

 git reset @~N 

Де N - кількість коммітов перед HEAD , а @~ повернення до попереднього фіксації.

Отже, замість внесення змін в комерц ви можете використовувати:

 git reset @~ git add *.java git commit -m "Add .java files" 

Перевірте git help reset , зокрема розділи --soft --mixed і --hard , щоб краще зрозуміти, що це робить.

Reflog

Якщо ви зіпсувалися, ви завжди можете використовувати reflog, щоб знайти віддалені коммітов:

 $ git reset @~ $ git reflog c4f708b HEAD@{0}: reset: moving to @~ 2c52489 HEAD@{1}: commit: added some .class files $ git reset 2c52489 ... and you're back where you started 


707
31 июля '10 в 12:39 2010-07-31 12:39 відповідь дан Zaz 31 липня '10 о 12:39 2010-07-31 12:39

Використовувати git revert <commit-id>

Щоб отримати ідентифікатор фіксації, просто використовуйте git log

589
25 мая '12 в 19:04 2012-05-25 19:04 відповідь дан Jaco Pretorius 25 травня '12 о 19:04 2012-05-25 19:04

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

 git reset --hard HEAD^1 

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

 git reset --soft HEAD^1 

Тепер ваші фіксовані файли входять в проміжну область. Припустимо, що якщо ви хочете перевиконати файли, тому що вам потрібно відредагувати некоректний контент, виконайте наступну команду

 git reset HEAD 

Тепер передані файли надходять з поетапної області в непоставлену область. Тепер файли готові до редагування, тому, що б ви не змінили, ви хочете перейти до редагування і додати його і створити новий / новий Ком.

більше

472
31 янв. відповідь дан Madhan Ayyasamy 31 Січня. 2013-01-31 10:06 '13 о 10:06 2013-01-31 10:06

Якщо у вас встановлена Git Extras , ви можете запустити git undo щоб скасувати останню фіксацію. git undo 3 скасовує останні 3 фіксації.

451
13 дек. відповідь дан nickf 13 дек. 2011-12-13 13:18 '11 о 13:18 2011-12-13 13:18

Я хотів скасувати останні 5 коммітов в нашому спільному сховищі. Я переглянув ідентифікатор ревізії, до якого я хотів відкат. Потім я набрав наступне.

 prompt> git reset --hard 5a7404742c85 HEAD is now at 5a74047 Added one more page to catalogue prompt> git push origin master --force Total 0 (delta 0), reused 0 (delta 0) remote: bb/acl: neoneye is allowed. accepted payload. To git@bitbucket.org:thecompany/prometheus.git + 09a6480...5a74047 master -> master (forced update) prompt> page to catalogue prompt> git reset --hard 5a7404742c85 HEAD is now at 5a74047 Added one more page to catalogue prompt> git push origin master --force Total 0 (delta 0), reused 0 (delta 0) remote: bb/acl: neoneye is allowed. accepted payload. To git@bitbucket.org:thecompany/prometheus.git + 09a6480...5a74047 master -> master (forced update) prompt> 
419
06 апр. відповідь дан neoneye 06 Квітня. 2012-04-06 16:58 '12 о 16:58 2012-04-06 16:58

Я вважаю за краще використовувати git rebase -i для цього завдання, тому що з'являється хороший список, де я можу вибрати коммітов, щоб позбутися. Це може бути не так прямо, як деякі інші відповіді тут, але це просто здається правильним.

Виберіть кількість коммітов, які ви хочете перерахувати, потім викличте це (щоб забрати останні три)

 git rebase -i HEAD~3 

приблизний список

 pick aa28ba7 Sanity check for RtmpSrv port pick c26c541 RtmpSrv version option pick 58d6909 Better URL decoding support 

Потім Git видалить фіксації для будь-якої видаляється рядка.

397
25 окт. відповідь дан Steven Penny 25 Жовтня. 2012-10-25 06:41 '12 в 6:41 2012-10-25 6:41

Як виправити попередній локальний Комміт

Використовуйте git-gui (або аналогічний) для виконання git commit --amend . З графічного інтерфейсу ви можете додавати або видаляти окремі файли з коммітов. Ви також можете змінити повідомлення коммітов.

Як скасувати попередній локальний Комміт

Просто поверніть свою гілку в попереднє місце розташування (наприклад, використовуючи gitk або git rebase ). Потім повторно застосуйте зміни з збереженої копії. Після складання сміття в вашому локальному сховищі буде схоже на те, що небажаний Комміт ніколи не відбувався. Щоб зробити все це в одній команді, використовуйте git reset HEAD~1 .

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

Як скасувати публічний Комміт

Виконайте зворотний вибір вишні ( git-revert ), щоб скасувати зміни.

Якщо ви ще не внесли інші зміни в свою гілку, ви можете просто зробити ...

 git revert --no-edit HEAD 

Потім відправте оновлену гілку в загальний репозиторій.

Історія коммітов покаже обидва коммітов окремо.


Додатково: виправлення приватної гілки в публічному сховищі

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

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

 git push --delete (branch_name) ## remove public version of branch 

Очистіть свою гілку локально, потім відштовхніться ...

 git push origin (branch_name) 

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

382
23 апр. відповідь дан nobar 23 Квітня. 2013-04-23 20:27 '13 о 20:27 2013-04-23 20:27

Якщо ви зробили помилку, але не натиснули,

 git reset --soft HEAD~1 

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

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

АБО

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

 git revert HEAD 

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

307
03 сент. відповідь дан santos_mgr 03 сент. 2014-09-03 10:15 '14 о 10:15 2014-09-03 10:15

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

Ідентифікатор фіксації можна побачити

 git log 

Тоді ви можете зробити -

 git reset --hard <commit_id> git push origin <branch_name> -f 
303
17 мая '13 в 16:02 2013-05-17 16:02 відповідь дан poorva 17 травня '13 о 16:02 2013-05-17 16:02

У SourceTree (GUI для GitHub) ви можете натиснути правою кнопкою миші фіксацію і виконати "Зворотній фіксатив". Це повинно скасувати ваші зміни.

На терміналі:

Ви також можете використовувати:

 git revert 

або:

256
28 июня '13 в 13:18 2013-06-28 13:18 відповідь дан Varun Parakh 28 червня '13 о 13:18 2013-06-28 13:18

Єдина команда:

241
05 марта '14 в 16:55 2014-03-05 16:55 відповідь дан Manish Shrivastava 05 березня '14 о 16:55 2014-03-05 16:55

Просто скиньте його, виконавши команду нижче, використовуючи git :

 git reset --soft HEAD~1 

Поясніть: що робить git reset , він в основному reset на будь-який фіксатор, на який ви хочете повернутися, тоді, якщо ви об'єднаєте його з --soft , він повернеться, але збереже зміни в ваших файлах, тому ви повернетеся на сцену, в яку був доданий файл, HEAD - глава гілки, і якщо ви об'єднаєтеся з ~1 (в цьому випадку ви також використовуєте HEAD^ ), він повернеться лише до однієї команди, яку ви хочете ...

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

2019

Як скасувати останній Git?

Щоб відновити всі до того, як це було до останнього фіксації, нам потрібно скинути фіксацію до HEAD.

  1. Якщо ви не хочете зберігати свої зміни, які ви зробили:

     git reset --hard HEAD^ 
  2. Якщо ви хочете зберегти свої зміни:

     git reset --soft HEAD^ 

Тепер перевірте свій журнал git. Він покаже, що наша остання фіксація була видалена.

214
23 апр. відповідь дан Ranjithkumar Ravi 23 Квітня. 2014-04-23 14:21 '14 о 14:21 2014-04-23 14:21

Використовуйте reflog, щоб знайти правильний стан

 git reflog 

2019

172
07 янв. відповідь дан Shubham Chaudhary 07 Січня. 2014-01-07 01:34 '14 в 1:34 2014-01-07 1:34

"Скинути робоче дерево до останнього фіксації"

 git reset --hard HEAD^ 

"Очистити невідомі файли від робочого дерева"

 git clean 

см. - Коротка посилання Git

ПРИМІТКА. Ця команда видалить попередню фіксацію, тому використовуйте її з обережністю! git reset --hard безпечніше -

167
03 окт. відповідь дан Ravi_Parmar 03 Жовтня. 2013-10-03 15:43 '13 о 15:43 2013-10-03 15:43

Перший забіг:

 git reflog 

Він покаже вам всі можливі дії, які ви виконали в своєму репозиторії, наприклад, commit, merge, pull і т.д.

Потім виконайте:

 git reset --hard ActionIdFromRefLog 
150
11 окт. відповідь дан U. Ali 11 Жовтня. 2013-10-11 17:41 '13 о 17:41 2013-10-11 17:41

Відмінити останню Комміт:

git reset --soft HEAD^ або git reset --soft HEAD~

Це призведе до скасування останнього фіксації.

Тут --soft означає скидання налаштувань.

HEAD~ або HEAD^ означає перехід до фіксації перед HEAD.


Замінити останню фіксацію на нову фіксацію:

 git commit --amend -m "message" 

Він замінить останнім Комміт новим фіксатором.

141
06 марта '16 в 14:53 2016-03-06 14:53 відповідь дан akshay_rahar 06 березня '16 о 14:53 2016-03-06 14:53

Інший шлях:

Оформіть заявку на філію, який хочете повернути, а потім поставте локальну робочу копію назад на Комміт, який ви хочете бути останнім на віддаленому сервері (все після того, як воно пройде до побачення). Для цього в SourceTree я клацнув правою кнопкою миші і вибрав "Скинути BRANCHNAME на це Комміт".

Потім перейдіть в локальний каталог сховища та виконайте наступну команду:

 git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME 

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

136
13 мая '13 в 20:12 2013-05-13 20:12 відповідь дан CommaToast 13 травня '13 о 20:12 2013-05-13 20:12

Введіть git log і знайдіть останній код хеширования і введіть:

 git reset <the previous co> 
127
15 мая '13 в 16:12 2013-05-15 16:12 відповідь дан user853293 15 травня '13 о 16:12 2013-05-15 16:12

У моєму випадку я випадково зробив деякі файли, які я не хотів. Тому я зробив наступне, і це спрацювало:

 git reset --soft HEAD^ git rm --cached [files you do not need] git add [files you need] git commit -c ORIG_HEAD 

Перевірте результати за допомогою gitk або git log --stat

124
18 июля '13 в 9:41 2013-07-18 09:41 відповідь дан egridasov 18 липня '13 в 9:41 2013-07-18 9:41

Використовуйте SourceTree (графічний інструмент для Git), щоб побачити ваші коммітов і дерево. Ви можете вручну скинути його, клацнувши правою кнопкою миші.

113
29 авг. відповідь дан iOS Coder 29 Серпня. 2013-08-29 19:18 '13 о 19:18 2013-08-29 19:18

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

 git reset --hard HEAD~1 
111
28 авг. відповідь дан thestar 28 Серпня. 2014-08-28 19:03 '14 о 19:03 2014-08-28 19:03

Існує два основні сценарії

Ви ще не натиснули фіксацію

Якщо проблема пов'язана з додатковими файлами, які ви зробили (і ви не хочете їх використовувати в репозиторії), ви можете видалити їх за допомогою git rm а потім --amend з --amend

 git rm <pathToFile> 

Ви також можете видалити цілі каталоги за допомогою -r або навіть об'єднати з іншими командами Bash

 git rm -r <pathToDirectory> git rm $(find -name '*.class') 

Після видалення файлів ви можете зафіксувати за допомогою опції --amend

 git commit --amend -C HEAD # the -C option is to use the same commit message 

Це дозволить переписати недавній локальний Комміт, видаливши зайві файли, тому ці файли ніколи не будуть відправлятися на push, а також будуть видалені з вашого локального репозіторія.git через GC.

Ви вже натиснули на фіксацію

Ви можете застосувати один і той же рішення іншого сценарію, а потім виконати git push з -f опції -f , але це не рекомендується, так як він перезаписує віддалену історію з розбіжним зміною (це може зіпсувати ваше сховище).

Замість цього вам необхідно виконати фіксацію без --amend (пам'ятаєте про це -amend ": цей варіант перезаписує історію останнього коммітов).

111
12 сент. відповідь дан dseminara 12 сент. 2014-09-12 17:51 '14 о 17:51 2014-09-12 17:51

Для локальної фіксації

 git reset --soft HEAD~1 

або якщо ви точно не пам'ятаєте, в яку фіксацію це можливо, ви можете використовувати

 git rm --cached <file> 

Для натиснутою фіксації

Правильний спосіб видалення файлів з історії сховища - використання git filter-branch . Тобто,

разделе git-filter-branch (1) Manual . 

111
ответ дан geoom 04 марта '14 в 7:35 2014-03-04 07:35

Є багато способів зробити це: