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


744

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

 git status

 # On branch master
 # Changed but not updated:
 #   (use "git add <file>..." to update what will be committed)
 #   (use "git checkout -- <file>..." to discard changes in working directory)
 #
 #  modified:   README
 #
 no changes added to commit (use "git add" and/or "git commit -a")


 git add README

 git commit -a -m 'To add new line to readme'

Я не натискав код на github. Тепер я хочу скасувати цю фіксацію.

Для цього я використав

   git reset --hard HEAD~1

Але я втратив щойно доданий рядок " це для моєї тестової лінії " з файлу README. Цього не повинно статися. Мені потрібен вміст, щоб бути там. Чи є спосіб зберегти вміст і скасувати місцеве зобов’язання?


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

1
NB: Можливо, варто згадати, що це git-commitможе перервати, якщо ви залишите повідомлення порожнім, тож якщо ви фактично не закінчили зобов’язання, яке може бути корисним.
GKFX

Відповіді:


1420

Просто використовуйте git resetбез --hardпрапора:

git reset HEAD~1

PS: У системах на базі Unix можна використовувати HEAD^рівний HEAD~1. У Windows HEAD^не працюватиме, оскільки ^сигналізує про продовження лінії. Тож ваш командний рядок просто запитає вас More?.


13
До речі, це називається --mixed в посібнику .
Джош Лі

10
Новіші версії Git навіть дозволяють використовувати їх @^як скорочення HEAD^.
Корактор

Я не знаю, що це робило, але в моєму списку змін з’являється багато файлів, файлів, яких я не торкався
ПВР

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

1
чи можна скинути всі комісії з одного боку?
Веб-жінка

185

Використовувати --softзамість --hardпрапора:

git reset --soft HEAD^

18
чи можете ви пояснити різницю між двома прапорами?
Джон Джотта

1
Якщо ви відкриєте консоль диспетчера пакунків і запустите цей "git reset --soft HEAD ^", він робить все, що вам потрібно (і що мені потрібно).
Девід Корнелсон

54
@JohnGiotta - git reset --soft HEAD^видалить останню локальну (невдалену) команду, але збереже зміни, які ви зробили
fider

@fider Спаситель! Не впевнений, чи прийнята відповідь все-таки працює, але це повинна бути точна відповідь, необхідна ОП.
Бабу

git reset --soft HEAD~на windows
Jack0fshad0ws

34

Якщо ви перебуваєте в середині комісії (тобто у вашому редакторі), ви можете скасувати її, видаливши всі рядки вище першого #. Це скасує комісію.

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

Це повинно виглядати так.

Потім ви отримаєте повідомлення, яке говорить Aborting commit due to empty commit message..

Редагувати :

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

Щоб видалити всі рядки в vim (якщо це ваш редактор за замовчуванням), після редагування введіть, ggщоб перейти до першого рядка, а потім dGвидалити всі рядки. Нарешті, напишіть і закрийте файл, wqі ваша комісія буде скасована.


3
Це саме те , що я шукав! Ця відповідь потребує більшої кількості результатів :)
jdunk

FYI, це також спрацьовує, якщо ви намагаєтесь перерватиrebase -i mybranchname
inostia

18

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

Використовуйте git logдля показу поточних повідомлень про фіксацію, а потім знайдіть commit_id попереднє зобов’язання, яке ви хочете видалити, а не зобов'язання, яке ви хочете видалити.

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

git reset --soft commit_id

Якщо ви хочете видалити всі локально змінені файли та повідомлення про фіксацію:

git reset --hard commit_id

Ось в чому різниця м’якої і твердої


1
Я думаю, що це навпаки.
Ruff9

9

Ви можете сказати Git, що робити з вашим індексом (набором файлів, які стануть наступною комісією) та робочим каталогом при виконанні скидання git, використовуючи один з параметрів:

--soft: Тільки комісії будуть скинуті, тоді як Index та робочий каталог не будуть змінені.

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

--hard: Він скидає все (виконує, індекс, робочий каталог), щоб відповідати HEAD.

У вашому випадку я б скористався git reset --softвашими зміненими змінами в індексі та робочому каталозі. Не забудьте перевірити це для більш детального пояснення.


1

Використовуйте команду нижче:

$ git reset HEAD~1

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

Unstaged changes after reset:
M   application/config/config.php
M   application/config/database.php
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.