MyTetra Share
Делитесь знаниями!
Визуальное объяснение Hard Reset и Soft Reset в Git
Время создания: 09.02.2024 14:58
Текстовые метки: git, hard, soft, reset, хард, софт, объяснение, понимание, отмена, коммит
Раздел: Компьютер - Программирование - Системы контроля версий (VCS) - Git
Запись: xintrea/mytetra_syncro/master/base/17074798823jf3c68yo0/text.html на raw.github.com

Soft reset


Soft reset перемещает HEAD к указанному коммиту (или индексу коммита относительно конца ветки), не избавляясь от изменений, которые были внесены в коммиты позже. Что это значит на практике?


Вот исходное положение:





На этой иллюстрации предполагается, что:



  • Имеется коммит 035cc, в котором создавался файл index.js
  • Имеется коммит 9e78i, в котором создавался файл style.css



Что произойдет, если через Soft Reset "отменить" эти два коммита?



git reset --soft HEAD~2



Ответ: поизойдет только перемещение указателя HEAD на коммит ec5be. А все изменения файлов, производимые в коммитах 035cc и 9e78i, включая создание файлов index.js и style.css, останутся в рабочей директории. То есть, произойдет откат до коммита ec5be, но все изменения, производимые в откаченных коммитов, превратятся в незафиксированные изменения в рабочей директории.


Другими словами, произойдет не просто откат до состояния ec5be, а такой откат, как если бы программист после коммита ec5be сделал бы изменения, соответсвующие коммитам 035cc и 9e78i, но не закоммитил их. То есть, рабочая директория будет находиться в незакоммиченном состоянии. Об этом часто забывают написать в документации.


Вот что будет после команды софт-ресета:





Если далее закоммитить изменения, то начнет формироваться новое ответвление после коммита ec5be.



Hard reset


Иногда мы не хотим сохранять изменения, внесенные некоторыми коммитами. Git должен просто сбросить свое состояние обратно туда, где он был в указанном коммите. Это можно сделать с помощью команды hard-ресета.



git reset --hard HEAD~2



В результате рабочая директория Git окажется в следующем состоянии:





Git отменил изменения, которые были внесены в 9e78i и 035cc, и сбросил свое состояние до того, где он был при коммите ec5be.


* * *


Внимание! Можно сделать так, чтобы отмененные коммиты не исчезали "в небытие", а были оформлены в виде отдельной ветки. Как это сделать, написано в статье Не бойся хардресета! Он твой друг и помощник.


Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования