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

Вы можете увидеть пример получения QueryDict для метода PUT в коде django-piston (см. метод coerce_put_post)

642
задан Cœur 10 September 2017 в 04:35
поделиться

1 ответ

Когда вы изменяете файл в своем репозитории, изменение изначально не выполняется. Чтобы зафиксировать его, вы должны обработать его, то есть добавить в индекс, используя git add . Когда вы делаете фиксацию, фиксируются те изменения, которые были добавлены в индекс.

git reset изменяет как минимум то место, куда указывает текущая ветвь ( HEAD ). Разница между - смешанный и - мягкий заключается в том, был ли также изменен ваш индекс. Итак, если мы находимся на ветке 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 . (Примечание: - смешанный - вариант по умолчанию). Еще раз, master и HEAD указывают на B, но на этот раз индекс также изменяется, чтобы соответствовать B . Если на этом этапе мы запустим git commit , ничего не произойдет, поскольку индекс соответствует HEAD .У нас все еще есть изменения в рабочем каталоге, но поскольку их нет в индексе, git status показывает их как неустановленные. Чтобы зафиксировать их, вы должны git add , а затем выполнить фиксацию как обычно.


И, наконец, - сложный такой же, как - смешанный (он изменяет вашу HEAD и индекс), за исключением того, что - hard также изменяет ваш рабочий каталог. Если мы находимся на C и выполняем git reset --hard B , то изменения, добавленные в C , а также любые незафиксированные изменения, которые у вас есть, будут будут удалены, и файлы в вашей рабочей копии будут соответствовать фиксации B . Поскольку таким образом вы можете безвозвратно потерять изменения, вам всегда следует запускать git status перед выполнением аппаратного сброса, чтобы убедиться, что ваш рабочий каталог чист или что вы готовы потерять незафиксированные изменения.


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

1387
ответ дан 22 November 2019 в 21:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: