Каталог .git - це і є репозиторій. Робочий каталог лише показує одну з версій. Скопіюйте .git - і отримаєте всю історію; видаліть - і залишаться тільки поточні файли без історії.
.git/
├── HEAD ← на що зараз вказує HEAD (зазвичай ref: refs/heads/main)
├── config ← налаштування цього репозиторію, remotes, гілки
├── index ← індекс (staging area), бінарний файл
├── objects/ ← база об'єктів: blob, tree, commit, tag
│ ├── 1a/2485... ← окремі стиснені об'єкти (loose objects)
│ └── pack/ ← упаковані об'єкти (packfiles)
├── refs/
│ ├── heads/ ← локальні гілки
│ ├── remotes/ ← віддалені гілки (origin/main)
│ └── tags/ ← теги
├── packed-refs ← багато ref-ів одним файлом
├── logs/ ← reflog: історія переміщень HEAD і гілок
├── hooks/ ← скрипти хуків (*.sample - приклади)
└── info/exclude ← персональні ігноровані шаблони
Найважливіше:
objects/- увесь вміст: кожна версія кожного файлу, кожен каталог, кожен коміт. Імена файлів - хеші вмісту, перші два символи хешу - назва підкаталогу;refs/іpacked-refs- імена: гілки й теги - це лише файли з хешем коміту;HEAD- де ви зараз;index- що піде в наступний коміт;logs/- страховка: звідсиgit reflogвідновлює «втрачені» коміти.
Що можна побачити самостійно:
cat .git/HEAD
cat .git/refs/heads/main # хеш останнього коміту (якщо не упаковано)
find .git/objects -type f | head
git count-objects -vH # скільки об'єктів і скільки вони займають
Чого не робити:
- не редагувати файли в
.gitвручну без розуміння - для цього є команди (git update-ref,git config); - не комітити
.gitіншого репозиторію в свій (вкладені репозиторії - через підмодулі); - не синхронізувати
.gitчерез Dropbox чи iCloud - одночасний запис з двох машин псує репозиторій.
git worktree і підмодулі використовують файл .git замість каталогу - у ньому лише шлях до справжнього каталогу репозиторію.