Git checkout обновляет все файлы?

Новый вопрос, я хочу убедиться, что я понимаю это.

Когда я git checkout <revision>это возвращает весь проект к его состоянию в тот момент, или он только воссоздает файлы, измененные в этой конкретной ревизии?

Например: если моя папка была полностью пустой, кроме репозитория.git, и я git checkout masterБудут ли полученные файлы представлять собой проект целиком или только файлы, измененные при последнем коммите?

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

2 ответа

Решение

Когда я git checkout <revision> это возвращает весь проект к его состоянию в тот момент, или он только воссоздает файлы, измененные в этой конкретной ревизии?

Если ваше рабочее дерево и область подготовки полностью пусты (кроме .git подкаталог, конечно) и вы запускаете

git checkout <revision>

тогда ваше рабочее дерево и область подготовки будут точно отражать содержание этой конкретной ревизии.

С другой стороны, если ваше рабочее дерево не пусто при запуске git checkout то, что происходит, гораздо более тонко и может быть разбито на три случая:

  1. Оформить заказ не составляет проблем, и Git выполняет его, не отрывая веки: содержимое этой конкретной ревизии копируется в ваше рабочее дерево (и, при необходимости, перезаписывает уже имеющиеся там материалы). Или же
  2. Проверка, если она будет выполнена, приведет к потере локальных изменений; поэтому, Git (при условии, что вы не использовали -f флаг) отключает и отменяет оформление заказа. Или же
  3. Может возникнуть более сложная ситуация, при которой материал извлекается только частично, а некоторые локальные непринятые изменения сохраняются в вашем рабочем дереве и / или индексе. Более подробную информацию об этой ситуации можно найти в моем ответе на вопрос: Почему неопубликованные изменения все еще присутствуют после проверки другой ветки?,

[...] размер каждой проверки варьируется довольно сильно.

Вы принимаете во внимание неотслеживаемые файлы? Вы зафиксировали, а затем удалили большие файлы? На основании информации, приведенной только в вашем вопросе, мы можем лишь немного предположить причину, по которой размер сильно варьируется.

Из документации: "Обновляет файлы в рабочем дереве, чтобы они соответствовали версии в индексе или указанном дереве". В случае вашего примера он вернет хранилище в состояние во время извлечения полностью.

Однако, как отметил Jubobs, в поведении есть разница, если вы внесли какие-либо изменения в состояние своего хранилища с момента последней проверки. Его ответ более полный, чем мой, если это так.

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

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