Як я скасовую останні місцеві комісії в Git?


21049

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

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


137
Перш ніж опублікувати нову відповідь, подумайте, що на це питання вже є 65+ відповідей. Переконайтеся, що ваша відповідь сприяє тому, що немає серед існуючих відповідей.
Sazzad Hissain Khan

89
Ви знаєте, що потрібно git? git undo, Це воно. Тоді репутація git має справу з помилками, допущеними нами простими смертними, зникає. Реалізуйте, натиснувши поточний стан на git стек перед виконанням будь-якої gitкоманди. Це вплине на продуктивність, тому найкраще додати прапор конфігурації щодо того, чи потрібно це вмикати.
Імін Ронг

11
@YiminRong Це можна зробити з допомогою Git і aliasфункції: git-scm.com/book/en/v2/Git-Basics-Git-Aliases
Edric

3
@RomainValeri - Так само скасування працює і в будь-якому іншому місці.
Імін Ронг

1
@YiminRong Не купує його. Люди все одно бідкаються і скасовують речі, щоб їх не скасувати. Але що ще важливіше - git reflogце вже близько до того, що ви описуєте, але дає користувачеві більше контролю над тим, що потрібно (не) зробити. Але, будь ласка, ні, "скасувати" не працює скрізь однаково, і люди очікують, що багато можливостей для досягнення функції. Скасувати останню фіксацію? Скасувати останню дію? Якщо останньою дією було натискання, скасуйте, як саме, (скинути та натиснути) або (повернути та натиснути)?
RomainValeri

Відповіді:


22850

Скасуйте комісію та повторіть

$ git commit -m "Something terribly misguided"             # (1)
$ git reset HEAD~                                          # (2)
<< edit files as necessary >>                              # (3)
$ git add ...                                              # (4)
$ git commit -c ORIG_HEAD                                  # (5)
  1. Це ви хочете скасувати.
  2. Це не робить нічого для вашого робочого дерева (стан ваших файлів на диску), але скасовує фіксацію та залишає зміни, які ви вчинили, незафіксованими (тому вони відображатимуться як "Зміни не встановлені для здійснення" git status, тому вам потрібно буде додайте їх ще раз, перш ніж зробити це). Якщо ви хочете лише додати більше змін до попередньої фіксації або змінити повідомлення про фіксацію 1 , ви можете використовувати git reset --soft HEAD~замість цього, як git reset HEAD~2, але залишати існуючі зміни поетапними.
  3. Внесіть виправлення в файли робочого дерева.
  4. git add все, що ви хочете включити у свій новий комітет.
  5. Введіть зміни, використовуючи старе повідомлення про фіксацію. resetскопіював стару голову на .git/ORIG_HEAD; commitз -c ORIG_HEADвідкриє редактор, який спочатку містить повідомлення журналу зі старого фіксу та дозволяє редагувати його. Якщо вам не потрібно редагувати повідомлення, ви можете скористатися -Cопцією.

Однак остерігайтеся, що якщо ви додали якісь нові зміни до індексу, використання commit --amendдодасть їх до попереднього зобов’язання.

Якщо код вже висунуто на ваш сервер і у вас є дозволи на перезапис історії (ребазування), виконайте такі дії:

git push origin master --force

Ви також можете подивитися на цю відповідь:

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

Наведена вище відповідь покаже вам, git reflog,що використовується для з'ясування того, що таке SHA-1, яку ви хочете повернути. Після того, як ви знайшли точку, до якої потрібно скасувати, використовувати послідовність команд, як пояснено вище.


1 Однак зауважте, що вам не потрібно перезавантажуватись до попередньої фіксації, якщо ви просто помилилися у своєму повідомленні про вчинення . git resetНайпростішим варіантом є (відхилити будь-які зміни, які ви зробили з того часу), а потім git commit --amend, що відкриє ваш редактор повідомлень про фіксацію за замовчуванням, попередньо заповнений останнім повідомленням про фіксацію.

