(Отказ от ответственности: я не git
эксперт - другие пользователи на SO гораздо более осведомлены, чем я, и я приглашаю их отредактировать и улучшить мой ответ)
Внешняя модель Git, ориентированная на пользователя, заключается в том, что коммит якобы представляет собой снимок состояния вашего репо, а не дельту или набор изменений, как работают SVN и TFS. Это то, что делает Git таким мощным: потому что проще рассуждать о снимках (и делать произвольные различия между снимками), чем рассуждать о последовательности дельт. Например, попробуйте сделать rebase
в SVN. Именно поэтому Git не хранит переименования файлов специально.
Внутренне, Git использует разные подходы и может использовать дельты, или он может просто хранить простую прямую копию файла (например, Git LFS). Дело в том, что его внутреннее представление вашего репо является абстрагированной деталью реализации, и вы не должны беспокоиться об этом, если вам действительно не нужно знать (но хорошо быть любопытным!)
В ответ на ваши вопросы:
- Когда (если это так) сохранить полную версию файла (например, testing.txt).
Всякий раз, когда это подходит, например, когда быстрее хранить полный файл, чем вычислять diff (например, после git add
и git commit
некоторых новых файлов) или когда вы вносите существенные изменения в множество маленьких файлов.
Git оптимизирован для скорости (необходима цитата) , а не пробел, поэтому, если быстрее не хранить различия, то они не будут хранить различия.
- Когда создается новая версия (скажем, к ней был добавлен «Hello World»), она просто сохраняет дельту.
(Под "новой версией" я предполагаю, что вы имеете в виду "новый коммит".)
Не автоматически и не обязательно. Я рекомендую прочитать эту ветку QA: Внутренние элементы Git: как Git хранит небольшие различия между ревизиями?
- Если у вас есть 100 версий файла
testing.txt
, и я сравниваю от 20 до 90, как он строит 2 версии для сравнения?
Концептуально, он делает снимок 20 и снимок 90 и мгновенно сравнивает их.
Однако внутренне ему может понадобиться создать моментальный снимок 20 и моментальный снимок 90 из своего хранилища объектов, прежде чем он сможет их сравнить - и могут быть встроенные оптимизации, которые позволяют ему обнаруживать и игнорировать нерелевантные коммиты и дельты.