Git отменил незафиксированные изменения после оформления заказа
Насколько я знаю git checkout
не позволяет нам извлекать ветку, пока мы не зафиксируем все предыдущие изменения, но мои изменения были отменены.
Я казнил git status
команда, и он показал мне список измененных файлов. Затем я выполнил git checkout .
(точка), но она не побудила меня сначала зафиксировать мои предыдущие изменения, отменила все мои изменения и извлекла основную ветку на моей локальной машине.
Может кто-нибудь, пожалуйста, направьте меня, почему git checkout .
вел себя таким образом? И как я могу вернуться к своему предыдущему коду на моей локальной машине (с измененными и незафиксированными изменениями)? Почему он отменил мои изменения?
2 ответа
К несчастью, git checkout
это команда, которая имеет несколько очень разных значений, и это вызвало вашу проблему: с помощью checkout вы можете переключать ветки, создавать ветки, обновлять файлы вашего рабочего каталога определенной версией или HEAD ветки.
Когда вы делаете: git checkout <branchname>
, вы просите git переключить ветку, чтобы он предупреждал вас о незафиксированных изменениях, которые вы можете удалить, спрятать или зафиксировать.
Когда вы делаете: git checkout <pathname>
, вы просите git обновить ваши файлы с версией, поэтому вы просите git переопределить возможные модификации с тем, что уже находится в репозитории; это то, что сделал мерзавец.
Надеюсь, это поможет. Извините за ваши отклоненные изменения. Именно здесь важна простота пользовательского интерфейса.
Вот дополнительная информация, чтобы дополнить ответ Кристофа и помочь понять, что git checkout
делает:
git-checkout
- Оформить ветку или пути к рабочему дереву
ветка
git checkout <branch>
используется для переключения веток путем обновления индекса и файлов в рабочем дереве и указания HEAD на указанную ветвь.
Любые изменения в файлах в рабочем дереве сохраняются, чтобы впоследствии их можно было зафиксировать в <branch>
,
pathspec
git checkout <pathspec>
обновляет файлы при работе с версиями из индекса (промежуточной области), а не из другой ветки.
Со страницы руководства:
git checkout [-p|--patch] [<tree-ish>] [--] <pathspec>...
когда
<paths>
или же--patch
дано,git checkout
не переключает ветки. Он обновляет именованные пути в рабочем дереве из файла индекса или из именованного<tree-ish>
(чаще всего коммит).
Если изменения в файле были добавлены в индекс (он же промежуточная область) с помощью git add
, их изменения не были бы потеряны git checkout .
так как эта команда использует изменения, хранящиеся в index
обновить указанные пути.
Эта команда может быть полезна, если внесенные вами изменения были случайными, например, если вы удалили каталог в своем рабочем каталоге, а затем поняли, что вам действительно нужно его сохранить, запустив git checkout <dirname>
восстановит все (отслеженные) файлы в этом каталоге из индекса.
Жаль только, что он не предупреждает пользователя, когда обновляет файлы и каталоги, необратимо отказываясь от любых изменений.