Изменения, которые «должны быть зафиксированы», - это те изменения, которые хранятся в index (или промежуточная область или кеш ).Git делает новые коммиты из того, что находится в индексе прямо сейчас , поэтому хорошее описание индекса заключается в том, что это то, что вы предлагаете совершить .
Если вы скопировали репозиторий, но не скопировали индекс (или скопировали его каким-либо образом, который не сохранил все это), это могло бы объяснить проблему.Индекс не является ни самим хранилищем, ни рабочим деревом.Вместо этого индекс находится между хранилищем и рабочим деревом.Таким образом, файлы могут находиться там, в рабочем дереве, в хорошем порядке, но отсутствовать в индексе, и Git скажет вам, что удаление будет зафиксировано, если вы выполните коммит сейчас.
Вы можете указать Gitдля повторного заполнения индекса из текущего коммита, используя git reset --mixed
.Или вы можете записать указанные (или все) файлы рабочего дерева, используя git add
.То есть:
git reset --mixed
: копировать (все файлы) из HEAD
в индекс git add <em>file</em>
: копировать (указанный file
) из рабочего дерева в индекс
Если вы рассматриваете индекс между фиксацией HEAD
и рабочим деревом, все это имеет больше смысла:
HEAD index work-tree
---------- ---------- ----------
README.txt README.txt README.txt
file.ext file.ext file.ext
main.py main.py main.py
Копия HEAD
каждого файла доступна только для чтения: никакие изменения не могут быть изменены, и это подтвержденные копии.Эти файлы сжимаются - возможно, сильно сжимаются - и в специальном формате только для Git.
Индексная копия каждого файла доступна только для Git, как и копия HEAD
, за исключениемчто это чтение / запись: это было незаморожено .При фиксации next будет использована индексная копия путем ее замораживания (и как только все файлы будут заморожены и фиксация завершена, эта индексная копия станет копией HEAD
, поскольку HEAD
изменяет новый коммит).
Копия рабочего дерева каждого файла является обычным файлом в его обычной форме.Git не использует для совершения коммитов.Git не очень заботится о этом, правда;Git просто предоставляет вам для использования, работы и, возможно, изменения, если хотите.
Как только вы изменили файл, вы используете git add
, чтобы скопировать его обратно в индекс, переписав старую копию индекса.Процесс add
сжимает и выполняет Git-файл, чтобы он был готов к фиксации.
Команда git commit
берет все, что находится в индексе прямо сейчас , и фиксирует это вновый коммит.Новый коммит становится коммитом HEAD
.
При первом запуске git checkout <em>branch</em>
Git заполняет индекс и рабочее дерево из коммита подсказки branch
.Этот коммит становится коммитом HEAD
, а HEAD
и индексом совпадают.Когда вы делаете новый коммит, этот новый коммит становится кончиком текущей ветви, а HEAD
и индекс совпадают.Обратите внимание, что рабочее дерево было просто выводом начальной проверки, а не вводом новой фиксации.(Он был, или, скорее, некоторые файлы в нем были помещены в index , если вы git add
-ed некоторые или все файлы.)
Обычно вы удаляете файлы из индексаиспользование git rm
:
git rm <em>file</em>
удаляет file
из и индекса и рабочего дерева;или git rm <em>file</em>
удаляет file
из индекса, но оставляет его одного в рабочем дереве.
В любом случае, после удаления произнесите, file.ext
из индекса, он у вас все еще есть в HEAD
, поэтому у вас есть один из следующих двух результатов:
HEAD index work-tree
---------- ---------- ----------
README.txt README.txt README.txt
file.ext file.ext
main.py main.py main.py
или:
HEAD index work-tree
---------- ---------- ----------
README.txt README.txt README.txt
file.ext
main.py main.py main.py
Поиск работы-tree не скажет вам, что файл ушел из index , он только скажет вам, ушел ли файл из рабочего дерева .Но git status
скажет вам, потому что git status
работает два git diff
s:
Сначала git status
сравнивает фиксацию HEAD
с индексом.Что бы ни отличалось, Git говорит вам, что это «изменение, которое нужно совершить» (я полагаю, «qui seront validées»).Что бы ни было то же самое , Git ничего не говорит о.
Затем git status
сравнивает индекс с рабочим деревом.Что бы ни отличалось, Git говорит вам, что это изменение, которое, по крайней мере, пока не планируется совершить.Конечно, вы можете git add
обновить файл в индексе;после этого первое сравнение, HEAD
против индекса, покажет что-то другое.
Файл, которого нет в индексе, но находится в рабочем дереве, называетсябыть неотслеживаемым ("не suivis").Это верно, даже если файл находится в коммите HEAD
.(Однако обратите внимание, что вы можете подавить эту жалобу на неотслеживаемые файлы, перечислив файл или шаблон для него в .gitignore
.)
Вывод: файлы находятся в HEAD
и рабочее дерево, но не в индексе
Вывод, который вы показали, является именно тем, чего следует ожидать в этом случае.Файл находится в HEAD
, но не в индексе: он будет отсутствовать в следующем коммите, если вы не вернете его обратно в индекс.И файл не находится в индексе, но находится в рабочем дереве: он не отслеживается.