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

Моя проблема в тому, що я змінив файл, наприклад: 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. Цього не повинно бути. Мені потрібно, щоб контент був там. Чи є спосіб зберегти контент і скасувати мій локальний Комміт?

560
31 янв. заданий Amal Kumar S 31 Січня. 2011-01-31 15:14 '11 о 15:14 2011-01-31 15:14
@ 7 відповідей

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

 git reset HEAD~1 

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

1 085
31 янв. відповідь дан Koraktor 31 Січня. 2011-01-31 15:17 '11 о 15:17 2011-01-31 15:17

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

border=0
 git reset --soft HEAD^ 
143
10 авг. відповідь дан TpED 10 Серпня. 2012-08-10 11:02 '12 о 11:02 2012-08-10 11:02

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

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

2019

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

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

--mixed : це призведе до скидання індексу відповідно до заголовком, при цьому робочий каталог НЕ буде порушено. Всі зміни залишаться в робочому каталозі і з'являться як змінені.

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

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

5
29 мая '18 в 13:22 2018-05-29 13:22 відповідь дан Nesha Zoric 29 травня '18 о 13:22 2018-05-29 13:22

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

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

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

git reset --soft commit_id

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

git reset --hard commit_id

Що різниця м'яка і жорстка

2
02 сент. відповідь дан mistdon 02 сент. 2018-09-02 06:43 '18 в 6:43 2018-09-02 6:43

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

Невстановлені зміни після скидання: M application / config / config.php M application / config / database.php

1
14 мая '18 в 16:25 2018-05-14 16:25 відповідь дан Omkar 14 травня '18 о 16:25 2018-05-14 16:25

Різниця між git reset --mixed, --soft і --hard

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

Давайте візьмемо приклад:

 - A - B - C (master) 

HEAD вказує на C а індекс відповідає C

--soft

  • Коли ми виконуємо git reset --soft B з метою видалення коммітов C і вказівки головного / HEAD на B.
  • Master / HEAD тепер буде вказувати на B, але індекс все ще змінився з C.
  • При виконанні git status ви могли бачити файли, проіндексовані в Ком C, як поетапні.
  • Виконання git commit в цей момент створить новий Комміт з тими ж змінами, що і в C

--mixed

  • Виконати git reset --mixed B
  • При виконанні master / HEAD буде вказувати на B, і індекс також змінюється, щоб відповідати B через використовуваного змішаного прапора.
  • Якщо в цей момент ми запустимо git commit, нічого не станеться, так як індекс відповідає HEAD.
  • У нас все ще є зміни в робочому каталозі, але, оскільки вони відсутні в індексі, стан git показує їх як неперехваченние.
  • Щоб зафіксувати їх, ви повинні git add а потім зафіксувати як зазвичай.

--hard

  • Виконати git reset --hard B
  • При виконанні master / HEAD буде вказувати на B і змінює ваш робочий каталог
  • Зміни, додані в C, і все незафіксовані зміни будуть видалені.
  • Файли в робочій копії будуть відповідати коммітов B, це призведе до втрати всіх змін, які були внесені в комерц C, а також до незафіксованим змін.

Сподіваюся, що порівняння прапорів, доступних для використання з командою git reset , допоможе комусь використовувати їх з розумом. Зверніться до них для отримання додаткової інформації link1 link2

0
18 янв. відповідь дан Keshan Nageswaran 18 Січня. 2019-01-18 19:48 '19 о 19:48 2019-01-18 19:48

Інші питання по мітках або Задайте питання