В чем разница между git reset --mixed, --soft и --hard?
Я ищу, чтобы разделить фиксацию и не уверен, какой вариант сброса использовать.
Я смотрел на страницу Можете ли вы объяснить, что "git reset" делает на простом английском языке? но я понял, что на самом деле не понимаю, что такое индекс git или промежуточная область, и поэтому объяснения не помогли.
также использовать --mixed и --soft посмотрите то же самое для меня в этом ответе (когда вы хотите исправить и возобновить.) Может кто-то сломать его еще больше? Я понимаю --mixed is вероятно, вариант пойти с, но я хочу знать почему. Наконец, как насчет --hard?
может ли кто-нибудь дать мне пример рабочего процесса, как выбрать 3 варианта?
10 ответов:
при изменении файла в репозитории это изменение изначально не выгружается. Чтобы зафиксировать его, вы должны поместить его-то есть добавить его в индекс-используя
git add. При фиксации фиксируются только те изменения, которые были добавлены в индекс.
git resetизменения, как минимум, где текущая ветвь (HEAD) указывает. Разница между--mixedи--softявляется ли ваш индекс также изменен. Так что, если мы на веткеmasterс этой серией коммитов:- A - B - C (master)
HEADуказывает наCи индекс соответствуетC.когда мы запускаем
git reset --soft B,master(и таким образомHEAD), на который указываетB, но индекс все еще имеет изменения отC;git statusпокажет их как поставленные. Так что если мы бежимgit commitна этом этапе мы получим новый коммит с теми же изменениями, что иC.
Итак, начиная отсюда снова:
- A - B - C (master)теперь давайте делай
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, а также любые незафиксированные изменения, которые у вас есть, будут удалены, и файлы в вашей рабочей копии будут соответствовать commitB. Так вы можете навсегда потерять изменения таким образом, вы всегда должны работатьgit statusперед выполнением жесткого сброса, чтобы убедиться, что ваш рабочий каталог чист или что вы в порядке с потерей ваши незафиксированные изменения.
и, наконец, визуализация:
имейте в виду, что это упрощенное объяснение предназначено в качестве первого шага в стремлении понять эту сложную функциональность.
может быть полезно для визуальных учащихся, которые хотят визуализировать, как выглядит их состояние проекта после каждой из этих команд:
для тех, кто использует терминал с включенным цветом (git config --глобальный цвет.ui auto):
git reset --soft Aи вы увидите материал B и C в зеленом цвете (поставленный и готовый совершить)
git reset --mixed A(илиgit reset A) и вы увидите материал B и C в красном цвете (неустановленный и готовый к постановке (зеленый), а затем зафиксированный)
git reset --hard Aи вы больше не увидите изменений B и C нигде (будет так, как если бы они никогда не существовали)
или для тех, кто использует программу GUI, как "башня" или "SourceTree"
git reset --soft Aи вы увидите материал B и C в области "staged files", готовый к фиксации
git reset --mixed A(илиgit reset A) и вы увидите материал B и C в области "unstaged files", готовый к перемещению в staged, а затем зафиксированный
git reset --hard Aи вы больше не увидите изменений B и C нигде (будет так, как если бы они никогда не существовали)
в самых простых выражениях:
--soft:uncommit изменения, изменения остаются поэтапными (индекс).--mixed(по умолчанию):исправить + убрать из буфера изменения, изменения остается в рабочее дерево.--hard:исправить + убрать из буфера + удалить изменения, ничего не осталось.
вот основное объяснение для пользователей TortoiseGit:
git reset --softи--mixedоставляйте ваши файлы нетронутыми.
git reset --hardна самом деле изменить ваши файлы чтобы соответствовать фиксации, к которой вы сбрасываете.в TortoiseGit, понятие индекс очень скрыт графическим интерфейсом. Когда вы изменяете файл, вам не нужно запускать
git addчтобы добавить изменения в промежуточную область / Индекс. Когда просто иметь дело с модификациями существующие файлы, которые не изменяют имена файлов,git reset --softи--mixedтакие же! Вы заметите разницу только в том случае, если вы добавили новые файлы или переименовали файлы. В этом случае, если вы запустите git reset --mixed, вам придется повторно добавить файл(ы) из Не Версионные Файлы список.
короткий ответ, в каком контексте используются 3 варианта:
до сохранить текущие изменения в коде но переписать историю фиксации:
soft: вы можете зафиксировать все сразу и создать новую фиксацию с новым описанием (если вы используете torotise git или любые другие графические интерфейсы, это тот, который нужно использовать, так как вы все еще можете отметить, какие файлы вы хотите в фиксации и сделать несколько фиксаций таким образом с разными файлами. В программа все файлы будут размещены для фиксации.)mixed: вам придется заново добавить отдельные файлы в индекс, прежде чем вы делаете коммиты (в программа все измененные файлы будут проиндексированы)на самом деле потерять ваши изменения в коде, а также:
hard: вы не просто переписываете историю, но и теряете все свои изменения до момента сброса
прежде чем перейти к этим трем вариантам, нужно понять 3 вещи.
1) история / голова
2) стадия/индекс
3) рабочий каталог
сброс -- soft: история изменена, голова изменена, рабочий каталог не изменяется.
сброс --смешанные : история, изменились, причем изменились, рабочая директория изменена с Данные проиндексированы.
сброс --жесткий: история изменилась, голова изменилась, рабочий каталог изменен с потерянным данные.
всегда безопасно идти с Git -- soft. Один должен использовать другой вариант в сложном требовании.
--soft: говорит Git сбросить голову на другой фиксации, так что индекс и рабочий каталог не будет изменен в любом случае. Все файлы, измененные между исходным заголовком и фиксацией, будут поэтапными.
--mixed: Так же, как мягкий, это сбросит голову на другой фиксации. Он также сбросит индекс, чтобы соответствовать ему, пока рабочий каталог не будет затронут. Все изменения останутся в рабочем каталоге и будут отображаться как измененные, но нет поэтапный.
--hard: это сбрасывает все - он сбрасывает голову назад к другой фиксации, сбрасывает индекс, чтобы соответствовать ему, и сбрасывает рабочий каталог, чтобы соответствовать ему, а также.основное различие между
--mixedи--softявляется ли ваш индекс также изменен. Проверьте больше об этом здесь.
основная разница между различными вариантами команды сброса git, как показано ниже.
- --soft: только сбрасывает головку на выбранную фиксацию. Работает в основном так же, как git checkout, но не создает обособленное состояние головы.
- --mixed (опция по умолчанию): сброс заголовка к фиксации, выбранной в истории, и отмена изменений в индексе.
- --hard: сбрасывает головку на фиксацию, которую вы выбрали в истории, отменяет изменения в индексе и отменяет изменения в вашем рабочем каталоге.
ответ мкарасека велик, в простых терминах мы можем сказать...
git reset --soft: установитьHEADк предполагаемой фиксации, но сохраняйте свои изменения, сделанные из последних коммитовgit reset --mixed: это же какgit reset --softно единственное отличие-это un stage ваши изменения от последних коммитовgit reset --hard: установитьHEADв фиксации вы указываете и сбрасываете все свои изменения с последних фиксаций, включая не зафиксированные изменения.


Comments