«Сброс» - это способ отмены изменений локально. При фиксации вы сначала выбираете изменения для включения в « git add » - это называется «подготовка». И после внесения изменений вы " git commit " их.
Чтобы отступить от постановки или коммита, вы «сбрасываете» ГОЛОВУ. В ветке HEAD - это переменная git, которая указывает на самый последний коммит. Так что, если вы поставили, но не сделали коммит, вы " git reset HEAD ." Это подкрепляет текущий заголовок, снимая изменения со сцены. Это сокращение от " git reset - смешанный заголовок ~ 0 ."
Если вы уже зафиксировали, значит, HEAD уже продвинулся, поэтому вам нужно выполнить резервное копирование к предыдущей фиксации. Здесь вы можете " сбросить HEAD ~ 1 " или " сбросить HEAD ^ 1 " или " сбросить HEAD ~ " или " сбросить HEAD ^"- все ссылки на ГОЛОВУ минус один.
Какой символ лучше, ~ или ^? Думайте о тильде как о одном потоке - когда каждый коммит имеет одного родителя и это просто последовательность изменений в последовательности, вы можете ссылаться на поток обратно, используя тильду, как HEAD ~ 1 , HEAD ~ 2, HEAD ~ 3, для родителя, прародителя, прадеда и т. Д. (Технически он находит первого родителя в более ранних поколениях).
Когда происходит слияние, коммиты имеют более одного родителя. Вот когда в игру вступает ^ каретка - вы можете помнить, потому что она показывает, как ветви собираются вместе. С помощью каретки HEAD ^ 1 будет первым родителем, а HEAD ^ 2 будет вторым родителем одного коммита - например, мать и отец.
Так что, если вы просто возвращаетесь на один прыжок для фиксации с одним родителем, то HEAD ~ и HEAD ^ эквивалентны - вы можете использовать любой из них.
Кроме того, сброс может быть - мягкий , - смешанный или - жесткий . Мягкий сброс просто возвращает коммит - он сбрасывает HEAD, но не извлекает файлы из предыдущего коммита, поэтому все изменения в рабочем каталоге сохраняются. И - мягкий сброс даже не очищает сцену (также известный как index ), поэтому все файлы, которые были размещены, все еще будут на сцене.
A - смешанный сброс (по умолчанию) также не извлекает файлы из предыдущей фиксации, поэтому все изменения сохраняются, но этап очищается. Вот почему простой « git reset HEAD » уберется со сцены.
A - жесткий сброс сбрасывает ГОЛОВУ, очищает сцену, но также проверяет все файлы из предыдущего коммита и перезаписывает любые изменения.
Если вы отправили коммит в удаленный репозиторий, то reset работает не так хорошо. Вы можете выполнить сброс локально, но когда вы попытаетесь передать на удаленный компьютер, git увидит, что ваш локальный заголовок находится за заголовком в удаленной ветви, и откажется от отправки. Вы можете быть в состоянии форсировать толчок, но Git на самом деле не любит это делать.
В качестве альтернативы, вы можете хранить свои изменения, если хотите сохранить их, проверить предыдущий коммит, отменить сохранение изменений, подготовить их, создать новый коммит и затем нажмите это.