2 HEAD~ те саме, що HEAD~1. Також дивіться, що таке головка в кишці? . Це корисно, якщо ви хочете скасувати декілька комітетів.


472
І якщо фіксація була неправильною гілкою, ви можете виконати git checkout theRightBranchвсі етапи змін. Як я просто повинен був зробити.
Френк Ширар

489
Якщо ви працюєте в DOS, замість цього git reset --soft HEAD^вам потрібно буде використовувати git reset --soft HEAD~1. ^ - символ продовження в DOS, тому він не працюватиме належним чином. Крім того, --softце за замовчуванням, тому ви можете опустити його, якщо вам подобається, і просто сказати git reset HEAD~1.
Райан Лунді

119
Користувачі zsh можуть отримати: zsh: no matches found: HEAD^- вам потрібно втекти ^ тобтоgit reset --soft HEAD\^
tnajdek

7
Відповідь не правильна, якщо, скажімо випадково, git commit -aбула видана тоді, коли -aслід було залишити її. У такому випадку краще не залишати поза --soft(що призведе --mixedдо дефолту), і тоді ви зможете відновити зміни, які ви хотіли зробити.
dmansfield

6
@IcyBrk git add - це команда. git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p] [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]] [--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--chmod=(+|-)x] [--] [<pathspec>…​]
Ашраф.Шк786

10729

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

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

   (F)
A-B-C
    ↑
  master

Ви хочете, щоб ядро здійснив C, і більше ніколи його не бачити і втратити всі зміни в локально модифікованих файлах . Ви робите це:

git reset --hard HEAD~1

Результат:

 (F)
A-B
  ↑
master

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

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

   (F)
A-B-C
    ↑
  master

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

git reset HEAD~1

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

   (F)
A-B-C
  ↑
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 днів, тому зазвичай ви можете повернутися та врятувати той, якого ви не хотіли позбутися.


15
ПОДЕРЖАЙТЕ! Це може не зробити те, що ви очікуєте, якщо ваша помилкова фіксація була (швидким вперед) злиттям! Якщо ваша голова перебуває на об'єднанні (наприклад: об'єднана функція гілки в головний), git reset --hard~1вкаже головну гілку на останню фіксацію всередині гілки функції. У цьому випадку слід використовувати специфічний ID комісії замість відносної команди.
Кріс Керекес

90
Пропустіть вирішальний момент: Якщо раніше зазначена фіксація була «висунута» на пульт дистанційного керування, будь-яка операція «скасування», як би не була простою, завдасть величезного болю та страждань решті користувачів, які мають це зобов’язання у своїй локальній копії, коли в майбутньому вони роблять «потяг». Отже, якщо комісія вже була "натиснута", зробіть це замість цього: git revert <bad-commit-sha1-id> git push origin:
FractalSpace

12
@FractalSpace, це не спричинить "величезного болю і страждань". Я зробив кілька силових натискань, коли використовую Git з командою. Все, що потрібно - це спілкування.
Райан Лунді

14
@Kyralessa На моєму робочому місці зіпсувати робочий процес всієї команди, а потім розповісти, як виправити sh * t, це не називається "спілкуванням". Переписання історії git - це руйнівна операція, яка призводить до руйнування частин репо. Наполягаючи на його використанні, тоді як доступні чіткі та безпечні альтернативи, просто безвідповідально.
FractalSpace

14
Я хотів зняти з себе зобов’язання і більше ніколи його не побачити. Я використовував ваш приклад, --hardале те, чого я не усвідомлював, - це те, що всі мої незмінені зміни в моєму робочому дереві також занурюються! Я збирався вчинити ці файли як частину пізнішої фіксації. Зараз здається неможливим повернути ці файли - я навіть спробував рішення, про яке ви розмістили, reflogале це не відновило раніше нестандартні зміни.
Адам Берлі

2129

Існує два способи "скасувати" останнє зобов’язання, залежно від того, чи ви вже зробили вашу публікацію (натиснуто у віддалене сховище):

Як скасувати місцевий комітет

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

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

Тепер 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 - Скасування речей .


101
Цю відповідь я знайшов найяснішою. git revert HEAD^не є попереднім, є попереднім попереднім. Я зробив: git revert HEADа потім знову натисніть і все спрацювало :)
nacho4d

Якщо Git запитає у вас "Більше?" коли ви спробуєте ці команди, використовуйте альтернативний синтаксис у цій відповіді: stackoverflow.com/a/14204318/823470
tar

1745

Додайте / видаліть файли, щоб отримати потрібні речі:

git rm classdir
git add sourcedir

Потім внесіть зміни до комісії:

git commit --amend

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

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


2
FYI: Це видаляє всі мої файли, і я втратив зміни.
egorlitvinenko

UPD: Однак я відновив його за допомогою reflog. Але квитанція не спрацювала за початкову комісію.
egorlitvinenko

1
Використовуйте git rm --cachedдля збереження файлів у файловій системі та видаляйте їх лише з індексу git!
xuiqzy

1015
git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

або

git reset --hard HEAD~1

Попередження: наведена вище команда назавжди видалить модифікації .javaфайлів (та будь-яких інших файлів), які ви хотіли зробити.

Команда hard resetto HEAD-1встановить вашу робочу копію до стану комісії перед вашим неправильним здійсненням.


19
git commit -a -m ""або git commit -am ""природно! :]
trejder

Ще одне "швидке" використання сховища; якщо ви хочете зняти все з собою (скасувати додавання git), просто git stashтодіgit stash pop
seanriordan08

778

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

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

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

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

git commit --amend

Або, якщо це спільна філія, зробіть нове зобов’язання:

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


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


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

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

$ 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



2
Для тих, хто читає в майбутньому - зверніть увагу, що git revertце окрема команда - яка в основному "скидає" один комімент.
BKSpurgeon

680

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

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


15
Що це означає, вишня вибирати коміти? У моєму випадку я опинився на неправильній гілці, коли редагував файл. Я здійснив це, тоді зрозумів, що опинився в неправильній галузі. Використання "git reset --soft HEAD ~ 1" повернуло мене безпосередньо перед фіксацією, але тепер, якщо я перевіряю правильну гілку, як я скасовую зміни до файлу в неправильній гілці, але замість цього вношу їх (у однойменному імені файл) у правильній гілці?
астрономдав

Я щойно використаний git revert commit-idпрацював як шарм. Звичайно, тоді вам потрібно буде натиснути на зміни.
Кейсі Робінсон

8
Я вважаю, що це буде git cherry-pick <<erroneous-commit-sha>>@astronomerdave. Від, пан Майже на 2 роки, пізно до партії.
Том Говард

@Kris: Замість вишні використовуйте ребазу. Тому що це вищий збір вишні
Євген Конков

Я б скористався функцією повернення, лише якщо я вже підштовхнув свої зобов'язання. Інакше скидання - кращий варіант. Не забувайте, що відновлення створює нове зобов'язання, і зазвичай це не є метою.
Hola Soy Edu Feliz Navidad

532

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

git reset --hard HEAD^1

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

git reset --soft HEAD^1

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

git reset HEAD

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

Більше


13
@SMR, У вашому прикладі всі вказують лише на поточну ГОЛОВУ. ГОЛОВА ^ = ГОЛОВКА ^ 1. А також HEAD ^ 1 = HEAD ~ 1. Якщо ви використовуєте HEAD ~ 2, існує різниця між символами ~ та ^. Якщо ви використовуєте ~ 2, означає «перший батько першого батька» або «дідусь і бабуся».
Мадхан Айясамі

501

Якщо у вас встановлені додатки Git , ви можете запустити git undoскасування останньої комісії. git undo 3скасує три останні коміти.


470

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

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>

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

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

6
"Так само, як і в реальному світі, якщо ви хочете переписати історію, вам потрібна змова: всі повинні бути" змовою "(як мінімум усі, хто знає про історію, тобто всі, хто коли-небудь виривав з гілки) . " Джерело: stackoverflow.com/a/2046748/334451
Мікко Rantalainen

440

Я вважаю за краще використовувати 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 видалить комікси для будь-якого рядка, який ви видалите.


422

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

Використовуйте git-gui (або подібне) для виконання a 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)

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


8
gitk --all $(git reflog | cut -c1-7)&може бути корисним для пошуку попередньої редакції, якщо ви хочете скасувати команду '--amend'.
nobar

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

Я думаю, що "приватне" / "публічне" правильніше було б бути "локальним" / "віддаленим".
nobar

Виправити приватну гілку у віддаленому сховищі можна також простоgit push origin (branch_name) --force
nobar

335

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

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

git log 

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

git reset --hard <commit_id>

git push origin <branch_name> -f

Що робити, якщо ви не використовуєте "<commit_id>" і просто використовуєте "git reset --hard"? Я, як правило, просто хочу позбутися моїх останніх оновлень, яких я ще не здійснив, і повернувся до останнього зобов'язання, яке я зробив, і я завжди використовую "git reset --hard".
Хайме Монтоя

3
@JaimeMontoya Для скасування останніх змін, які ви можете використовувати git reset --hard, але якщо вам доведеться жорстко видалити останні "n", ви вкажете SHA
badva

334

Якщо ви зробили мотлох, але не підштовхнули,

git reset --soft HEAD~1

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

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

АБО

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

git revert HEAD

Це створить нове зобов’язання, яке скасовує все, що вводиться випадковим комітетом.


Я перебуваю у другому випадку, але коли я роблю "git revert HEAD", він говорить "помилка: Команда [ID] - це злиття, але не було надано параметр -m. Фатальний: не вдалося відновити". Будь-які пропозиції?
metaforge

2
Напевно, варто згадати, що замість цього HEAD~1ви могли використовувати фактичний хеш, відображений git log --statабо git reflog- корисний, коли вам потрібно "скасувати" більше, ніж один комікт.
ccpizza

284

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

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

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

git revert

Або:

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 your changes.

263

Одна команда:

git reset --soft 'HEAD^' 

Це чудово працює, щоб скасувати останню локальну комісію!


11
Мені потрібно було написати git reset --soft "HEAD ^" з подвійними лапками, тому що я записую це з командної лінії Windows.
Ена

253

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

git reset --soft HEAD~1

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

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

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


239

Як скасувати останню команду Git?

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

  1. Якщо ви не хочете залишати внесені вами зміни:

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

    git reset --soft HEAD^
    

Тепер перевірте свій журнал git. Це покаже, що наш останній комітет видалено.


193

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

git reset --hard HEAD^ 

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

git clean    

див. - Швидкий довідник Git

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


190

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

git reflog

відмовитися раніше ПОВЕРНУТИСЯ ДО ПОВЕРНЕННЯ

Виберіть правильний рефлог (у моєму випадку f3cb6e2) та введіть

git reset --hard f3cb6e2

Після цього РЕПОГОЛОВКА буде скинута до цього HEADid ЛОГУ ПІСЛЯ РОЗВИТКУ ефект скидання

Нарешті рефлог виглядає як на малюнку нижче

відмовитись після РЕФЛОГ ФІНАЛ


164

Перший запуск:

git reflog

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

Потім зробіть:

git reset --hard ActionIdFromRefLog

155

Скасувати останню комісію:

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

Це скасує останнє зобов'язання.

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

HEAD~або HEAD^означає перейти на вчинення перед HEAD.


Замініть останнє зобов’язання новим комітетом:

git commit --amend -m "message"

Він замінить останнє зобов’язання новим.


153

