В чем разница между git reset --hard HEAD ~ 1 'и' git reset --soft HEAD ~ 1 '?

Я попытался отменить фиксацию в git. Опасно ли использовать git reset --hard HEAD~1?

В чем разница между различными параметрами для git reset?

Есть ли другой способ отменить фиксацию Sourcetree Gui?

Ответ 1

git reset знает пять "режимов": мягкий, смешанный, жесткий, объединить и сохранить. Я начну с первых трех, так как с этими режимами вы обычно сталкиваетесь. После этого вы найдете небольшой бонус, так что следите за обновлениями.

мягкий

При использовании git reset --soft HEAD~1 вы git reset --soft HEAD~1 последний коммит, но изменения файла останутся в вашем рабочем дереве. Также изменения останутся в вашем индексе, поэтому выполнение git commit создаст коммит с теми же изменениями, что и ранее удаленный.

смешанный

Это режим по умолчанию и очень похож на мягкий. При "удалении" коммита с помощью git reset HEAD~1 вы все равно сохраните изменения в рабочем дереве, но не в индексе; так что если вы хотите "повторить" фиксацию, вам нужно будет добавить изменения (git add) перед фиксацией.

жесткий

При использовании git reset --hard HEAD~1 вы потеряете все незафиксированные изменения в дополнение к изменениям, внесенным в последний коммит. Изменения не останутся в вашем рабочем дереве, поэтому выполнение команды git status скажет вам, что в вашем хранилище нет никаких изменений.

Проходите осторожно с этим. Если вы случайно удалили незафиксированные изменения, которые никогда не были зафиксированы, вы не сможете вернуть их с помощью git.

бонус

держать

git reset --keep HEAD~1 интересный и полезный. Он только сбрасывает файлы, которые отличаются между текущим HEAD и данным коммитом. Он отменяет сброс, если кто-либо из этих файлов имеет незафиксированные изменения. Это в основном действует как более безопасная версия hard.

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


Вы можете прочитать больше об этом в документации по git reset.

Заметка
Когда выполняется git reset для удаления коммита, коммит на самом деле не теряется, просто нет ссылки, указывающей на него или любого из его потомков. Вы все еще можете восстановить коммит, который был "удален" с помощью git reset, найдя его ключ SHA-1, например, с помощью команды, такой как git reflog.

Ответ 2

Это полезная статья, в которой графически показано объяснение команды reset.

http://git-scm.com/blog/2011/07/11/reset.html

Reset -hard может быть довольно опасным, поскольку он перезаписывает вашу рабочую копию без проверки, поэтому, если вы еще не выполнили файл, он исчез.

Что касается исходного дерева, я не знаю, как его отменить. Скорее всего, он будет использовать reset под обложками в любом случае

Ответ 3

Git reset имеет 5 основных режимов: мягкий, смешанный, объединенный, жесткий, сохранить. Разница между ними заключается в изменении или не изменении главы, этапа (индекса), рабочего каталога.

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

Иными словами, если вы хотите отменить свою фиксацию, --soft должно быть достаточно хорошим. Но после этого у вас все еще есть изменения от плохого фиксации в вашем индексе и рабочем каталоге. Вы можете изменять файлы, исправлять их, добавлять их в индекс и совершать снова.

С помощью --hard вы полностью получите чистый список в своем проекте. Как будто никаких изменений от последнего фиксации не произошло. Если вы уверены, что это то, что вам нужно, тогда двигайтесь вперед. Но как только вы это сделаете, вы полностью потеряете свою последнюю фиксацию. (Примечание: все еще есть способы восстановить потерянную фиксацию).

Ответ 4

Это основное различие между использованием git reset --hard и git reset --soft:

--soft

Не затрагивает индексный файл или рабочее дерево (но сбрасывает заголовок, как это делают все режимы). Это оставляет все ваши измененные файлы "Изменениями, которые нужно зафиксировать", как это будет указано в git status.

--hard

Сбрасывает индекс и рабочее дерево. Любые изменения отслеживаемых файлов в рабочем дереве, так как отбрасываются.