БпСстСтС 15% ΠΎΡ‚ всички хостинг услуги

ВСствай умСнията си ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈ ΠžΡ‚ΡΡ‚ΡŠΠΏΠΊΠ° Π·Π° всСки хостинг ΠΏΠ»Π°Π½

Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ ΠΊΠΎΠ΄: Skills Π—Π° Π½Π°Ρ‡Π°Π»ΠΎ
Заглавия
Linux Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ ΡΡŠΡ€Π²ΡŠΡ€ΠΈ

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π½Π° Git Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅: Пълно тСхничСско Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎ

Git Π΅ Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° систСма Π·Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ» Π½Π° вСрсиитС, която ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° историята Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΊΠ°Ρ‚ΠΎ насочСн Π°Ρ†ΠΈΠΊΠ»ΠΈΡ‡Π΅Π½ Π³Ρ€Π°Ρ„ (DAG) ΠΎΡ‚ нСизмСняСми ΠΎΠ±Π΅ΠΊΡ‚Π½ΠΈ снимки. Всяко Git Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π΅ ΠΈΠ·Π³Ρ€Π°Π΄Π΅Π½ΠΎ ΠΎΡ‚ Ρ‚Ρ€ΠΈ логичСски Π·ΠΎΠ½ΠΈ β€” Ρ€Π°Π±ΠΎΡ‚Π½Π°Ρ‚Π° дирСктория, ΠΈΠ½Π΄Π΅ΠΊΡΡŠΡ‚ Π·Π° ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈ Π²ΡŠΡ‚Ρ€Π΅ Π² .git/ β€” плюс Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Π»Π΅ΠΊΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ (ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅, Ρ‚Π°Π³ΠΎΠ²Π΅, ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°), ΠΊΠΎΠΈΡ‚ΠΎ Π½Π°Π²ΠΈΠ³ΠΈΡ€Π°Ρ‚ Ρ‚Π°Π·ΠΈ история. Π Π°Π·Π±ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ ΠΊΠ°ΠΊ Ρ‚Π΅Π·ΠΈ слоСвС взаимодСйстват Π΅ Ρ€Π°Π·Π»ΠΈΠΊΠ°Ρ‚Π° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΠ΅Ρ…Π°Π½ΠΈΡ‡Π½ΠΎΡ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Git ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ ΠΌΡƒ с Ρ…ΠΈΡ€ΡƒΡ€Π³ΠΈΡ‡Π½Π° прСцизност.

Ако самостоятСлно хостватС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°Ρ‚Π° си Π½Π° VPS, овладяванСто Π½Π° Ρ‚Π°Π·ΠΈ Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ½Π° структура Π²ΠΈ позволява Π΄Π° сС Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Ρ‚Π΅ ΠΎΡ‚ Π°Π²Π°Ρ€ΠΈΠΈ, Π΄Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€Π°Ρ‚Π΅ Π΅Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΈ CI/CD ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΠΈ ΠΈ Π΄Π° ΠΎΠ΄ΠΈΡ‚ΠΈΡ€Π°Ρ‚Π΅ всСки Π±Π°ΠΉΡ‚ ΠΎΡ‚ историята Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° си, Π±Π΅Π· Π΄Π° Ρ€Π°Π·Ρ‡ΠΈΡ‚Π°Ρ‚Π΅ Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° Π½Π° Ρ‚Ρ€Π΅Ρ‚Π° страна.

ΠœΠΎΠ΄Π΅Π»ΡŠΡ‚ с Ρ‚Ρ€ΠΈ Π·ΠΎΠ½ΠΈ: Как Git прСмСства Π΄Π°Π½Π½ΠΈ

ΠŸΡ€Π΅Π΄ΠΈ Π΄Π° сС ΠΏΠΎΡ‚ΠΎΠΏΠΈΡ‚Π΅ Π² ΠΎΡ‚Π΄Π΅Π»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ, усвоСтС ΠΌΠΎΠ΄Π΅Π»Π° Π½Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΉΡ‚ΠΎ управлява всяка Git опСрация:

Working Directory  -->  Staging Area (Index)  -->  .git/ Object Store
     (edit)               (git add)                  (git commit)

ΠŸΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ сС Π΄Π²ΠΈΠΆΠ°Ρ‚ отляво надясно, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Ρ‚Π΅ commit, ΠΈ отдясно наляво, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Ρ‚Π΅ ΠΈΠ»ΠΈ Π½ΡƒΠ»ΠΈΡ€Π°Ρ‚Π΅. Всяка Git ΠΊΠΎΠΌΠ°Π½Π΄Π° Π΅ ΠΏΠΎ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΠΎ опСрация Π·Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅ ΠΈΠ»ΠΈ запис Π²ΡŠΡ€Ρ…Ρƒ Π΅Π΄Π½Π° ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ Ρ‚Π΅Π·ΠΈ Π·ΠΎΠ½ΠΈ.

Π Π°Π±ΠΎΡ‚Π½Π° дирСктория

Π Π°Π±ΠΎΡ‚Π½Π°Ρ‚Π° дирСктория (извСстна ΠΎΡ‰Π΅ ΠΊΠ°Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π½ΠΎΡ‚ΠΎ Π΄ΡŠΡ€Π²ΠΎ) Π΅ ΠΈΠ·Π³Π»Π΅Π΄ΡŠΡ‚ Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π°Ρ‚Π° систСма Π½Π° вашия ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅ Π½Π° ΠΈΠ·Π²Π»ΠΈΡ‡Π°Π½Π΅. ΠšΠΎΠ³Π°Ρ‚ΠΎ ΠΈΠ·ΠΏΡŠΠ»Π½ΠΈΡ‚Π΅ git clone ΠΈΠ»ΠΈ git checkout, Git Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅ ΠΎΡ‚ компрСсирани ΠΎΠ±Π΅ΠΊΡ‚ΠΈ Π² .git/objects/ ΠΈ Π³ΠΈ записва Π² Ρ‚Π°Π·ΠΈ дирСктория.

Π€Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅ Π² Ρ€Π°Π±ΠΎΡ‚Π½Π°Ρ‚Π° дирСктория ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‚ Π² Π΅Π΄Π½ΠΎ ΠΎΡ‚ Ρ‡Π΅Ρ‚ΠΈΡ€ΠΈ ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΡ:

  • НСслСдСни β€” Git Π½ΠΈΠΊΠΎΠ³Π° Π½Π΅ Π΅ Π²ΠΈΠΆΠ΄Π°Π» Ρ‚ΠΎΠ·ΠΈ Ρ„Π°ΠΉΠ»; Ρ‚ΠΎΠΉ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π° само Π½Π° диска.
  • Π‘Π»Π΅Π΄Π΅Π½ΠΈ, Π½Π΅ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½ΠΈ β€” Ρ„Π°ΠΉΠ»ΡŠΡ‚ съвпада Ρ‚ΠΎΡ‡Π½ΠΎ с послСдната записана снимка.
  • Π‘Π»Π΅Π΄Π΅Π½ΠΈ, ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½ΠΈ β€” Ρ„Π°ΠΉΠ»ΡŠΡ‚ сС Ρ€Π°Π·Π»ΠΈΡ‡Π°Π²Π° ΠΎΡ‚ послСдната записана снимка, Π½ΠΎ Π½Π΅ Π΅ Π±ΠΈΠ» ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²Π΅Π½.
  • Π‘Π»Π΅Π΄Π΅Π½ΠΈ, ΠΈΠ·Ρ‚Ρ€ΠΈΡ‚ΠΈ β€” Ρ„Π°ΠΉΠ»ΡŠΡ‚ Π΅ ΠΏΡ€Π΅ΠΌΠ°Ρ…Π½Π°Ρ‚ ΠΎΡ‚ диска, Π½ΠΎ ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π΅ Π΅ Π±ΠΈΠ»ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²Π΅Π½ΠΎ.

ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅Π½ нюанс, ΠΊΠΎΠΉΡ‚ΠΎ ΠΎΠ±ΡŠΡ€ΠΊΠ²Π° ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈ: Ρ€Π°Π±ΠΎΡ‚Π½Π°Ρ‚Π° дирСктория Π½Π΅ Π΅ просто ΠΊΠΎΠΏΠΈΠ΅ Π½Π° Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ. Git я Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π° Ρ‡Ρ€Π΅Π· Ρ‡Π΅Ρ‚Π΅Π½Π΅ Π½Π° tree ΠΎΠ±Π΅ΠΊΡ‚ΠΈ ΠΈ дСкомпрСсиранС Π½Π° blob ΠΎΠ±Π΅ΠΊΡ‚ΠΈ. Ако .git/ Π΅ Π½Π΅ΠΏΠΎΠΊΡŠΡ‚Π½Π°Ρ‚, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ½Π°Π³ΠΈ Π΄Π° Ρ€Π΅Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Ρ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Π½Π°Ρ‚Π° дирСктория ΠΎΡ‚ Π½ΡƒΠ»Π°Ρ‚Π° β€” ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΡ‚ΠΎ Π½Π΅ Π΅ вярно.

