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> восстановит все (отслеженные) файлы в этом каталоге из индекса.

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

Другие вопросы по тегам