В чем разница между git reset --mixed, --soft и --hard?



Я ищу, чтобы разделить фиксацию и не уверен, какой вариант сброса использовать.



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



также использовать --mixed и --soft посмотрите то же самое для меня в этом ответе (когда вы хотите исправить и возобновить.) Может кто-то сломать его еще больше? Я понимаю --mixed is вероятно, вариант пойти с, но я хочу знать почему. Наконец, как насчет --hard?



может ли кто-нибудь дать мне пример рабочего процесса, как выбрать 3 варианта?

791   10  

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, а также любые незафиксированные изменения, которые у вас есть, будут удалены, и файлы в вашей рабочей копии будут соответствовать commit B. Так вы можете навсегда потерять изменения таким образом, вы всегда должны работать git status перед выполнением жесткого сброса, чтобы убедиться, что ваш рабочий каталог чист или что вы в порядке с потерей ваши незафиксированные изменения.


и, наконец, визуализация: enter image description here

имейте в виду, что это упрощенное объяснение предназначено в качестве первого шага в стремлении понять эту сложную функциональность.

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


для тех, кто использует терминал с включенным цветом (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, вам придется повторно добавить файл(ы) из Не Версионные Файлы список.

в этих случаях мне нравится визуальный, который, надеюсь, может объяснить это:

git reset --[hard/mixed/soft]:

enter image description here

Так что каждый эффект разные области

  1. Hard = > WorkingDir + Index + HEAD
  2. Mixed = > Index + HEAD
  3. Soft = > только голова (индекс и рабочий реж без изменений).

короткий ответ, в каком контексте используются 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

    Ничего не найдено.