Sparse Checkout Π·Π° Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΌΠΎΠ½ΠΎΡ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ

ΠŸΡ€ΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° с дСсСтки хиляди Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ (Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½ΠΈ Π·Π° ΠΌΠΎΠ½ΠΎΡ€Π΅ΠΏΠΎ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΈ), ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚Π΅ ΠΊΠΎΠΈ ΠΏΡŠΡ‚ΠΈΡ‰Π° Git ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π° Π² Ρ€Π°Π±ΠΎΡ‚Π½Π°Ρ‚Π° дирСктория:

git sparse-checkout init --cone
git sparse-checkout set services/api services/auth

Π’ΠΎΠ²Π° Π΅ Π±Π΅Π·Ρ†Π΅Π½Π½ΠΎ Π½Π° VPS с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ дисков I/O, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Git пропуска дСкомпрСсиранСто Π½Π° blob ΠΎΠ±Π΅ΠΊΡ‚ΠΈ Π·Π° ΠΏΡŠΡ‚ΠΈΡ‰Π° извън конуса.

Π—ΠΎΠ½Π° Π·Π° ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° (индСкс)

Π—ΠΎΠ½Π°Ρ‚Π° Π·Π° ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ°, Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ½ΠΎ Π½Π°Ρ€Π΅Ρ‡Π΅Π½Π° индСкс, Π΅ Π΄Π²ΠΎΠΈΡ‡Π΅Π½ Ρ„Π°ΠΉΠ», Π½Π°ΠΌΠΈΡ€Π°Ρ‰ сС Π½Π° .git/index. Вя дСйства ΠΊΠ°Ρ‚ΠΎ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ слСдващ commit β€” измСняСма снимка, която сС Π½Π°ΠΌΠΈΡ€Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π±ΠΎΡ‚Π½Π°Ρ‚Π° Π²ΠΈ дирСктория ΠΈ постоянното Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈ.

git add <file>          # Stage a specific file
git add -p              # Interactively stage hunks within a file
git add -u              # Stage all tracked modifications and deletions
git status              # Compare working directory and index against HEAD
git diff --cached       # Show diff between index and HEAD

Π—Π°Ρ‰ΠΎ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π° ΠΈΠ½Π΄Π΅ΠΊΡΡŠΡ‚

Π˜Π½Π΄Π΅ΠΊΡΡŠΡ‚ Ρ€Π΅ΡˆΠ°Π²Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΠΎ-проститС VCS инструмСнти ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€Π°Ρ‚: частичнитС commits. МоТС Π΄Π° стС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΠ»ΠΈ ΠΏΠ΅Ρ‚ Ρ„Π°ΠΉΠ»Π°, Π½ΠΎ Π΄Π° искатС само Ρ‚Ρ€ΠΈ ΠΎΡ‚ тях Π² слСдващия commit. Π˜Π½Π΄Π΅ΠΊΡΡŠΡ‚ Π²ΠΈ позволява Π΄Π° ΡΡŠΡΡ‚Π°Π²ΠΈΡ‚Π΅ Ρ‚ΠΎΡ‡Π½ΠΎ снимката, която Π²ΡŠΠ·Π½Π°ΠΌΠ΅Ρ€ΡΠ²Π°Ρ‚Π΅ Π΄Π° Π·Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ΡŠΡ‚ Π²ΠΈ ΠΈΠΌΠ° ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ΠΎ.

ΠšΡ€Π°Π΅Π½ случай β€” ΠΏΠΎΠ²Ρ€Π΅Π΄Π° Π½Π° индСкса: Ако систСмСн срив ΠΏΡ€Π΅ΠΊΡŠΡΠ½Π΅ git add, индСксният Ρ„Π°ΠΉΠ» ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΠΎΠ²Ρ€Π΅Π΄ΠΈ. Π‘ΠΈΠΌΠΏΡ‚ΠΎΠΌΠΈΡ‚Π΅ Π²ΠΊΠ»ΡŽΡ‡Π²Π°Ρ‚ зависванС Π½Π° git status ΠΈΠ»ΠΈ ΠΎΡ‚Ρ‡ΠΈΡ‚Π°Π½Π΅ Π½Π° странСн ΠΈΠ·Ρ…ΠΎΠ΄. Π’ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅:

rm .git/index
git reset

Git Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π° индСкса ΠΎΡ‚ HEAD Π±Π΅Π· Π΄Π° засяга Ρ€Π°Π±ΠΎΡ‚Π½Π°Ρ‚Π° Π²ΠΈ дирСктория.

Π˜Π½Π΄Π΅ΠΊΡΡŠΡ‚ ΠΊΠ°Ρ‚ΠΎ Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€ Π½Π° ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΈ ΠΏΡ€ΠΈ сливанС

По Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ ΠΏΡ€ΠΈ сливанС, ΠΈΠ½Π΄Π΅ΠΊΡΡŠΡ‚ ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° Ρ‚Ρ€ΠΈ вСрсии Π½Π° всСки ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π΅Π½ Ρ„Π°ΠΉΠ» Π΅Π΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ (Π΅Ρ‚Π°ΠΏΠΈ 1, 2 ΠΈ 3 β€” Π±Π°Π·Π°, наша вСрсия, тяхна вСрсия). Π•Ρ‚ΠΎ Π·Π°Ρ‰ΠΎ git diff --cached Π½Π΅ ΠΏΠΎΠΊΠ°Π·Π²Π° Π½ΠΈΡ‰ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΠΎ срСдата Π½Π° ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚; трябва Π²ΠΈ git diff --cc ΠΈΠ»ΠΈ инструмСнт Π·Π° сливанС, Π·Π° Π΄Π° ΠΏΡ€Π΅Π³Π»Π΅Π΄Π°Ρ‚Π΅ ΠΈ Ρ‚Ρ€ΠΈΡ‚Π΅ Π΅Ρ‚Π°ΠΏΠ°.

ДирСкторията .git/: Анатомия Π½Π° Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈ

ДирСкторията .git/ Π΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ. Всичко останало β€” Ρ€Π°Π±ΠΎΡ‚Π½Π°Ρ‚Π° дирСктория, ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ΠΈΡ‚Π΅ ΠΊΠ»ΠΎΠ½ΠΈΠ½Π³ΠΈ β€” Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎ ΠΎΡ‚ нСя. Π˜Π·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° .git/ ΠΏΡ€Π΅Π²Ρ€ΡŠΡ‰Π° Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π² ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½Π° дирСктория Π±Π΅Π· история.

