Я спробував скасувати свій коміт у git. Чи небезпечно використовувати git reset --hard HEAD~1
?
У чому різниця між різними варіантами git reset
?
Відповіді:
git reset
знає п’ять «режимів»: м’який, змішаний, жорсткий, злиття та збереження. Я почну з перших трьох, оскільки саме такі режими ви зазвичай зустрічаєте. Після цього ви знайдете приємний маленький бонус, тому стежте за оновленнями.
Під час використання git reset --soft HEAD~1
ви видалите останню фіксацію з поточної гілки, але зміни у файлі залишатимуться у вашому робочому дереві . Крім того, зміни залишатимуться у вашому індексі, тому наступні дії з а git commit
створить коміт із точно такими ж змінами, як і коміт, який ви "видаляли" раніше.
Це режим за замовчуванням і дуже схожий на м’який. При "видаленні" коміту з git reset HEAD~1
вами ви все одно збережете зміни у вашому робочому дереві, але не в індексі; так що якщо ви хочете "повторити" git add
коміт , вам доведеться додати зміни ( ) перед комітуванням.
Під час використання git reset --hard HEAD~1
ви втратите всі незавершені зміни на додаток до змін, введених в останньому коміті. Зміни не залишаться у вашому робочому дереві, тому виконання git status
команди покаже вам, що у вас немає змін у вашому сховищі.
Ступайте обережно цим. Якщо ви випадково видалите незавершені зміни, які ніколи не відстежувались git
(говоріть: здійснено або принаймні додано до індексу), у вас немає можливості повернути їх назад git
.
git reset --keep HEAD~1
є цікавим та корисним. Він скидає лише ті файли, які відрізняються між поточним HEAD
та даним комітом. Це скасовує скидання, якщо хтось із цих файлів має незавершені зміни. Це в основному діє як безпечніша версія hard
.
Цей режим особливо корисний, коли у вас є купа змін і ви хочете перейти на іншу гілку, не втрачаючи ці зміни - наприклад, коли ви почали працювати над неправильною гілкою.
Ви можете прочитати більше про це в документації до git reset .
Примітка.
Виконуючи git reset
видалення коміту, коміт насправді не втрачений, просто немає посилання, що вказує на нього або будь-яке з його дочірніх елементів. Ви все ще можете відновити коміт, який було "видалено" git reset
, знайшовши його ключ SHA-1, наприклад за допомогою такої команди, як git reflog
.
--hard
майже ніколи не є правильним, оскільки --keep
це набагато безпечніше і стосується більшості сенаторів, де --hard
працює. Навчання пальців користуванню --keep
може вас врятувати, одного дня ...
keep
. ;)
Git reset має 5 основних режимів: м’який, змішаний, об’єднаний, жорсткий, тримати . Різниця між ними полягає в тому, щоб змінити чи не змінити голову, етап (індекс), робочий каталог .
Git reset --hard змінить заголовок, індекс та робочий каталог.
Git reset --soft змінить лише головку. Без змін індексу, робочого каталогу.
Отже, іншими словами, якщо ви хочете скасувати фіксацію, --soft повинен бути достатньо хорошим. Але після цього у вас все ще залишаються зміни від поганого коміту у вашому індексі та робочому каталозі. Ви можете змінювати файли, виправляти їх, додавати їх до індексу та знову фіксувати.
За допомогою --hard ви повністю отримуєте чистий аркуш у своєму проекті. Наче з останнього коміту не відбулося жодних змін. Якщо ви впевнені, що це те, що ви хочете, рухайтеся вперед. Але як тільки ви зробите це, ви повністю втратите останню коміту. (Примітка: є ще способи відновити втрачений коміт).
Це корисна стаття, яка наочно демонструє пояснення команди скидання.
https://git-scm.com/docs/git-reset
Скинути - жорсткий може бути досить небезпечним, оскільки він перезаписує вашу робочу копію без перевірки, тому, якщо ви взагалі не зафіксували файл, його немає.
Що стосується дерева джерел, то я не знаю, як скасувати коміти. Швидше за все, він все одно використовував би скидання під ковдрами
git reset --help
що цілком добре пояснює (на мій погляд) п’ять режимів або, принаймні, два режими, задані ОП.
Це основна різниця між use git reset --hard та git reset --soft:
--soft
Не торкається файлу індексу або робочого дерева взагалі (але скидає головку до, як і всі режими). Це залишає всі ваші змінені файли "Зміни, які потрібно здійснити", як висловлюється git status.
--hard
Скидає індекс і робоче дерево. Будь-які зміни до відстежуваних файлів у робочому дереві відкидаються.