Так что он всегда больше, чем файл в рабочем каталоге.
Нет.
Чтобы понять, вам нужно знать, как git хранит свои данные.
Git использует эвристику для поиска похожих частей вашего кода.Другими словами, когда git находит идентичный контент (весь файл или его часть), он не сохраняет его дважды, а вместо этого сохраняет его один раз и использует указатель o, указывающий на первое вхождение.Это известно как hunks .
Когда вы выполняете git add
, git захватывает содержимое, «настраивает» hunks и сохраняет их позже внутри пакета.файл.Итак, вернемся к отслеживанию, когда вы выполняете git add
git, захватываете содержимое, хешируете его с помощью sha1sum, hash-object и т. Д., Архивируйте его и сохраняйте в папке .git / objects.
«Реальный»содержимое ваших файлов (как только git упакует его позже) - это просто небольшие куски, известные как hunks
, и git знает, как проиндексировать их в исходный файл.
Что такое куски?
Hunks - это файлы патчей.Вы можете видеть их при выполнении git add -p
, а затем, если у вас есть несколько изменений в нескольких местах в ваших файлах, выберите s
, и вы увидите их
Это параметры, которые вы можете сделать в add -p
:
y - stage this hunk
n - do not stage this hunk
q - quit, do not stage this hunk nor any of the remaining ones
a - stage this and all the remaining hunks in the file
d - do not stage this hunk nor any of the remaining hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see the previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help
Как только вы используете s
, он выберет кусок кода, который можно рассматривать как отдельное изменение.Если вы хотите разделить его, даже больше, вам придется использовать e
, чтобы отредактировать блок, а затем добавить его обратно в область сцены.
"патчи" Git store, которые являютсядельта ваших изменений, но git добавьте несколько других «слоев» к нему.Он повторно использует тот же контент, как только "видит" его (это делается с помощью эвристики) и добавляет только "новые" изменения, указывая на старые.
Позже git grabсодержимое и упаковать его с помощью ZIP.
