Я ищу разделить коммит и не уверен, какой вариант сброса использовать.
Я искал страницу На простом английском языке, что делает "git reset"? , но я понял, что не совсем понимаю, что такое индекс git или область подготовки, и поэтому объяснения не помогли.
Кроме того, варианты использования для --mixed
и --soft
выглядят одинаково для меня в этом ответе (когда вы хотите исправить и подтвердить). Может кто-нибудь сломать это еще больше? Я понимаю, --mixed
что, возможно, это вариант, но я хочу знать, почему . И наконец, как насчет --hard
?
Может ли кто-нибудь дать мне пример рабочего процесса, как будет происходить выбор 3-х вариантов?
git
version-control
Майкл Чинен
источник
источник
soft: stage everything
,mixed: unstage everything
,hard: ignore everything
до фиксации я сбросить с.David Zych
с четким объяснением - davidzych.com/difference-between-git-reset-soft-mixed-and-hardОтветы:
Когда вы изменяете файл в своем хранилище, это изменение изначально не является этапным. Чтобы зафиксировать это, вы должны поставить его, то есть добавить в индекс, используя
git add
. Когда вы делаете фиксацию, это те изменения, которые были добавлены в индекс.git reset
меняет, как минимум, текущую ветку (HEAD
). Разница между--mixed
и--soft
заключается в том, изменен или нет ваш индекс. Итак, если мы находимся на веткеmaster
с этой серией коммитов:HEAD
указывает наC
и индекс совпадаетC
.Когда мы запускаем
git reset --soft B
,master
(и, таким образомHEAD
) теперь указывает наB
, но индекс все еще имеет изменения отC
;git status
покажет их как постановочные. Поэтому, если мы запустимgit commit
этот момент, мы получим новый коммит с теми же изменениями, что иC
.Итак, начиная с этого снова:
Теперь давайте сделаем
git reset --mixed B
. (Примечание:--mixed
это опция по умолчанию). Еще раз,master
иHEAD
укажите на B, но на этот раз индекс также изменяется, чтобы соответствоватьB
. Если мы запустимgit commit
в этот момент, ничего не произойдет, так как индекс совпадаетHEAD
. У нас все еще есть изменения в рабочем каталоге, но, поскольку они отсутствуют в индексе, ониgit status
отображаются как неперехваченные. Чтобы совершить их, вы бы,git add
а затем совершить как обычно.И, наконец,
--hard
то же самое, что и--mixed
(он изменяет вашHEAD
индекс и индекс), за исключением того, что он--hard
также изменяет ваш рабочий каталог. Если мы находимсяC
и работаемgit reset --hard B
, то добавленные измененияC
, а также любые незафиксированные изменения будут удалены, и файлы в вашей рабочей копии будут соответствовать коммитуB
. Так как вы можете навсегда потерять изменения таким образом, вы должны всегда запускатьсяgit status
перед выполнением аппаратного сброса, чтобы убедиться, что ваш рабочий каталог чист, или что вы в порядке потери ваших незафиксированных изменений.И, наконец, визуализация:
источник
reset --hard
, исчезли навсегда.--mixed
изменяет ваш индекс, но не рабочий каталог, поэтому любые локальные изменения не затрагиваются.- A - B - C′
, где C 'содержит те же изменения, что и C (с другой отметкой времени и, возможно, сообщением о фиксации). 2 и 4 оставят вас- A - D
, где D содержит объединенные изменения B и C.Проще говоря:
--soft
: незафиксированные изменения, изменения оставляются поэтапными ( индекс ).--mixed
(по умолчанию) : uncommit + unstage изменения, изменения остаются в рабочем дереве .--hard
: uncommit + unstage + удалить изменения, ничего не осталось.источник
Пожалуйста, имейте в виду, что это упрощенное объяснение, предназначенное в качестве первого шага в попытке понять эту сложную функциональность.
Может быть полезно для визуальных учеников, которые хотят визуализировать состояние своего проекта после каждой из следующих команд:
Для тех, кто использует Терминал с включенным цветом (git config --global color.ui auto):
git reset --soft A
и вы увидите вещи B и C в зеленом цвете (поставленные и готовые к фиксации)git reset --mixed A
(илиgit reset A
), и вы увидите вещи B и C в красном (не подготовленные и готовые к постановке (зеленые), а затем зафиксированные)git reset --hard A
и вы больше нигде не увидите изменений B и C (как если бы они никогда не существовали)Или для тех, кто использует программу с графическим интерфейсом, как «Башня» или «SourceTree»
git reset --soft A
и вы увидите вещи B и C в области 'готовые файлы', готовые к фиксацииgit reset --mixed A
(илиgit reset A
), и вы увидите вещи B и C в области 'unstaged files', готовые для перемещения в промежуточную, а затем зафиксированныеgit reset --hard A
и вы больше нигде не увидите изменений B и C (как если бы они никогда не существовали)источник
git reset
только меняет внешний видgit status
вывода России.Все остальные ответы велики, но я считаю , что лучше понять их, разбивая файлы на три категории:
unstaged
,staged
,commit
:--hard
должно быть легко понять, он восстанавливает все--mixed
(по умолчанию) :unstaged
файлы: не меняютсяstaged
файлы: перейти кunstaged
commit
файлы: перейти кunstaged
--soft
:unstaged
файлы: не меняютсяstaged
файлы: не меняйтеcommit
файлы: перейти кstaged
В итоге:
--soft
опция переместит все (кромеunstaged
файлов) вstaging area
--mixed
опция переместит все вunstaged area
источник
Вот основное объяснение для пользователей TortoiseGit:
git reset --soft
и--mixed
оставьте свои файлы нетронутыми.git reset --hard
на самом деле измените ваши файлы в соответствии с коммитом, который вы сбросилиВ TortoiseGit концепция индекса очень скрыта в графическом интерфейсе. Когда вы изменяете файл, вам не нужно запускать,
git add
чтобы добавить изменение в промежуточную область / индекс. Когда просто имеем дело с изменениями существующих файлов, которые не меняют имена файлов,git reset --soft
а--mixed
совпадают! Вы заметите разницу только в том случае, если добавите новые или переименованные файлы. В этом случае, если вы запустите git reset --mixed, вам придется повторно добавить ваши файлы из списка « Файлы без версий» .источник
--mixed
и--soft
.В этих случаях мне нравится визуал, который, я надеюсь, может объяснить это:
git reset --[hard/mixed/soft]
:Так что у каждого эффекта разные рамки
источник
Три типа сожаления
Многие из существующих ответов, кажется, не отвечают на настоящий вопрос. Они о том, что команды делают, а не о том, что вы (пользователь) хотите - вариант использования . Но об этом спрашивал ОП!
Возможно, было бы более полезно сформулировать описание с точки зрения того, о чем именно вы сожалеете во время подачи
git reset
команды. Допустим, у нас есть это:Вот некоторые возможные сожаления и что с ними делать:
1. Я сожалею, что B, C и D не являются одним коммитом.
git reset --soft A
, Теперь я могу немедленно зафиксировать и сделать все изменения, поскольку А - это один коммит.2. Я сожалею, что B, C и D - это не десять коммитов.
git reset --mixed A
, Фиксация исчезла, и индекс вернулся на А, но рабочая область все еще выглядит так же, как и после D. Так что теперь я могу добавлять и фиксировать в совершенно другой группе.3. Я сожалею, что B, C и D произошли на этой ветви ; Хотелось бы, чтобы я разветвился после А, и они произошли в этой другой ветке.
Сделай новую ветку
otherbranch
, а потомgit reset --hard A
. Текущая ветвь теперь заканчивается в точке А,otherbranch
вытекающей из нее.(Конечно, вы также можете использовать аппаратный сброс, потому что хотите, чтобы B, C и D никогда не случались.)
источник
Вам не нужно заставлять себя помнить различия между ними. Подумайте, как вы на самом деле сделали коммит.
1. Внесите некоторые изменения.
2.git добавить.
3.gc -m "Я сделал что-то"
Soft, Mixed и Hard - это способ, позволяющий вам отказаться от операций, которые вы делали от 3 до 1.
Софт "притворился", что никогда не видел, что ты сделал "gc -m".
Смешанный «сделал вид», чтобы никогда не видеть, что вы сделали «git add».
Тяжело «притворялся», чтобы никогда не видеть, что вы сделали изменения в файле.
источник
Прежде чем перейти к этим трем вариантам, нужно понять 3 вещи.
1) История / ГОЛОВА
2) Стадия / индекс
3) Рабочий каталог
reset --soft: История изменена, HEAD изменен, Рабочий каталог не изменен.
reset --mixed: история изменена, HEAD изменена, рабочая директория изменена с неподготовленными данными.
reset --hard: История изменена, HEAD изменен, Рабочий каталог изменен с потерянными данными.
С Git --soft всегда безопасно. Нужно использовать другой вариант в сложном требовании.
источник
Здесь есть несколько ответов с неправильным представлением о
git reset --soft
. Хотя есть определенное условие, в которомgit reset --soft
будут только изменятьсяHEAD
(начиная с состояния отсоединенной головки), обычно (и для предполагаемого использования), оно перемещает ссылку ветвления, которую вы в настоящее время извлекли. Конечно, он не может этого сделать, если у вас нет проверенной ветки (отсюда и конкретное условие, котороеgit reset --soft
будет меняться толькоHEAD
).Я считаю, что это лучший способ думать
git reset
. Вы не просто двигатьсяHEAD
( все это делает ), вы также перемещение ветви реф , напримерmaster
. Это похоже на то, что происходит, когда вы запускаетеgit commit
(текущая ветвь перемещается вместеHEAD
), за исключением того, что вместо создания (и перехода к) новой фиксации вы переходите к предыдущей фиксации.В этом суть
reset
изменения ветки на нечто иное, чем новый коммит, а не изменениеHEAD
. Вы можете увидеть это в примере документации:Какой смысл в этой серии команд? Вы хотите переместить ветку здесь
master
, поэтому, пока выmaster
проверили, вы бежитеgit reset
.Ответ с наибольшим количеством голосов здесь в целом хорош, но я подумал, что добавлю это, чтобы исправить несколько ответов с ошибочными представлениями.
Измени свою ветку
git reset --soft <ref>
: Сбрасывает указатель филиала в настоящее время извлеченной ветви к совершающему в указанной ссылке,<ref>
. Файлы в вашем рабочем каталоге и индексе не изменены. Фиксация с этого этапа вернет вас туда, где вы были доgit reset
команды.Измените свой индекс тоже
git reset --mixed <ref>
или эквивалентно
git reset <ref>
:Делает то, что
--soft
делает AND, также сбрасывает индекс в соответствии с фиксацией по указанной ссылке. Хотяgit reset --soft HEAD
команда ничего не делает (потому что говорит, что перемещает извлеченную ветвь в извлеченную ветвь)git reset --mixed HEAD
или, что то же самоеgit reset HEAD
, является обычной и полезной командой, поскольку она сбрасывает индекс до состояния вашего последнего коммита.Измените свой рабочий каталог тоже
git reset --hard <ref>
: делает то, что--mixed
делает И также перезаписывает ваш рабочий каталог. Эта команда аналогичнаgit checkout <ref>
, за исключением того, что (и это ключевой моментreset
) все формыgit reset
перемещения, на которыеHEAD
указывает ссылка ref .Примечание о "такая-то команда перемещает ГОЛОВУ":
Бесполезно говорить, что команда перемещает
HEAD
. Любая команда, которая меняет ваше местоположение в истории коммитов, перемещаетHEAD
. Это то, чтоHEAD
есть , указатель на то, где вы находитесь.HEAD
это вы , и поэтому будете двигаться, когда вы делаете.источник
Краткий ответ, в каком контексте используются 3 варианта:
Чтобы сохранить текущие изменения в коде, но переписать историю коммитов:
soft
: Вы можете зафиксировать все сразу и создать новый коммит с новым описанием (если вы используете torotise git или любой другой графический интерфейс, это тот, который нужно использовать, так как вы можете пометить, какие файлы вы хотите в коммите и сделать несколько фиксирует таким образом с различными файлами. В Sourcetree все файлы будут помещены для фиксации.)mixed
: Вам нужно будет снова добавить отдельные файлы в индекс, прежде чем делать коммиты (в Sourcetree все измененные файлы будут неизменными)Чтобы фактически потерять ваши изменения в коде:
hard
: вы не просто переписываете историю, но и теряете все изменения до момента сбросаисточник
Основное различие между различными опциями команды git reset приведено ниже.
источник
--soft
: Говорит Git сбросить HEAD для другого коммита, так что индекс и рабочий каталог никак не будут изменены. Все файлы, измененные между оригинальным HEAD и коммитом, будут размещены.--mixed
: Так же, как софт, это сбросит HEAD к другому коммиту. Он также сбросит индекс, чтобы он соответствовал ему, в то время как рабочий каталог не будет затронут. Все изменения останутся в рабочем каталоге и будут отображаться как измененные, но не поэтапно.--hard
: Это сбрасывает все - он сбрасывает HEAD обратно в другой коммит, сбрасывает индекс, чтобы соответствовать ему, и сбрасывает рабочий каталог, чтобы соответствовать ему.Основное различие между
--mixed
и--soft
заключается в том, изменен или нет ваш индекс. Проверьте больше об этом здесь .источник
Ответ mkarasek велик, простыми словами мы можем сказать ...
git reset --soft
: установитеHEAD
для предполагаемого коммита, но сохраняйте свои изменения с момента последнего коммитаgit reset --mixed
: это то же самое,git reset --soft
но единственное отличие состоит в том, что он не вносит изменения с момента последнего коммитаgit reset --hard
: установите свойHEAD
коммит, который вы указали, и сбросьте все ваши изменения с последних коммитов, включая не зафиксированные изменения.источник