Почему я получаю ошибку "Untracked files" при запуске git reset --hard HEAD? - PullRequest
0 голосов
/ 24 января 2019

После запуска git reset hard --HARD я запустил git pull и получил следующую ошибку:

User-MacBook-Air:appName User$ git reset --hard HEAD
HEAD is now at d32cc09 initial test
Users-MacBook-Air:appName User$ git pull
Updating d32cc09..35ece16
error: The following untracked working tree files would be overwritten by merge:
        public/appName/js/password-change.js
Please move or remove them before you merge.
Aborting

Разве git reset hard --HARD не должен сбросить все, что я сделал в моей ветке, до того, что было раньше? Если это так, то почему Aborting пытается получить новый код? Я думал, что это вызовет автоматическое внесение изменений, потому что все было сброшено?

Что я могу сделать, чтобы пройти через это?

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Что делать, это именно то, что говорит вам Git: либо совершить public/appName/js/password-change.js, либо убрать его с дороги.

Разве git reset --hard HEAD не должен сбросить все, что я сделал в моей ветке, до того, что было раньше?

Не совсем. Вернее, именно это, но просто это не то, что вы хотите и / или имеете в виду.

Git всегда имеет три"активных" версии каждого отслеживаемого файла. В текущем коммите есть одна копия файла, где он замораживается в той форме, в которой он находился, когда кто-либо делал коммит, делал это. Здесь он также сжимается и сохраняется в форме только для Git, чтобы занимать меньше (может быть, намного меньше) места. Существует вторая копия в месте, которое Git вызывает, по-разному, index , промежуточная область или иногда кеш , в зависимости от о том, кто / какая часть Git выполняет вызов. Индексная копия также находится в форме Git-only, но не совсем заморожена - более слякотная, готовая к замораживанию. Наконец, третья копия - это та, которую вы можете использовать и увидеть: ту, что находится в вашем рабочем дереве, которая имеет свою нормальную форму и, следовательно, вы можете работать с ней или с ней.

Что делает git reset --hard, так это переустанавливает все три копии каждого из этих трех файлов, чтобы они все совпадали с копией в текущем (HEAD) коммите. Ну, это может сделать еще больше, но в этом случае это то, что он делает. Но это не относится к чему-то важному.

Если некоторые файлы отслеживаются , это означает, что другие файлы не отслеживаются . И вот на что Git жалуется: неотслеживаемый файл . Итак: что именно это значит? Что такое отслеживаемый файл?

A отслеживаемый файл - это файл, который в данный момент находится в индексе. Вот и все - это действительно так просто. Файл, который был в коммите, который вы извлекли, попал в индекс из этого коммита и, вероятно, все еще там. Таким образом, файл, который был в коммите, находится в индексе и рабочем дереве. Использование git reset --hard приведет к переустановке индекса и копий рабочего дерева.

неотслеживаемый файл , напротив, является файлом, которого нет в индексе . (Он должен быть в вашем рабочем дереве, иначе он просто не существует вокруг. Если он находится в коммите, git reset --hard вернет его и к индексу, и к рабочему дереву.)

В любом случае, если его сейчас нет в индексе, то либо вы удалили его из индекса, либо его там никогда не было. Последнее имеет тенденцию быть более распространенным, поскольку обычно вы удаляете файлы из индекса, используя git rm <em>file</em>, который удаляет его как из индекса, так и из рабочего дерева. И мы можем быть уверены, что это не входит в ваш HEAD коммит, потому что если бы это было так, git reset --hard вернул бы его в ваш индекс (и переписал бы копию рабочего дерева с подтвержденной копией).

Итак, у вас есть файл, который вы - или кто-то или что-то - создали в рабочем дереве, то есть, конечно, не ни в индексе, ни в текущем коммите. И теперь, запустив git pull, вы сказали Git запустить git merge. (Обратите внимание, что git pull означает run git fetch, затем выполните вторую команду Git, обычно git merge. Вывод, который вы показываете, показывает, что вы получаете не только git merge, но, в частности, fast-forward слияние, которое на самом деле не является слиянием, но имеет много общего.)

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

Новый файл, который они добавили, это тот, который у вас есть как неотслеживаемый. То есть у вас есть:

public/appName/js/password-change.js

белыйich не отслеживается - не в вашем индексе. Они сообщают версию этого файла. У Git нет замороженной копии вашей версии этого файла, чтобы сохранить ее в безопасности. Использование git merge просто перезапишет вашу копию public/appName/js/password-change.js их копиями. Итак, git merge говорит вам, что этот файл в пути: вы должны зафиксировать его, чтобы у вас была замороженная копия, которая хранит его в безопасности, или убрать его с пути, чтобы git merge мог написать их Копировать на место.

0 голосов
/ 24 января 2019

Две вещи:

1) Команда: git reset --hard HEAD

2) Даже если файл не отслежен, git по умолчанию не удалит его во время полного сброса (илибольшинство других операций).Он хочет убедиться, что он делает это только в том случае, если вы явно сообщите об этом, потому что если это произойдет, то, поскольку файл не был отслежен, вы не сможете восстановить его.

Есливы точно знаете, что хотите удалить локальные неотслеживаемые файлы, вы можете использовать git clean.https://git -scm.com / Docs / ГИТ-чистый

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...