Інший спосіб:

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

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

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

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



139

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

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


133

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

git reset --soft HEAD~ 

126

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

Команда Git для скасування останнього комітету / попередніх комісій:

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

Основна команда для повернення комітету в Git:

$ git reset --hard <COMMIT -ID>

або

$ git reset --hard HEAD~<n>

Ідентифікатор COMMIT : ID для комітету

n: це кількість останніх комісій, які ви хочете відновити

Ви можете отримати ідентифікатор фіксації, як показано нижче:

$ **git log --oneline**

d81d3f1 function to subtract two numbers

be20eb8 function to add two numbers

bedgfgg function to mulitply two numbers

де d81d3f1 та be20eb8 - ідентифікатор фіксації.

Тепер давайте розглянемо кілька випадків:

Припустимо, ви хочете відновити останню команду 'd81d3f1'. Ось два варіанти:

$ git reset --hard d81d3f1

або

$ git reset --hard HEAD~1

Припустимо, ви хочете скасувати команду "be20eb8":

$ git reset --hard be20eb8

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

$ git reset --help

5
git reset --hard HEAD~1це занадто небезпечно ! Це не просто "скасує останнє зобов'язання", але поверне репо назад повністю до попереднього зобов'язання. Таким чином, ви ЗБУДИТЕ всі зміни, здійснені в останньому комітеті!
Арніс Юрага

Ви маєте право, щоб скасувати це, ви можете скористатисяgit push -f <remote> HEAD@{1}:<branch>
Бенні

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

125

Для місцевого комітету

git reset --soft HEAD~1

або якщо ви точно не пам’ятаєте, в якій саме комісії це можливо, ви можете використовувати

git rm --cached <file>

Для підштовхування

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

git filter-branch --index-filter 'git rm --cached <file>' HEAD

Але я рекомендую вам використовувати цю команду обережно. Детальніше читайте на відділенні git-filter (1) Сторінка посібника .


125

Є два основні сценарії

Ви ще не натиснули комісію

Якщо проблемою були додаткові файли, якими ви скористалися (а ви не хочете, щоб вони були у сховищі), ви можете їх видалити за допомогою, git rmа потім зв’язати з--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

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

Ви вже підштовхнули комітет

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

Натомість ви повинні виконувати фіксацію без --amend(пам’ятайте це про -amend`: цей параметр переписує історію останнього комітету).


125

Щоб скинути попередню версію, назавжди видаливши всі невідомі зміни:

git reset --hard HEAD~1

23
Можливо, ви могли б на замітку / попередження про те, що його команда викине команду та зміни в робочому каталозі, не вимагаючи більше.
cr7pt0gr4ph7

6
Якщо ви це зробите випадково, все ж не все втрачено. Дивіться stackoverflow.com/questions/10099258/… , stackoverflow.com/questions/15479501/… та stackoverflow.com/questions/7374069/undo-git-reset-hard/7376959 .
cr7pt0gr4ph7

13
Використовуйте --softдля збереження змін як для того uncommitted changes, --hardщоб повністю зняти зобов’язання і повернути їх назад. Не забудьте робити такі операції лише на змінах, які ще не натиснуті.
Юнус Недім Мехель

@Zaz: Ти маєш рацію; можливо, я мав би це уточнити. Можливо, можна відновити лише ті файли / зміни, які були додані до індексу (/ поетапно) або були зроблені. Незафіксовані, unstaged зміни є , як ви сказали, повністю відкинуті git reset --hard.
cr7pt0gr4ph7

1
Як сторонне позначення: Щоразу, коли файл ставиться, він gitзберігає його вміст у його об'єктній базі даних. Збережений вміст видаляється лише під час збору сміття. Тому можливо відновити останню поетапну версію файлу, яка наразі не була встановлена ​​під час git reset --hardвиконання (див. Посилання, пов’язані вище, для отримання додаткової інформації).
cr7pt0gr4ph7
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.