Как git хранит информацию о версии - PullRequest
0 голосов
/ 31 октября 2018

Мне было любопытно, как GIT хранит информацию о своей версии для файла.

Я предполагаю, что они, вероятно, являются дельтами, но если существует много версий файла (например, 100), то:

a) Когда (если это так) сохранить полную версию файла (например, testing.txt).

b) Когда создается новая версия (скажем, к ней был добавлен «Hello World»), она просто сохраняет дельту.

в) Если у вас есть 100 версий файла testing.txt, и я сравниваю от 20 до 90, как он строит 2 версии для сравнения?

Спасибо.

1 Ответ

0 голосов
/ 31 октября 2018

(Отказ от ответственности: я не git эксперт - другие пользователи на SO гораздо более осведомлены, чем я, и я приглашаю их отредактировать и улучшить мой ответ)

Внешняя модель Git, ориентированная на пользователя, заключается в том, что коммит якобы представляет собой снимок состояния вашего репо, а не дельту или набор изменений, как работают SVN и TFS. Это то, что делает Git таким мощным: потому что проще рассуждать о снимках (и делать произвольные различия между снимками), чем рассуждать о последовательности дельт. Например, попробуйте сделать rebase в SVN. Именно поэтому Git не хранит переименования файлов специально.

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

В ответ на ваши вопросы:

  1. Когда (если это так) сохранить полную версию файла (например, testing.txt).

Всякий раз, когда это подходит, например, когда быстрее хранить полный файл, чем вычислять diff (например, после git add и git commit некоторых новых файлов) или когда вы вносите существенные изменения в множество маленьких файлов.

Git оптимизирован для скорости (необходима цитата) , а не пробел, поэтому, если быстрее не хранить различия, то они не будут хранить различия.

  1. Когда создается новая версия (скажем, к ней был добавлен «Hello World»), она просто сохраняет дельту.

(Под "новой версией" я предполагаю, что вы имеете в виду "новый коммит".)

Не автоматически и не обязательно. Я рекомендую прочитать эту ветку QA: Внутренние элементы Git: как Git хранит небольшие различия между ревизиями?

  1. Если у вас есть 100 версий файла testing.txt, и я сравниваю от 20 до 90, как он строит 2 версии для сравнения?

Концептуально, он делает снимок 20 и снимок 90 и мгновенно сравнивает их.

Однако внутренне ему может понадобиться создать моментальный снимок 20 и моментальный снимок 90 из своего хранилища объектов, прежде чем он сможет их сравнить - и могут быть встроенные оптимизации, которые позволяют ему обнаруживать и игнорировать нерелевантные коммиты и дельты.

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