.git/
β”œβ”€β”€ HEAD
β”œβ”€β”€ config
β”œβ”€β”€ description
β”œβ”€β”€ index
β”œβ”€β”€ COMMIT_EDITMSG
β”œβ”€β”€ hooks/
β”œβ”€β”€ info/
β”œβ”€β”€ logs/
β”‚   β”œβ”€β”€ HEAD
β”‚   └── refs/
β”œβ”€β”€ objects/
β”‚   β”œβ”€β”€ info/
β”‚   └── pack/
└── refs/
    β”œβ”€β”€ heads/
    β”œβ”€β”€ remotes/
    └── tags/

HEAD Π΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ тСкстов Ρ„Π°ΠΉΠ», ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰ ΠΈΠ»ΠΈ символна рСфСрСнция (сочСща към ΠΊΠ»ΠΎΠ½) ΠΈΠ»ΠΈ суров SHA-1 Ρ…Π΅Ρˆ (ΠΎΡ‚ΠΊΠ°Ρ‡Π΅Π½ΠΎ HEAD ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅).

cat .git/HEAD
# ref: refs/heads/main        <-- on a branch
# a3f1c9d...                  <-- detached HEAD

ΠžΡ‚ΠΊΠ°Ρ‡Π΅Π½ΠΎΡ‚ΠΎ HEAD Π½Π΅ Π΅ Π³Ρ€Π΅ΡˆΠ½ΠΎ ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅ β€” Ρ‚ΠΎ Π΅ ΡƒΠΌΠΈΡˆΠ»Π΅Π½ΠΎ, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΈΠ·Π²Π»ΠΈΡ‡Π°Ρ‚Π΅ Ρ‚Π°Π³ ΠΈΠ»ΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π΅Π½ commit Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°. ΠžΠΏΠ°ΡΠ½ΠΎΡΡ‚Ρ‚Π° Π΅ ΠΏΡ€ΠΈ ΠΏΡ€Π°Π²Π΅Π½Π΅ Π½Π° commits Π² ΠΎΡ‚ΠΊΠ°Ρ‡Π΅Π½ΠΎ HEAD: Ρ‚Π΅Π·ΠΈ commits са Π΄ΠΎΡΡ‚ΡŠΠΏΠ½ΠΈ само Ρ‡Ρ€Π΅Π· reflog, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ Π½Π΅ Π³ΠΈ ΠΏΡ€ΠΈΠΊΠ°Ρ‡ΠΈΡ‚Π΅ към ΠΊΠ»ΠΎΠ½.

git checkout -b rescue-branch   # Attach detached commits to a new branch

config

Локалният ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π΅Π½ Ρ„Π°ΠΉΠ» Π½Π° Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ. Π’ΠΎΠΉ замСства Π³Π»ΠΎΠ±Π°Π»Π½ΠΈΡ‚Π΅ (~/.gitconfig) ΠΈ систСмнитС (/etc/gitconfig) настройки. ЧСсти записи:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
[remote "origin"]
    url = git@github.com:user/repo.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "main"]
    remote = origin
    merge = refs/heads/main

На самостоятСлно хостван ΡΡŠΡ€Π²ΡŠΡ€, Ρ‰Π΅ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€Π°Ρ‚Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Ρ‚ΠΎΠ·ΠΈ Ρ„Π°ΠΉΠ» ΠΏΡ€ΠΈ ротация Π½Π° ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ΠΈ URL адрСси ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½Π΅ Π½Π° uploadpack.allowReachableSHA1InWant Π·Π° частични ΠΊΠ»ΠΎΠ½ΠΈΠ½Π³ΠΈ.

refs/

ДирСкторията refs/ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈ тСкстови Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, всСки ΠΎΡ‚ ΠΊΠΎΠΈΡ‚ΠΎ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Π΅Π΄ΠΈΠ½ΠΈΡ‡Π΅Π½ SHA-1 Ρ…Π΅Ρˆ. Π’Π΅ са ΠΈΠΌΠ΅Π½ΡƒΠ²Π°Π½ΠΈΡ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ правят DAG Π½Π° Git Π½Π°Π²ΠΈΠ³ΠΈΡ€ΡƒΠ΅ΠΌ.

Π’ΠΈΠΏ Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΡΠŸΡŠΡ‚ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅
Π›ΠΎΠΊΠ°Π»Π΅Π½ ΠΊΠ»ΠΎΠ½refs/heads/<name>Π‘ΠΎΡ‡ΠΈ към Π²ΡŠΡ€Ρ…ΠΎΠ²ΠΈΡ commit Π½Π° ΠΊΠ»ΠΎΠ½
Клон Π·Π° прослСдяванС Π½Π° ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅refs/remotes/<remote>/<name>Π›ΠΎΠΊΠ°Π»Π΅Π½ кСш Π½Π° Π²ΡŠΡ€Ρ…Π° Π½Π° ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ ΠΊΠ»ΠΎΠ½
Π›Π΅ΠΊ Ρ‚Π°Π³refs/tags/<name>Π‘ΠΎΡ‡ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ към commit ΠΎΠ±Π΅ΠΊΡ‚
Анотиран Ρ‚Π°Π³refs/tags/<name>Π‘ΠΎΡ‡ΠΈ към Ρ‚Π°Π³ ΠΎΠ±Π΅ΠΊΡ‚, ΠΊΠΎΠΉΡ‚ΠΎ сочи към commit
Stashrefs/stashΠ‘ΠΎΡ‡ΠΈ към stash commit

Π—Π° производитСлност, Git ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ€Π° Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈΡ‚Π΅ Π² .git/packed-refs, слСд ΠΊΠ°Ρ‚ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π°Ρ‚Ρ€ΡƒΠΏΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ‚ тях. Π’ΠΈΠ½Π°Π³ΠΈ провСрявайтС ΠΈ Π΄Π²Π΅Ρ‚Π΅ мСста ΠΏΡ€ΠΈ скриптиранС срСщу Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ.

Git ΠΎΠ±Π΅ΠΊΡ‚ΠΈ: НСизмСняСмото ядро

Всичко ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΎ Π² .git/objects/ Π΅ адрСсирано ΠΏΠΎ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅: ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° Ρ„Π°ΠΉΠ»Π° Π΅ SHA-1 (ΠΈΠ»ΠΈ SHA-256 Π² ΠΏΠΎ-Π½ΠΎΠ²ΠΈΡ‚Π΅ вСрсии Π½Π° Git) Ρ…Π΅ΡˆΡŠΡ‚ Π½Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΎΠ±Π΅ΠΊΡ‚Π°. Π’ΠΎΠ²Π° ΠΏΡ€Π°Π²ΠΈ Git ΠΏΡ€ΠΈΡΡŠΡ‰ΠΎ Π·Π°Ρ‰ΠΈΡ‚Π΅Π½ ΠΎΡ‚ подправянС β€” промяната Π½Π° всСки Π±Π°ΠΉΡ‚ промСня Ρ…Π΅ΡˆΠ°, Π½Π°Ρ€ΡƒΡˆΠ°Π²Π°ΠΉΠΊΠΈ Π²Π΅Ρ€ΠΈΠ³Π°Ρ‚Π°.

Π§Π΅Ρ‚ΠΈΡ€ΠΈΡ‚Π΅ Ρ‚ΠΈΠΏΠ° ΠΎΠ±Π΅ΠΊΡ‚ΠΈ

Π’ΠΈΠΏ ΠΎΠ±Π΅ΠΊΡ‚ΠšΠ°ΠΊΠ²ΠΎ ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Π‘ΠΎΡ‡ΠΈ към
BlobНСобработСно ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅ Π½Π° Ρ„Π°ΠΉΠ» (Π±Π΅Π· ΠΈΠΌΠ΅ Π½Π° Ρ„Π°ΠΉΠ», Π±Π΅Π· Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ)Нищо
TreeБписък Π½Π° дирСктория: ΠΈΠΌΠ΅Π½Π° Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, blob/tree SHA адрСсиBlob ΠΎΠ±Π΅ΠΊΡ‚ΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ tree ΠΎΠ±Π΅ΠΊΡ‚ΠΈ
CommitАвтор, committer, Π²Ρ€Π΅ΠΌΠ΅Π²Π° ΠΌΠ°Ρ€ΠΊΠ°, ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅, родитСлски SHA(s)Π•Π΄ΠΈΠ½ tree + Π½ΡƒΠ»Π° ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅Ρ‡Π΅ родитСлски commits
TagБамоличност Π½Π° тагиращия, Π²Ρ€Π΅ΠΌΠ΅Π²Π° ΠΌΠ°Ρ€ΠΊΠ°, ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅, GPG подписОбикновСно commit

Π”ΠΈΡ€Π΅ΠΊΡ‚Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈ

# Show the type of any object
git cat-file -t a3f1c9d

# Show the content of any object
git cat-file -p a3f1c9d

# Show the tree of the current HEAD commit
git ls-tree HEAD

# Show a specific blob's content
git show HEAD:src/main.py

Π‘Π²ΠΎΠ±ΠΎΠ΄Π½ΠΈ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ срСщу pack Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅

ΠŸΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΎ всСки ΠΎΠ±Π΅ΠΊΡ‚ сС ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° ΠΊΠ°Ρ‚ΠΎ ΠΎΡ‚Π΄Π΅Π»Π΅Π½ компрСсиран Ρ„Π°ΠΉΠ» ΠΏΠΎΠ΄ .git/objects/<2-char-prefix>/<38-char-suffix>. Π’ΠΎΠ²Π° са свободни ΠΎΠ±Π΅ΠΊΡ‚ΠΈ. Π‘ Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ, Git изпълнява git gc (ΡΡŠΠ±ΠΈΡ€Π°Π½Π΅ Π½Π° Π±ΠΎΠΊΠ»ΡƒΠΊ), Π·Π° Π΄Π° ΠΎΠ±Π΅Π΄ΠΈΠ½ΠΈ свободнитС ΠΎΠ±Π΅ΠΊΡ‚ΠΈ Π² pack Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ (.git/objects/pack/*.pack) със ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π΅Π½ индСкс (.pack.idx).

Pack Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π΄Π΅Π»Ρ‚Π° компрСсия β€” ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Ρ‚ Ρ€Π°Π·Π»ΠΈΠΊΠ°Ρ‚Π° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ, вмСсто пълни копия. Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ с хиляди ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ тСкстови Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° сС свиС Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ слСд ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ€Π°Π½Π΅. На VPS с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ NVMe ΠΊΠ°ΠΏΠ°Ρ†ΠΈΡ‚Π΅Ρ‚, ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° git gc --aggressive Π²ΡŠΡ€Ρ…Ρƒ Π³ΠΎΠ»Π΅ΠΌΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° ΠΏΡ€Π΅Π΄ΠΈ Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€Π°Π½Π΅ Π΅ стандартна ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°.

git count-objects -vH    # Show loose object count and disk usage
git gc --aggressive      # Repack aggressively (CPU-intensive)
git verify-pack -v .git/objects/pack/*.idx | sort -k3 -n | tail -20
# Find the 20 largest objects in the pack

Π˜ΡΡ‚ΠΎΡ€ΠΈΡ Π½Π° commits: НасочСният Π°Ρ†ΠΈΠΊΠ»ΠΈΡ‡Π΅Π½ Π³Ρ€Π°Ρ„

ВсСки commit ΠΎΠ±Π΅ΠΊΡ‚ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Ρ‚ΠΎΡ‡Π½ΠΎ Π΅Π΄ΠΈΠ½ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π» към tree ΠΎΠ±Π΅ΠΊΡ‚ (снимката Π½Π° основната дирСктория) ΠΈ Π½ΡƒΠ»Π° ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ към родитСлски commits. Π’ΠΎΠ²Π° Ρ„ΠΎΡ€ΠΌΠΈΡ€Π° DAG, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ:

  • Нула Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΠΈ = началният commit (ΠΊΠΎΡ€Π΅Π½ commit)
  • Π•Π΄ΠΈΠ½ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π» = ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ commit
  • Π”Π²Π° Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΠΈ = commit ΠΎΡ‚ сливанС
  • Π’Ρ€ΠΈ ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΠΈ = октопусово сливанС (рядко, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΎ Π·Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π½ΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ Π΅Π΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ)
git log --oneline --graph --all    # Visualize the full DAG
git log --format="%H %P"           # Show each commit's SHA and parent SHA(s)

НСизмСняСмост Π½Π° commits ΠΈ прСнаписванС Π½Π° историята

Въй ΠΊΠ°Ρ‚ΠΎ SHA Π½Π° commit Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π΅Π½ ΠΎΡ‚ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ ΠΌΡƒ (Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ родитСлскитС SHA адрСси), всяко прСнаписванС създава Π½ΠΎΠ² commit с Π½ΠΎΠ² SHA. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠ°Ρ‚ΠΎ git rebase, git commit --amend ΠΈ git filter-repo Π½Π΅ промСнят историята β€” Ρ‚Π΅ ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚ ΠΏΠ°Ρ€Π°Π»Π΅Π»Π½Π° история. Π‘Ρ‚Π°Ρ€ΠΈΡ‚Π΅ commits остават Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈ Π΄ΠΎ ΡΡŠΠ±ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π±ΠΎΠΊΠ»ΡƒΠΊΠ°.

Π•Ρ‚ΠΎ Π·Π°Ρ‰ΠΎ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»Π½ΠΎΡ‚ΠΎ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅ Π½Π° прСнаписана история към сподСлСн ΠΊΠ»ΠΎΠ½ Π΅ Ρ€Π°Π·Ρ€ΡƒΡˆΠΈΡ‚Π΅Π»Π½ΠΎ: Π»ΠΎΠΊΠ°Π»Π½ΠΈΡ‚Π΅ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ Π½Π° ΡΡŠΡ‚Ρ€ΡƒΠ΄Π½ΠΈΡ†ΠΈΡ‚Π΅ всС ΠΎΡ‰Π΅ сочат към старата Π²Π΅Ρ€ΠΈΠ³Π° ΠΎΡ‚ commits.

КлоновС: Π›Π΅ΠΊΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ

ΠšΠ»ΠΎΠ½ΡŠΡ‚ Π½Π΅ Π΅ Π½ΠΈΡ‰ΠΎ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ 41-Π±Π°ΠΉΡ‚ΠΎΠ² Ρ„Π°ΠΉΠ», ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰ SHA-1 Ρ…Π΅Ρˆ. Π‘ΡŠΠ·Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΊΠ»ΠΎΠ½ Π΅ ΠΌΠΈΠ³Π½ΠΎΠ²Π΅Π½ΠΎ, нСзависимо ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Git записва само Π΅Π΄ΠΈΠ½ малък Ρ„Π°ΠΉΠ».

git branch feature/auth           # Create branch at current HEAD
git checkout -b feature/auth      # Create and switch in one step
git switch -c feature/auth        # Modern equivalent (Git 2.23+)
git branch -d feature/auth        # Delete (safe: refuses if unmerged)
git branch -D feature/auth        # Delete (force: regardless of merge status)

Π’ΡŠΡ‚Ρ€Π΅ΡˆΠ½Π° структура Π½Π° ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅Ρ‚Π΅

cat .git/refs/heads/main
# a3f1c9d8e2b1f4c7d9e0a1b2c3d4e5f6a7b8c9d0

ΠšΠΎΠ³Π°Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ commit Π²ΡŠΡ€Ρ…Ρƒ ΠΊΠ»ΠΎΠ½, Git записва новия SHA Π½Π° commit Π² Ρ‚ΠΎΠ·ΠΈ Ρ„Π°ΠΉΠ». Π’ΠΎΠ²Π° Π΅ цялото β€žΠΏΡ€ΠΈΠ΄Π²ΠΈΠΆΠ²Π°Π½Π΅ Π½Π° указатСля Π½Π° клона”.

ΠŸΡ€ΠΎΡΠ»Π΅Π΄ΡΠ²Π°Ρ‰ΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ ΠΈ конфигурация Π½Π° upstream

Π’Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π° Π·Π° прослСдяванС ΠΊΠ°Π·Π²Π° Π½Π° Git срСщу ΠΊΠΎΠΉ ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ ΠΊΠ»ΠΎΠ½ трябва Π΄Π° сравнява локалния ΠΊΠ»ΠΎΠ½ Π·Π° ΠΎΡ‚Ρ‡ΠΈΡ‚Π°Π½Π΅ Π½Π° git status Ρ€Π°Π·ΠΌΠΈΠ½Π°Π²Π°Π½Π΅ ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π° git pull.

git branch --set-upstream-to=origin/main main
git branch -vv    # Show tracking relationships and ahead/behind counts

Π’Π°Π³ΠΎΠ²Π΅: ΠŸΠΎΡΡ‚ΠΎΡΠ½Π½ΠΈ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€ΠΈ Π² историята

Π’Π°Π³ΠΎΠ²Π΅Ρ‚Π΅ ΠΌΠ°Ρ€ΠΊΠΈΡ€Π°Ρ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΈ commits ΠΊΠ°Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΠΌΠΈ β€” ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ вСрсии Π½Π° софтуСра. Π—Π° Ρ€Π°Π·Π»ΠΈΠΊΠ° ΠΎΡ‚ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅Ρ‚Π΅, Ρ‚Π°Π³ΠΎΠ²Π΅Ρ‚Π΅ Π½Π΅ сС прСмСстват ΠΎΡ‚ Π½ΠΎΠ²ΠΈ commits.

ЀункцияЛСк тагАнотиран Ρ‚Π°Π³
Π‘ΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅Π Π΅Ρ„Π΅Ρ€Π΅Π½Ρ‚Π΅Π½ Ρ„Π°ΠΉΠ», сочСщ към commitΠ’Π°Π³ ΠΎΠ±Π΅ΠΊΡ‚ Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈ
ΠœΠ΅Ρ‚Π°Π΄Π°Π½Π½ΠΈΠΡΠΌΠ°Π˜ΠΌΠ΅ Π½Π° тагиращия, ΠΈΠΌΠ΅ΠΉΠ», Π΄Π°Ρ‚Π°, ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅
GPG подписванСНС Π΅ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΠŸΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° сС Ρ‡Ρ€Π΅Π· git tag -s
ΠŸΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Π·Π° вСрсииНСДа
ΠŸΡ€Π΅Ρ…Π²ΡŠΡ€Π»ΡΠ½Π΅ с git push --tagsΠ”Π°Π”Π°
git tag v2.1.0                              # Lightweight tag at HEAD
git tag -a v2.1.0 -m "Release 2.1.0"       # Annotated tag
git tag -s v2.1.0 -m "Signed release"      # GPG-signed annotated tag
git push origin --tags                      # Push all tags to remote
git push origin v2.1.0                      # Push a specific tag

ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅Π½ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ: git push Π½Π΅ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π° Ρ‚Π°Π³ΠΎΠ²Π΅ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅. Π•ΠΊΠΈΠΏΠΈΡ‚Π΅ чСсто забравят Ρ‚ΠΎΠ²Π° ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Ρ‚ Π±Π΅Π»Π΅ΠΆΠΊΠΈ Π·Π° вСрсии, ΠΏΡ€Π΅ΠΏΡ€Π°Ρ‰Π°Ρ‰ΠΈ към Ρ‚Π°Π³, ΠΊΠΎΠΉΡ‚ΠΎ Π½Π΅ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π° Π² ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ΠΎΡ‚ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅.

ΠžΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°: Π Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ ΡΡŠΡ‚Ρ€ΡƒΠ΄Π½ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ

ΠžΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ΠΎΡ‚ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π΅ ΠΈΠΌΠ΅Π½ΡƒΠ²Π°Π½ URL адрСс, ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ Π² .git/config. ΠšΠ»ΠΎΠ½ΠΎΠ²Π΅Ρ‚Π΅ Π·Π° прослСдяванС Π½Π° ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° (ΠΏΠΎΠ΄ refs/remotes/) са Π»ΠΎΠΊΠ°Π»Π½ΠΈ снимки само Π·Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅ Π½Π° ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅Ρ‚Π΅ Π½Π° ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ΠΎΡ‚ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅, Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ само ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΈΠ·Ρ€ΠΈΡ‡Π½ΠΎ ΠΈΠ·Π²Π»ΠΈΡ‡Π°Ρ‚Π΅.

git remote add origin git@github.com:user/repo.git
git remote -v                          # List remotes with URLs
git remote set-url origin <new-url>    # Change a remote URL
git fetch origin                       # Update remote-tracking branches
git fetch --prune                      # Remove stale remote-tracking branches
git push origin main                   # Push local main to remote
git push -u origin feature/auth        # Push and set upstream tracking

ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²ΠΎ ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°

Π•Π΄Π½ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° прослСдява мноТСство ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° β€” Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Π½Π΅ Π½Π° fork Π·Π°Π΅Π΄Π½ΠΎ с upstream:

git remote add upstream git@github.com:original/repo.git
git fetch upstream
git merge upstream/main

ΠŸΡ€ΠΈ самостоятСлно хостванС Π½Π° bare Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Π½Π° dedicated server Π·Π° вашия Π΅ΠΊΠΈΠΏ, всСки Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ добавя ΡΡŠΡ€Π²ΡŠΡ€Π° ΠΊΠ°Ρ‚ΠΎ ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° SSH ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π° автСнтикация Π·Π° Π΄ΠΎΡΡ‚ΡŠΠΏ Π·Π° ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅.

Hooks: Автоматизирано ΠΏΡ€ΠΈΠ»Π°Π³Π°Π½Π΅ ΠΏΡ€ΠΈ всяко Git ΡΡŠΠ±ΠΈΡ‚ΠΈΠ΅

Hooks са изпълними скриптовС Π² .git/hooks/. Git Π³ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π° Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΎΡ‚ работния процСс. Π’Π΅ Π½Π΅ сС ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»ΡΡ‚ Ρ‡Ρ€Π΅Π· git clone ΠΈΠ»ΠΈ git push β€” всСки Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ (ΠΈΠ»ΠΈ ΡΡŠΡ€Π²ΡŠΡ€) трябва Π΄Π° Π³ΠΈ инсталира нСзависимо. Π’ΠΎΠ²Π° Π΅ чСста ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π·Π° ΠΎΠ±ΡŠΡ€ΠΊΠ²Π°Π½Π΅ Π² Π΅ΠΊΠΈΠΏΠ½ΠΈ срСди.

Hooks ΠΎΡ‚ страна Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°

HookЗадСйстванСЧСста ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°
pre-commitΠŸΡ€Π΅Π΄ΠΈ ΠΏΠΎΠ΄ΠΊΠ°Π½Π°Ρ‚Π° Π·Π° commit ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅Π›ΠΈΠ½Ρ‚ΠΈΡ€Π°Π½Π΅, сканиранС Π·Π° Ρ‚Π°ΠΉΠ½ΠΈ, изпълнСниС Π½Π° тСстовС
prepare-commit-msgΠ‘Π»Π΅Π΄ създаванС Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅Π’ΠΌΡŠΠΊΠ²Π°Π½Π΅ Π½Π° ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠ»ΠΎΠ½Π° Π² ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅Ρ‚ΠΎ
commit-msgΠ‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ потрСбитСлят напишС ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅Ρ‚ΠΎΠŸΡ€ΠΈΠ»Π°Π³Π°Π½Π΅ Π½Π° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π½Π° conventional commit
post-commitΠ‘Π»Π΅Π΄ записванС Π½Π° commitΠ›ΠΎΠΊΠ°Π»Π½ΠΈ извСстия
pre-pushΠŸΡ€Π΅Π΄ΠΈ изпълнСниС Π½Π° git pushИзпълнСниС Π½Π° пълСн Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ тСстовС
pre-rebaseΠŸΡ€Π΅Π΄ΠΈ стартиранС Π½Π° rebaseΠŸΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΡΠ²Π°Π½Π΅ Π½Π° rebase Π½Π° ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½ΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅

Hooks ΠΎΡ‚ страна Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π°

HookЗадСйстванСЧСста ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°
pre-receiveΠŸΡ€Π΅Π΄ΠΈ Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈΡ‚Π΅ΠŸΡ€ΠΈΠ»Π°Π³Π°Π½Π΅ Π½Π° Π·Π°Ρ‰ΠΈΡ‚Π° Π½Π° ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅, ΠΎΡ‚Ρ…Π²ΡŠΡ€Π»ΡΠ½Π΅ Π½Π° ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅
updateΠ—Π° всяка рСфСрСнция ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ΠŸΡ€ΠΈΠ»Π°Π³Π°Π½Π΅ Π½Π° ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° Π·Π° ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅
post-receiveΠ‘Π»Π΅Π΄ Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° всички рСфСрСнцииЗадСйстванС Π½Π° CI/CD, ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅ Π½Π° извСстия

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: Pre-commit hook Π·Π° ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π°Π½Π΅ Π½Π° Ρ‚Π°ΠΉΠ½ΠΈ

#!/usr/bin/env bash
# .git/hooks/pre-commit

if git diff --cached --name-only | xargs grep -lE '(AKIA|passwords*=|api_keys*=)' 2>/dev/null; then
    echo "ERROR: Potential secret detected in staged files. Commit aborted."
    exit 1
fi
exit 0

НаправСтС Π³ΠΎ изпълнимо:

chmod +x .git/hooks/pre-commit

Π—Π° разпространСниС Π½Π° hooks Π² цСлия Π΅ΠΊΠΈΠΏ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ инструмСнт ΠΊΠ°Ρ‚ΠΎ Husky (Node.js ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ) ΠΈΠ»ΠΈ ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°ΠΉΡ‚Π΅ hooks Π² дирСктория hooks/ Π² ΠΊΠΎΡ€Π΅Π½Π° Π½Π° Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ ΠΈ Π³ΠΈ ΡΠ²ΡŠΡ€Π·Π²Π°ΠΉΡ‚Π΅ символно ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° настройката Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Reflog: ΠŸΡ€Π΅Π΄ΠΏΠ°Π·Π½Π°Ρ‚Π° ΠΌΡ€Π΅ΠΆΠ°

Reflog записва всяко Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π½Π° HEAD ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈΡ‚Π΅ Π½Π° ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡƒΠ½ΠΈΡ‰ΠΎΠΆΠ°Π²Π°Ρ‚ историята (Ρ‚Π²ΡŠΡ€Π΄ΠΈ нулирания, rebase ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈ commits). Π‘ΡŠΡ…Ρ€Π°Π½ΡΠ²Π° сС Π² .git/logs/.

git reflog                          # Show HEAD movement history
git reflog show main                # Show movement history for a specific branch
git checkout HEAD@{3}               # Check out the state HEAD was in 3 moves ago
git branch recovered HEAD@{5}       # Recover commits by branching from a reflog entry

ЗаписитС Π² reflog ΠΈΠ·Ρ‚ΠΈΡ‡Π°Ρ‚ слСд 90 Π΄Π½ΠΈ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ (gc.reflogExpire). На производствСн ΡΡŠΡ€Π²ΡŠΡ€, помислСтС Π·Π° ΡƒΠ΄ΡŠΠ»ΠΆΠ°Π²Π°Π½Π΅ Π½Π° Ρ‚ΠΎΠ²Π°:

git config gc.reflogExpire 180
git config gc.reflogExpireUnreachable 30

Bare Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°: Π₯остванС ΠΎΡ‚ страна Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π°

Bare Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ няма Ρ€Π°Π±ΠΎΡ‚Π½Π° дирСктория. Π’ΠΎ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° само ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° .git/ Π½Π° ΠΊΠΎΡ€Π΅Π½Π½ΠΎ Π½ΠΈΠ²ΠΎ. Bare Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°Ρ‚Π° са правилният Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π·Π° Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΎ хостванС β€” Ρ‚Π΅ ΠΏΡ€ΠΈΠ΅ΠΌΠ°Ρ‚ изпращания Π±Π΅Π· услоТнСнията Π½Π° ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ ΠΊΠ»ΠΎΠ½.

git init --bare /srv/repos/myproject.git

ΠšΠΎΠ³Π°Ρ‚ΠΎ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Ρ‚Π΅ към GitHub, GitLab ΠΈΠ»ΠΈ самостоятСлно хостван Git ΡΡŠΡ€Π²ΡŠΡ€, ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Ρ‚Π΅ към bare Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅. Ако хостватС собствСн Git ΡΡŠΡ€Π²ΡŠΡ€ Π½Π° VPS с cPanel ΠΈΠ»ΠΈ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ Linux VPS, bare Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°Ρ‚Π° ΠΏΠΎΠ΄ /srv/repos/ с SSH Π΄ΠΎΡΡ‚ΡŠΠΏ са стандартната Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° сподСлСно bare Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅

# On the server
git init --bare --shared=group /srv/repos/project.git
chown -R git:developers /srv/repos/project.git

# On a developer's machine
git remote add origin git@yourserver.com:/srv/repos/project.git
git push -u origin main

Π‘ΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° Git ΠΎΠ±Π΅ΠΊΡ‚ΠΈ: Π Π°Π·ΠΌΠ΅Ρ€, цялостност ΠΈ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π·Π΄Ρ€Π°Π²Π΅Ρ‚ΠΎ Π½Π° Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ

git fsck --full          # Verify object integrity (finds dangling and corrupt objects)
git fsck --lost-found    # Write dangling objects to .git/lost-found/

НамиранС ΠΈ ΠΏΡ€Π΅ΠΌΠ°Ρ…Π²Π°Π½Π΅ Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ

Π‘Π»ΡƒΡ‡Π°ΠΉΠ½ΠΎ записанитС Π³ΠΎΠ»Π΅ΠΌΠΈ Π΄Π²ΠΎΠΈΡ‡Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ са чСста ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π·Π° Ρ€Π°Π·Π΄ΡƒΡ‚ΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°ΠΉΡ‚Π΅ Π³ΠΈ ΠΏΡ€Π΅Π΄ΠΈ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ git filter-repo Π·Π° отстраняванСто ΠΈΠΌ:

# Find the 10 largest objects by compressed size
git verify-pack -v .git/objects/pack/*.idx 
  | sort -k3 -rn 
  | head -10 
  | awk '{print $1}' 
  | xargs -I{} git cat-file -p {}
# Remove a file from all history (requires git-filter-repo)
git filter-repo --path path/to/large-file.bin --invert-paths

Π‘Π»Π΅Π΄ Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ, всички ΡΡŠΡ‚Ρ€ΡƒΠ΄Π½ΠΈΡ†ΠΈ трябва Π΄Π° ΠΊΠ»ΠΎΠ½ΠΈΡ€Π°Ρ‚ ΠΎΡ‚Π½ΠΎΠ²ΠΎ β€” Ρ‚Π΅Ρ…Π½ΠΈΡ‚Π΅ Π»ΠΎΠΊΠ°Π»Π½ΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° ΠΏΡ€Π΅ΠΏΡ€Π°Ρ‰Π°Ρ‚ към SHA Ρ…Π΅ΡˆΠΎΠ²Π΅, ΠΊΠΎΠΈΡ‚ΠΎ Π²Π΅Ρ‡Π΅ Π½Π΅ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‚ Π² прСнаписаната история.

Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅: ΠšΠ»ΡŽΡ‡ΠΎΠ²ΠΈ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ Π½Π° Git Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅

ΠšΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡΠ’ΠΈΠΏΠ˜Π·ΠΌΠ΅Π½ΡΠ΅ΠΌΠ‘ΡŠΡ…Ρ€Π°Π½ΡΠ²Π° сС Π²ΠŸΡ€Π΅Ρ…Π²ΡŠΡ€Π»Ρ сС ΠΏΡ€ΠΈ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅/ΠΈΠ·Π²Π»ΠΈΡ‡Π°Π½Π΅
BlobΠžΠ±Π΅ΠΊΡ‚ΠΠ΅.git/objects/Π”Π° (ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π΅ Π΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½)
TreeΠžΠ±Π΅ΠΊΡ‚ΠΠ΅.git/objects/Π”Π° (ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π΅ Π΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½)
CommitΠžΠ±Π΅ΠΊΡ‚ΠΠ΅.git/objects/Π”Π° (ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π΅ Π΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½)
Анотиран Ρ‚Π°Π³ΠžΠ±Π΅ΠΊΡ‚ΠΠ΅.git/objects/Π‘Π°ΠΌΠΎ с --tags
ΠšΠ»ΠΎΠ½Π Π΅Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΡΠ”Π°.git/refs/heads/Π”Π°
Клон Π·Π° прослСдяванС Π½Π° ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ΠΎ хранилищСРСфСрСнцияДа (ΠΏΡ€ΠΈ ΠΈΠ·Π²Π»ΠΈΡ‡Π°Π½Π΅).git/refs/remotes/НС (Π»ΠΎΠΊΠ°Π»Π΅Π½ кСш)
Π›Π΅ΠΊ тагРСфСрСнцияНС.git/refs/tags/Π‘Π°ΠΌΠΎ с --tags
HEADΠ‘ΠΈΠΌΠ²ΠΎΠ»Π½Π° рСфСрСнция/Ρ…Π΅ΡˆΠ”Π°.git/HEADНС
Π˜Π½Π΄Π΅ΠΊΡΠ”Π²ΠΎΠΈΡ‡Π΅Π½ Ρ„Π°ΠΉΠ»Π”Π°.git/indexНС
HooksΠ‘ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ²Π΅Π”Π°.git/hooks/НС
ReflogΠ–ΡƒΡ€Π½Π°Π»Π”Π° (Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ ΠΈΠ·Ρ‚ΠΈΡ‡Π°).git/logs/НС

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠ° ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Π·Π° Π²Π·Π΅ΠΌΠ°Π½Π΅ Π½Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈ основни ΠΈΠ·Π²ΠΎΠ΄ΠΈ

Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ Ρ‚ΠΎΠ·ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Π½ списък ΠΏΡ€ΠΈ настройванС ΠΈΠ»ΠΈ ΠΎΠ΄ΠΈΡ‚ΠΈΡ€Π°Π½Π΅ Π½Π° Git Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π² инфраструктурата Π²ΠΈ:

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅

  • Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ git init --bare --shared=group Π·Π° всяко Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π° изпращания ΠΎΡ‚ мноТСство ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ.
  • Π‘ΡŠΡ…Ρ€Π°Π½ΡΠ²Π°ΠΉΡ‚Π΅ bare Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° извън ΡƒΠ΅Π±-Π΄ΠΎΡΡ‚ΡŠΠΏΠ½ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ (Π½ΠΈΠΊΠΎΠ³Π° ΠΏΠΎΠ΄ /var/www/).

Π—Π΄Ρ€Π°Π²Π΅ Π½Π° Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈ

  • Π˜Π·ΠΏΡŠΠ»Π½ΡΠ²Π°ΠΉΡ‚Π΅ git fsck --full слСд всСки ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚ със ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΈΠ»ΠΈ Π³Ρ€Π΅ΡˆΠΊΠ° Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π°Ρ‚Π° систСма.
  • ΠŸΠ»Π°Π½ΠΈΡ€Π°ΠΉΡ‚Π΅ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π½ΠΎ git gc Π·Π° Π΄ΡŠΠ»Π³ΠΎΡ‚Ρ€Π°ΠΉΠ½ΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°; Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°ΠΉΡ‚Π΅ Π³ΠΎ Ρ‡Ρ€Π΅Π· cron Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π° Π²ΠΈ.
  • ΠΠ°Π±Π»ΡŽΠ΄Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° pack Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅ с git count-objects -vH; ΠΏΡ€ΠΎΡƒΡ‡Π΅Ρ‚Π΅, Π°ΠΊΠΎ броят Π½Π° свободнитС ΠΎΠ±Π΅ΠΊΡ‚ΠΈ надвиши 1 000.

Π₯ΠΈΠ³ΠΈΠ΅Π½Π° Π½Π° ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ ΠΈ Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ

  • Π˜Π·Ρ‚Ρ€ΠΈΠ²Π°ΠΉΡ‚Π΅ своСврСмСнно слСтитС ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅; остарСлитС Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ сС Π½Π°Ρ‚Ρ€ΡƒΠΏΠ²Π°Ρ‚ ΠΈ забавят ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈΡ‚Π΅ git fetch --prune.
  • Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ git fetch --prune Π² CI ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΠΈΡ‚Π΅, Π·Π° Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π΅Ρ‚Π΅ дСйствия Π²ΡŠΡ€Ρ…Ρƒ ΠΈΠ·Ρ‚Ρ€ΠΈΡ‚ΠΈ ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅.

Π Π°Π·Π³Ρ€ΡŠΡ‰Π°Π½Π΅ Π½Π° hooks

  • Никога Π½Π΅ Ρ€Π°Π·Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ Π½Π° .git/hooks/ Π·Π° ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° Π² цСлия Π΅ΠΊΠΈΠΏ β€” hooks Π½Π΅ сС ΠΊΠ»ΠΎΠ½ΠΈΡ€Π°Ρ‚. Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ вмСсто Ρ‚ΠΎΠ²Π° hooks pre-receive ΠΎΡ‚ страна Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π° ΠΈΠ»ΠΈ CI ΠΏΠΎΡ€Ρ‚Π°.
  • ΠžΠ΄ΠΈΡ‚ΠΈΡ€Π°ΠΉΡ‚Π΅ hooks ΠΎΡ‚ страна Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π° слСд всяко Π½Π°Π΄Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° Git ΡΡŠΡ€Π²ΡŠΡ€Π°; ΠΏΡŠΡ‚ΠΈΡ‰Π°Ρ‚Π° Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Π½Π° hooks ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС промСнят.

Бигурност Π½Π° самостоятСлно хостванитС ΡΡŠΡ€Π²ΡŠΡ€ΠΈ

  • ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Ρ‚Π΅ SSH Π΄ΠΎΡΡ‚ΡŠΠΏΠ° Π΄ΠΎ потрСбитСля git с ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»Π½ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ (command= Π² authorized_keys).
  • Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ git-shell ΠΊΠ°Ρ‚ΠΎ login shell Π·Π° потрСбитСля git, Π·Π° Π΄Π° ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΎ изпълнСниС Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ.
  • Π‘Π΄Π²ΠΎΠ΅Ρ‚Π΅ ΡΡŠΡ€Π²ΡŠΡ€Π° Π½Π° Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ си с Π²Π°Π»ΠΈΠ΄Π΅Π½ SSL сСртификат, Π°ΠΊΠΎ ΠΈΠ·Π»Π°Π³Π°Ρ‚Π΅ ΡƒΠ΅Π± интСрфСйс (Gitea, GitLab, cgit).

ΠŸΡ€Π΅Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° историята

  • Никога Π½Π΅ прСнаписвайтС историята Π½Π° ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅, сподСлСни с Π΄Ρ€ΡƒΠ³ΠΈ, Π±Π΅Π· ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½ΠΈΡ€Π°Π½ ΠΏΠ»Π°Π½ Π·Π° миграция.
  • Π‘Π»Π΅Π΄ git filter-repo, всички ΡΡŠΡ‚Ρ€ΡƒΠ΄Π½ΠΈΡ†ΠΈ трябва Π΄Π° ΠΊΠ»ΠΎΠ½ΠΈΡ€Π°Ρ‚ ΠΎΡ‚Π½ΠΎΠ²ΠΎ; Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°ΠΉΡ‚Π΅ URL адрСситС Π½Π° ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ΠΈΡ‚Π΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Π² CI/CD.

Π’ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ ΠΏΡ€ΠΈ авария

  • Π£Π΄ΡŠΠ»ΠΆΠ΅Ρ‚Π΅ ΠΈΠ·Ρ‚ΠΈΡ‡Π°Π½Π΅Ρ‚ΠΎ Π½Π° reflog Π½Π° производствСни ΡΡŠΡ€Π²ΡŠΡ€ΠΈ (gc.reflogExpire = 180).
  • ΠŸΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°ΠΉΡ‚Π΅ Π²Ρ‚ΠΎΡ€ΠΈΡ‡Π΅Π½ bare ΠΊΠ»ΠΎΠ½ΠΈΠ½Π³ Π½Π° ΠΎΡ‚Π΄Π΅Π»Π΅Π½ хост ΠΊΠ°Ρ‚ΠΎ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎ ΠΊΠΎΠΏΠΈΠ΅; прост git fetch ΠΎΡ‚ основния Π΅ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π΅Π½.

Π§Π—Π’

Каква Π΅ Ρ€Π°Π·Π»ΠΈΠΊΠ°Ρ‚Π° ΠΌΠ΅ΠΆΠ΄Ρƒ bare ΠΈ non-bare Git Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅?

Non-bare Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ ΠΈΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Π½Π° дирСктория, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅ са ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈ, плюс поддирСктория .git/, ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰Π° Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈ. Bare Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° само Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈ Π² ΠΊΠΎΡ€Π΅Π½Π° си (Π±Π΅Π· Ρ€Π°Π±ΠΎΡ‚Π½Π° дирСктория) ΠΈ Π΅ правилният Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π·Π° сподСлСн ΡΡŠΡ€Π²ΡŠΡ€, ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π° изпращания.

Мога Π»ΠΈ Π΄Π° Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²Ρ commits слСд изпълнСниС Π½Π° git reset --hard?

Π”Π°, стига commits Π΄Π° Π½Π΅ са ΡΡŠΠ±Ρ€Π°Π½ΠΈ ΠΎΡ‚ ΡΡŠΠ±ΠΈΡ€Π°Ρ‡Π° Π½Π° Π±ΠΎΠΊΠ»ΡƒΠΊ. Π˜Π·ΠΏΡŠΠ»Π½Π΅Ρ‚Π΅ git reflog, Π·Π° Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ SHA Π½Π° commit, ΠΊΠΎΠΉΡ‚ΠΎ искатС Π΄Π° Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚Π΅, слСд Ρ‚ΠΎΠ²Π° git checkout -b recovery-branch <SHA>, Π·Π° Π΄Π° Π³ΠΎ ΠΏΡ€ΠΈΠΊΠ°Ρ‡ΠΈΡ‚Π΅ към Π½ΠΎΠ² ΠΊΠ»ΠΎΠ½. ЗаписитС Π² reflog сС Π·Π°ΠΏΠ°Π·Π²Π°Ρ‚ 90 Π΄Π½ΠΈ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅.

Π—Π°Ρ‰ΠΎ git push Π½Π΅ ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»Ρ ΠΌΠΎΠΈΡ‚Π΅ Ρ‚Π°Π³ΠΎΠ²Π΅?

По Π΄ΠΈΠ·Π°ΠΉΠ½, git push ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»Ρ само commits, Π΄ΠΎΡΡ‚ΡŠΠΏΠ½ΠΈ ΠΎΡ‚ Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠ·Ρ€ΠΈΡ‡Π½ΠΎ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Ρ‚Π΅. Π’Π°Π³ΠΎΠ²Π΅Ρ‚Π΅ са ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ ΠΈ трябва Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΈΠ·ΠΏΡ€Π°Ρ‚Π΅Π½ΠΈ с git push origin --tags (всички Ρ‚Π°Π³ΠΎΠ²Π΅) ΠΈΠ»ΠΈ git push origin <tagname> (ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π΅Π½ Ρ‚Π°Π³).

Какво сС случва с индСкса ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ ΠΏΡ€ΠΈ сливанС?

Π˜Π½Π΄Π΅ΠΊΡΡŠΡ‚ ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° Π΅Π΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ Ρ‚Ρ€ΠΈΡ‚Π΅ вСрсии Π½Π° всСки ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π΅Π½ Ρ„Π°ΠΉΠ»: Π΅Ρ‚Π°ΠΏ 1 (ΠΎΠ±Ρ‰ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²Π΅Π½ΠΈΠΊ/Π±Π°Π·Π°), Π΅Ρ‚Π°ΠΏ 2 (Π²Π°ΡˆΠ°Ρ‚Π° вСрсия) ΠΈ Π΅Ρ‚Π°ΠΏ 3 (тяхната вСрсия). Нормалният git add записва само Π΅Ρ‚Π°ΠΏ 0 (Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½). Π”ΠΎΠΊΠ°Ρ‚ΠΎ всички ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΈ Π½Π΅ Π±ΡŠΠ΄Π°Ρ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈ ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²Π΅Π½ΠΈ, git commit Ρ‰Π΅ ΠΎΡ‚ΠΊΠ°ΠΆΠ΅ Π΄Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈ.

Как сС Ρ€Π°Π·Π»ΠΈΡ‡Π°Π²Π°Ρ‚ Git hooks ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π³Ρ€ΡŠΡ‰Π°Π½ΠΈΡ ΠΎΡ‚ страна Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ ΠΎΡ‚ страна Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π°?

Hooks ΠΎΡ‚ страна Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° сС ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚ Π½Π° ΠΌΠ°ΡˆΠΈΠ½Π°Ρ‚Π° Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΈ Π½Π΅ сС ΠΏΡ€ΠΈΠ»Π°Π³Π°Ρ‚ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»Π½ΠΎ β€” всСки Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΈ Π·Π°ΠΎΠ±ΠΈΠΊΠΎΠ»ΠΈ, ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·Ρ‚Ρ€ΠΈΠ΅ hook Ρ„Π°ΠΉΠ»Π°. Hooks ΠΎΡ‚ страна Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π° (pre-receive, update, post-receive) сС ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚ Π½Π° хостващия ΡΡŠΡ€Π²ΡŠΡ€ ΠΈ Π½Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Π·Π°ΠΎΠ±ΠΈΠΊΠΎΠ»Π΅Π½ΠΈ ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ Π³ΠΈ ΠΏΡ€Π°Π²ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π½Π°Ρ‚Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π·Π° ΠΏΡ€ΠΈΠ»Π°Π³Π°Π½Π΅ Π½Π° ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Π·Π° Π·Π°Ρ‰ΠΈΡ‚Π° Π½Π° ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅, изисквания Π·Π° ΠΏΡ€Π΅Π³Π»Π΅Π΄ Π½Π° ΠΊΠΎΠ΄ ΠΈ CI/CD задСйствания.