Π‘ΡΠΊΠΎΠ½ΠΎΠΌΡŒΡ‚Π΅ 15% Π½Π° всСх хостинговых услугах

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ свои Π½Π°Π²Ρ‹ΠΊΠΈ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ скидку Π½Π° любой Ρ‚Π°Ρ€ΠΈΡ„Π½Ρ‹ΠΉ ΠΏΠ»Π°Π½

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠ΄: Skills ΠΠ°Ρ‡Π°Ρ‚ΡŒ
Π ΡƒΠ±Ρ€ΠΈΠΊΠΈ
Linux

Git ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ ВСрсий: ΠŸΠΎΠ»Π½Ρ‹ΠΉ ВСхничСский Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ для Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ²

Git β€” это распрСдСлённая систСма контроля вСрсий (DVCS), которая записываСт снимки Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° с Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, позволяя Π»ΡŽΠ±ΠΎΠΌΡƒ количСству участников Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ, Π½Π΅ пСрСзаписывая измСнСния Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π°. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΏΠΎΠ»Π½ΡƒΡŽ копию рСпозитория β€” Π²ΠΊΠ»ΡŽΡ‡Π°Ρ всю ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² β€” Π½Π° своём локальном ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, Ρ‡Ρ‚ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π΅Π΄ΠΈΠ½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ ΠΎΡ‚ΠΊΠ°Π·Π° ΠΈ обСспСчиваСт ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π² ΠΎΡ„Π»Π°ΠΉΠ½-Ρ€Π΅ΠΆΠΈΠΌΠ΅.

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Линусом Π’ΠΎΡ€Π²Π°Π»ΡŒΠ΄ΡΠΎΠΌ Π² Π°ΠΏΡ€Π΅Π»Π΅ 2005 Π³ΠΎΠ΄Π° для Π·Π°ΠΌΠ΅Π½Ρ‹ BitKeeper Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ядра Linux, Git Π±Ρ‹Π» спроСктирован с нуля Π½Π° основС Ρ‚Ρ€Ρ‘Ρ… ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ: ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ, Ρ†Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹Ρ… распрСдСлённых Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… процСссов. Π­Ρ‚ΠΈ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°Π΅Ρ‚ Git ΠΎΡ‚ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²Π΅Π½Π½ΠΈΠΊΠΎΠ², ΠΈ ΠΎΠ±ΡŠΡΡΠ½ΡΡŽΡ‚, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠ½ остаётся Π΄ΠΎΠΌΠΈΠ½ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ VCS ΡƒΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ Π΄Π²ΡƒΡ… дСсятилСтий.

Π§Π΅ΠΌ Git отличаСтся ΠΎΡ‚ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… систСм контроля вСрсий

ПониманиС Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ Git Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ прямого сравнСния с Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ систСмами, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ Subversion (SVN) ΠΈΠ»ΠΈ CVS, Π³Π΄Π΅ СдинствСнный Π°Π²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹ΠΉ сСрвСр Ρ…Ρ€Π°Π½ΠΈΡ‚ каноничСский Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ повСрхностныС Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ ΠΊΠΎΠΏΠΈΠΈ.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Git (распрСдСлённый)SVN (Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ)
МодСль Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΡΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠ»ΠΎΠ½ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ узлСВонкая рабочая копия, история хранится Π½Π° сСрвСрС
Π Π°Π±ΠΎΡ‚Π° ΠΎΡ„Π»Π°ΠΉΠ½ΠŸΠΎΠ»Π½Ρ‹ΠΉ commit, branch, diff, logВолько Ρ‡Ρ‚Π΅Π½ΠΈΠ΅; ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ сСрвСра
Π‘Ρ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ Π²Π΅Ρ‚Π²Π»Π΅Π½ΠΈΡΠŸΠΎΡ‡Ρ‚ΠΈ нулСвая (манипуляция указатСлями)ДорогостоящСС ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ
Единая Ρ‚ΠΎΡ‡ΠΊΠ° ΠΎΡ‚ΠΊΠ°Π·Π°ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ β€” любой ΠΊΠ»ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΠ‘Π±ΠΎΠΉ сСрвСра останавливаСт всС ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹
БтратСгия слиянияВрёхстороннСС слияниС + rebaseВолько трёхстороннСС слияниС
Π¦Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ историиΠ₯Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ содСрТимого SHA-1/SHA-256ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π½ΠΎΠΌΠ΅Ρ€Π° Ρ€Π΅Π²ΠΈΠ·ΠΈΠΉ
Π—Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ ΡΠ΅Ρ‚ΠΈΠ’ΠΎΠ»ΡŒΠΊΠΎ для push/pull/fetchΠŸΠΎΡ‡Ρ‚ΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ
ЧастичноС извлСчСниСНС поддСрТиваСтся Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ΡΡ (sparse checkout)
ΠŸΠΎΡ€ΠΎΠ³ вхоТдСнияБолСС крутая Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ ΠΊΡ€ΠΈΠ²Π°ΡΠœΡΠ³Ρ‡Π΅ для Π²Π΅Ρ‚Π΅Ρ€Π°Π½ΠΎΠ² SVN
Π Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½Ρ‘Π½Π½ΠΎΡΡ‚ΡŒ (2024)~95% ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄Π£ΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠ΅ ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ срСды

РаспрСдСлённая модСль ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄Π°ΠΆΠ΅ Ссли хостинговая ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°, такая ΠΊΠ°ΠΊ GitHub, испытываСт сбой, Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠ»ΠΎΠ½ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° являСтся ΠΏΠΎΠ»Π½ΠΎΠΉ Π°Π²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΎΠΉ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠ΅ΠΉ всСй истории ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Основная Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°: Ρ‡Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ Git

Git Π½Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ Π΄ΠΈΡ„Ρ„Ρ‹. Он Ρ…Ρ€Π°Π½ΠΈΡ‚ снимки. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΄Π΅Ρ€Π΅Π²Π°, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ ΠΏΠΎΠ»Π½ΠΎΠ΅ состояниС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ отслСТиваСмого Ρ„Π°ΠΉΠ»Π° Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. Если Ρ„Π°ΠΉΠ» Π½Π΅ измСнился ΠΌΠ΅ΠΆΠ΄Ρƒ двумя ΠΊΠΎΠΌΠΌΠΈΡ‚Π°ΠΌΠΈ, Git Ρ…Ρ€Π°Π½ΠΈΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ blob, Π° Π½Π΅ Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ β€” ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊ Git достигаСт ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΠ»Π½ΠΎΡ‚Ρ‹ ΠΈ эффСктивности хранСния.

Π§Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Git (.git/objects/):

  • Blob β€” Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ΅ содСрТимоС Ρ„Π°ΠΉΠ»Π°, адрСсуСмоС ΠΏΠΎ SHA-Ρ…Π΅ΡˆΡƒ
  • Tree β€” список Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ² с Ρ…Π΅ΡˆΠ°ΠΌΠΈ blob ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π²
  • Commit β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π΄Π΅Ρ€Π΅Π²ΠΎ, ноль ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ², ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ Π°Π²Ρ‚ΠΎΡ€Π° ΠΈ сообщСниС
  • Tag β€” Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для ΠΌΠ°Ρ€ΠΊΠ΅Ρ€ΠΎΠ² Ρ€Π΅Π»ΠΈΠ·ΠΎΠ²

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ нСизмСняСм ΠΈ адрСсуСтся ΠΏΠΎ содСрТимому. ИзмСнСниС ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π° Π² любом Ρ„Π°ΠΉΠ»Π΅ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ SHA-Ρ…Π΅Ρˆ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ каскадно распространяСтся Π²Π²Π΅Ρ€Ρ… ΠΏΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ Π΄Π΅Ρ€Π΅Π²Π° ΠΈ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ². ИмСнно поэтому история Git криптографичСски Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π° ΠΎΡ‚ ΠΏΠΎΠ΄Π΄Π΅Π»ΠΊΠΈ β€” Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡˆΠ»Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚, Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² Ρ…Π΅ΡˆΠΈ всСх ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ².

ΠžΠ±Π»Π°ΡΡ‚ΡŒ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ (Ρ‚Π°ΠΊΠΆΠ΅ называСмая индСксом, хранится Π² .git/index) β€” это Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», содСрТащий ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΡ‹ΠΉ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚. Π­Ρ‚Π° трёхзонная модСль β€” рабочая дирСктория, индСкс, Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ β€” являСтся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ нСпонятой Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½ΠΎΠΉ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ Git ΠΈ источником Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° Π·Π°Ρ‚Ρ€ΡƒΠ΄Π½Π΅Π½ΠΈΠΉ Ρƒ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ².

Установка ΠΈ настройка Git

ΠŸΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ установку ΠΈ настройтС свою ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ. Git встраиваСт ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± Π°Π²Ρ‚ΠΎΡ€Π΅ Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°, Π° Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ настроСнная идСнтификация β€” ΠΎΠ΄Π½Π° ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространённых ΠΏΡ€ΠΈΡ‡ΠΈΠ½ Π·Π°ΠΏΡƒΡ‚Π°Π½Π½ΠΎΠΉ истории ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² Π² ΠΎΠ±Ρ‰ΠΈΡ… рСпозиториях.

# Verify installation
git --version

# Set global identity (stored in ~/.gitconfig)
git config --global user.name "Your Name"
git config --global user.email "you@example.com"

# Set default branch name to 'main' (modern convention)
git config --global init.defaultBranch main

# Set preferred editor for commit messages
git config --global core.editor "vim"

# Enable colored output
git config --global color.ui auto

# Verify configuration
git config --list

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ ΠΈΠΌΠ΅Π΅Ρ‚ ΡƒΡ€ΠΎΠ²Π½ΠΈ: --system (всС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ, /etc/gitconfig), --global (Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, ~/.gitconfig) ΠΈ --local (Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, .git/config). Π‘ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ области ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π±ΠΎΠ»Π΅Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΈΠ΅.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Git: ΠΏΠΎΠ»Π½Ρ‹ΠΉ справочник

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΈ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

git init создаёт Π½ΠΎΠ²Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, записывая Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ .git/ Π² Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ. ΠšΠΎΠΌΠΌΠΈΡ‚Ρ‹ ΠΏΡ€ΠΈ этом Π½Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ β€” Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ начинаСтся пустым.

git init
git init my-project        # Initialize into a new subdirectory
git init --bare repo.git   # Bare repository (no working tree, used for servers)

Π“ΠΎΠ»Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ refs β€” Π±Π΅Π· Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ. Π­Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ для ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ рСпозитория, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ push нСсколько Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ². Если Π²Ρ‹ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅Ρ‚Π΅ Git Π½Π° сСрвСрС VPS Hosting, всСгда ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΎΠ±Ρ‰ΠΈΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ ΠΊΠ°ΠΊ Π³ΠΎΠ»Ρ‹Π΅.

git clone создаёт ΠΏΠΎΠ»Π½ΡƒΡŽ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ копию ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ рСпозитория, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ всС Π²Π΅Ρ‚ΠΊΠΈ, Ρ‚Π΅Π³ΠΈ ΠΈ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ.

git clone https://github.com/user/repo.git
git clone git@github.com:user/repo.git          # SSH transport (preferred for auth)
git clone --depth 1 https://github.com/user/repo.git  # Shallow clone (latest commit only)
git clone --branch develop https://github.com/user/repo.git  # Clone specific branch

ΠŸΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚Π½Ρ‹Π΅ ΠΊΠ»ΠΎΠ½Ρ‹ (--depth) ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ для CI/CD-ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΠΎΠ², Π³Π΄Π΅ Π½ΡƒΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послСднСС состояниС, Π° Π½Π΅ полная история. Они Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠΎΠΊΡ€Π°Ρ‰Π°ΡŽΡ‚ врСмя клонирования Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π², Π½ΠΎ ΠΏΡ€Π΅ΠΏΡΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ опСрациям, зависящим ΠΎΡ‚ истории, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ git bisect.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° состояния

git status β€” Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ часто выполняСмая ΠΊΠΎΠΌΠ°Π½Π΄Π° Π² любом Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌ процСссС. Она ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ‚Ρ€Ρ‘Ρ…Π·ΠΎΠ½Π½ΠΎΠ΅ состояниС вашСго рСпозитория.

git status
git status -s    # Short format: two-column status codes
git status -sb   # Short format with branch info

git diff сравниваСт содСрТимоС ΠΌΠ΅ΠΆΠ΄Ρƒ Π·ΠΎΠ½Π°ΠΌΠΈ ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°ΠΌΠΈ.

git diff                    # Working directory vs. index (unstaged changes)
git diff --staged           # Index vs. last commit (what will be committed)
git diff HEAD               # Working directory vs. last commit (all changes)
git diff main..feature      # Compare tips of two branches
git diff abc123..def456     # Compare two specific commits
git diff --stat             # Show changed files and line counts only

git log ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΡ‚ Π³Ρ€Π°Ρ„ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ². Π•Π³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ β€” ΠΎΠ΄Π½ΠΈ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΌΠΎΡ‰Π½Ρ‹Ρ… ΠΈ Π½Π΅Π΄ΠΎΠΎΡ†Π΅Π½Ρ‘Π½Π½Ρ‹Ρ… возмоТностСй Git.

git log
git log --oneline --graph --decorate --all   # Visual branch graph
git log -p                                   # Show patch (diff) for each commit
git log --author="Jane"                      # Filter by author
git log --since="2 weeks ago"               # Filter by date
git log --grep="fix:"                        # Filter by commit message pattern
git log -- path/to/file                      # History of a specific file
git log --follow -- path/to/file             # Follow renames

ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡ --graph --oneline --decorate --all Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Π°, Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΎΠ² ΡΠΎΠ·Π΄Π°ΡŽΡ‚ для Π½Π΅Ρ‘ псСвдоним:

git config --global alias.lg "log --oneline --graph --decorate --all"

ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΈ ΠΊΠΎΠΌΠΌΠΈΡ‚

git add filename.py          # Stage a specific file
git add src/                 # Stage an entire directory
git add .                    # Stage all changes in current directory
git add -p                   # Interactive patch staging (stage hunks, not whole files)
git add -u                   # Stage modifications and deletions, but not new files

Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Π°Ρ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° (git add -p) β€” ΠΎΠ΄Π½Π° ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΌΠΎΡ‰Π½Ρ‹Ρ… ΠΈ Π½Π΅Π΄ΠΎΠΎΡ†Π΅Π½Ρ‘Π½Π½Ρ‹Ρ… возмоТностСй Git. Она позволяСт ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΈ Π²Ρ‹Π±ΠΎΡ€ΠΎΡ‡Π½ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„Π°ΠΉΠ»Π°, обСспСчивая Ρ‚ΠΎΡ‡Π½Ρ‹Π΅ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ Π΄Π°ΠΆΠ΅ ΠΊΠΎΠ³Π΄Π° рабочая дирСктория содСрТит нСсколько нСсвязанных ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.

git commit -m "feat: add OAuth2 token refresh logic"
git commit --amend           # Modify the most recent commit (message or content)
git commit --amend --no-edit # Amend content without changing the message
git commit -v                # Open editor showing full diff of staged changes

ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ: Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ измСняйтС ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Ρ‹ Π² ΠΎΠ±Ρ‰ΠΈΠΉ ΡƒΠ΄Π°Π»Ρ‘Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ. ИзмСнСниС пСрСзаписываСт Ρ…Π΅Ρˆ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°, вынуТдая ΠΊΠΎΠ»Π»Π΅Π³ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ rebase ΠΈΠ»ΠΈ сброс своих Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… Π²Π΅Ρ‚ΠΎΠΊ.

Push ΠΈ Pull

git push origin main
git push origin feature/auth     # Push a specific branch
git push -u origin feature/auth  # Push and set upstream tracking
git push --force-with-lease      # Safer force push (fails if remote has new commits)
git push origin --delete old-branch  # Delete a remote branch
git push --tags                  # Push all local tags

ΠŸΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ --force-with-lease вмСсто --force, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΡƒΡŽ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ. Π­Ρ‚ΠΎ провСряСт, Ρ‡Ρ‚ΠΎ Π½ΠΈΠΊΡ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π½Π΅ выполнял push с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° вашСго послСднСго fetch, прСдотвращая ΡΠ»ΡƒΡ‡Π°ΠΉΠ½ΡƒΡŽ ΠΏΠΎΡ‚Π΅Ρ€ΡŽ Π΄Π°Π½Π½Ρ‹Ρ….

git pull origin main
git pull --rebase origin main    # Fetch and rebase instead of merge
git pull --ff-only               # Only fast-forward; abort if a merge commit would be created

git fetch Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΡƒΠ΄Π°Π»Ρ‘Π½Π½Ρ‹Π΅ измСнСния, Π½Π΅ затрагивая Π²Π°ΡˆΡƒ Ρ€Π°Π±ΠΎΡ‡ΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ ΠΈΠ»ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π²Π΅Ρ‚ΠΊΡƒ. Π­Ρ‚ΠΎ бСзопасный способ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ измСнСния ΠΈΠ· upstream ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΡ… ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠ΅ΠΉ.

git fetch origin
git fetch --all          # Fetch from all remotes
git fetch --prune        # Remove remote-tracking branches that no longer exist upstream

Π’Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ слияниС: основной Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ процСсс

МодСль вСтвлСния Git β€” Π΅Ρ‘ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½ΠΎ значимая ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ. Π’Π΅Ρ‚ΠΊΠ° β€” это просто ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ (Ρ„Π°ΠΉΠ» Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 41 Π±Π°ΠΉΡ‚ Π² .git/refs/heads/) Π½Π° Ρ…Π΅Ρˆ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π²Π΅Ρ‚ΠΊΠΈ происходит ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ нСзависимо ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° рСпозитория.

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Π΅Ρ‚ΠΊΠ°ΠΌΠΈ

git branch                        # List local branches
git branch -a                     # List all branches (local and remote-tracking)
git branch -v                     # List branches with last commit info
git branch feature/user-auth      # Create a new branch
git branch -d feature/user-auth   # Delete merged branch
git branch -D feature/user-auth   # Force delete (even if unmerged)
git branch -m old-name new-name   # Rename a branch

ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π²Π΅Ρ‚ΠΎΠΊ

Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Git (2.23+) раздСляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ git checkout Π½Π° Π΄Π²Π΅ спСциализированныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

git switch main                   # Switch to existing branch
git switch -c feature/payments    # Create and switch in one step
git restore filename.py           # Discard working directory changes to a file
git restore --staged filename.py  # Unstage a file (remove from index)

git checkout ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ для всСго этого, Π½ΠΎ git switch ΠΈ git restore ΠΈΠΌΠ΅ΡŽΡ‚ Π±ΠΎΠ»Π΅Π΅ Ρ‡Ρ‘Ρ‚ΠΊΡƒΡŽ ΠΈ ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΡƒΡŽ сСмантику ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ Π² соврСмСнных Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… процСссах.

Π‘Ρ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΠΈ слияния

git merge feature/user-auth           # Standard merge (creates merge commit if needed)
git merge --no-ff feature/user-auth   # Always create merge commit (preserves branch topology)
git merge --squash feature/user-auth  # Squash all branch commits into one staged change
git merge --abort                     # Abort an in-progress conflicted merge

БлияниС с ΠΏΠ΅Ρ€Π΅ΠΌΠΎΡ‚ΠΊΠΎΠΉ Π²ΠΏΠ΅Ρ€Ρ‘Π΄ (fast-forward) происходит, ΠΊΠΎΠ³Π΄Π° цСлСвая Π²Π΅Ρ‚ΠΊΠ° Π½Π΅ Ρ€Π°ΡΡ…ΠΎΠ΄ΠΈΠ»Π°ΡΡŒ с исходной β€” Git просто ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π²ΠΏΠ΅Ρ€Ρ‘Π΄. ΠšΠΎΠΌΠΌΠΈΡ‚ слияния ΠΏΡ€ΠΈ этом Π½Π΅ создаётся. --no-ff ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ создаёт ΠΊΠΎΠΌΠΌΠΈΡ‚ слияния Π΄Π°ΠΆΠ΅ Π² этом случаС, Ρ‡Ρ‚ΠΎ сохраняСт Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ Π²Π΅Ρ‚ΠΎΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² git log --graph.

БлияниС со сТатиСм (squash merge) ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ всС ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ ΠΈΠ· Π²Π΅Ρ‚ΠΊΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π·Π°Ρ‚Π΅ΠΌ фиксируСтся Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. Π­Ρ‚ΠΎ создаёт Ρ‡ΠΈΡΡ‚ΡƒΡŽ Π»ΠΈΠ½Π΅ΠΉΠ½ΡƒΡŽ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ Π² main, Π½ΠΎ отбрасываСт Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΡƒΡŽ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² Π²Π΅Ρ‚ΠΊΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Rebase

git rebase воспроизводит ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠΈ ΠΏΠΎΠ²Π΅Ρ€Ρ… Π΄Ρ€ΡƒΠ³ΠΎΠΉ, пСрСзаписывая ΠΈΡ… Ρ…Π΅ΡˆΠΈ для создания Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ истории.

git rebase main                  # Rebase current branch onto main
git rebase -i HEAD~5             # Interactive rebase: edit last 5 commits
git rebase --onto main server client  # Transplant client branch onto main, excluding server
git rebase --abort               # Abort a rebase in progress
git rebase --continue            # Continue after resolving a conflict

Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ rebase (-i) β€” ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ инструмСнт для поддСрТания чистоты ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ². Он позволяСт ΠΏΠ΅Ρ€Π΅ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡ΠΈΠ²Π°Ρ‚ΡŒ, ΡΠΆΠΈΠΌΠ°Ρ‚ΡŒ, Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ ΠΈΠ»ΠΈ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΡ… ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ. Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹ΠΉ сцСнарий использования: очистка Π·Π°ΠΏΡƒΡ‚Π°Π½Π½ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ΠΌ pull request.

Π‘Ρ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡΠ˜ΡΡ‚ΠΎΡ€ΠΈΡΠ‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ использованияРиск
Merge (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ)НСлинСйная, сохраняСт Π²Π΅Ρ‚ΠΊΠΈΠ”ΠΎΠ»Π³ΠΎΠΆΠΈΠ²ΡƒΡ‰ΠΈΠ΅ Π²Π΅Ρ‚ΠΊΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉΠ—Π°ΡˆΡƒΠΌΠ»Ρ‘Π½Π½Ρ‹ΠΉ `git log`
Merge `–no-ff`НСлинСйная, явныС ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ ΡΠ»ΠΈΡΠ½ΠΈΡΠŸΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ топология вСтокАналогично ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌΡƒ
Merge `–squash`ЛинСйная, ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠΌΠΌΠΈΡ‚ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽΠ§ΠΈΡΡ‚Π°Ρ основная вСткаВСряСтся Π΄Π΅Ρ‚Π°Π»ΡŒΠ½Π°Ρ история
RebaseЛинСйная, Π±Π΅Π· ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² слиянияЛичныС Π²Π΅Ρ‚ΠΊΠΈ, очистка ΠΏΠ΅Ρ€Π΅Π΄ PRΠŸΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡ‹Π²Π°Π΅Ρ‚ Ρ…Π΅ΡˆΠΈ; опасно Π½Π° ΠΎΠ±Ρ‰ΠΈΡ… Π²Π΅Ρ‚ΠΊΠ°Ρ…
Cherry-pickВыборочная, линСйнаяБэкпортированиС исправлСнийДублированиС ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Π΅Ρ‚ΠΊΠ°ΠΌΠΈ

Π—ΠΎΠ»ΠΎΡ‚ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ rebase: Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ выполняйтС rebase ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ², ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π² ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠΉ ΠΎΠ±Ρ‰Π΅ΠΉ Π²Π΅Ρ‚ΠΊΠ΅. Rebase пСрСзаписываСт Ρ…Π΅ΡˆΠΈ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ². Если ΠΊΠΎΠ»Π»Π΅Π³Π° основал свою Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π° этих ΠΊΠΎΠΌΠΌΠΈΡ‚Π°Ρ…, Π΅Π³ΠΎ история разойдётся, ΠΈ Π΅ΠΌΡƒ придётся Π±ΠΎΠ»Π΅Π·Π½Π΅Π½Π½ΠΎ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π΅Ρ‘ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ.

Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² слияния

ΠšΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚, ΠΊΠΎΠ³Π΄Π° Π΄Π²Π΅ Π²Π΅Ρ‚ΠΊΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ„Π°ΠΉΠ»Π°. Git ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π΅Ρ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ Π² Ρ„Π°ΠΉΠ»Π΅ стандартными ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Π°ΠΌΠΈ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π°:

<<<<<<< HEAD
const timeout = 30000;
=======
const timeout = 60000;
>>>>>>> feature/increase-timeout

Π Π°Π±ΠΎΡ‡ΠΈΠΉ процСсс Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ:

# After a conflicted merge or rebase
git status                    # Identify conflicted files (marked as "both modified")
# Edit each conflicted file, remove markers, keep correct content
git add resolved-file.js      # Mark as resolved
git commit                    # Complete the merge (message is pre-populated)

Для слоТных ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² инструмСнт трёхстороннСго слияния обСспСчиваСт Π±ΠΎΠ»Π΅Π΅ наглядноС прСдставлСниС:

git mergetool                 # Launch configured merge tool (vimdiff, meld, etc.)
git config --global merge.tool vimdiff

ΠžΡ‚ΠΌΠ΅Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ: ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ

Π’Ρ‹Π±ΠΎΡ€ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ β€” ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространённых способов ΠΏΠΎΡ‚Π΅Ρ€ΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈΠ»ΠΈ ΠΏΠΎΠ²Ρ€Π΅Π΄ΠΈΡ‚ΡŒ ΠΎΠ±Ρ‰ΡƒΡŽ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ. ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π±ΠΎΡ€ зависит ΠΎΡ‚ Π΄Π²ΡƒΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…: Π³Π΄Π΅ находится ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈ Π±Ρ‹Π»ΠΎ Π»ΠΈ ΠΎΠ½ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ΠΎ.

Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉΠšΠΎΠΌΠ°Π½Π΄Π°ΠŸΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡ‹Π²Π°Π΅Ρ‚ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽΠ‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ Π² ΠΎΠ±Ρ‰Π΅ΠΉ Π²Π΅Ρ‚ΠΊΠ΅
Π£Π±Ρ€Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» ΠΈΠ· ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ`git restore –staged file`НСтДа
ΠžΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ измСнСния Π² Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ`git restore file`НСтДа
ΠžΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ послСдний ΠΊΠΎΠΌΠΌΠΈΡ‚, ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ измСнСния ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΌΠΈ`git reset –soft HEAD~1`ДаНСт
ΠžΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ послСдний ΠΊΠΎΠΌΠΌΠΈΡ‚, ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ измСнСния Π½Π΅ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΌΠΈ`git reset HEAD~1`ДаНСт
ΠžΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ послСдний ΠΊΠΎΠΌΠΌΠΈΡ‚, ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ всС измСнСния`git reset –hard HEAD~1`ДаНСт
БСзопасно ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚`git revert <hash>`НСтДа
Π£Π΄Π°Π»ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» ΠΈΠ· всСй истории`git filter-repo`ДаНСт
git reset --soft HEAD~1      # Undo commit, keep changes in index
git reset HEAD~1             # Undo commit, keep changes in working dir
git reset --hard HEAD~1      # Undo commit, discard all changes permanently

git revert abc1234           # Create new commit that inverts abc1234
git revert HEAD~3..HEAD      # Revert last 3 commits (creates 3 revert commits)
git revert -n HEAD~3..HEAD   # Stage the reversals without committing (batch revert)

git reset --hard Π½Π΅ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄ Git. Если Π²Ρ‹ случайно Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ Π΅Π³ΠΎ, СдинствСнный ΠΏΡƒΡ‚ΡŒ ΠΊ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡŽ β€” git reflog, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ записываСт ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π» HEAD, ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ 90 Π΄Π½Π΅ΠΉ.

git reflog                   # Show HEAD movement history with hashes
git checkout -b recovery abc1234  # Recover by creating a branch at the lost commit

ΠŸΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для производствСнных Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… процСссов

git stash

git stash сохраняСт Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΈ индСкса Π² стСк, прСдоставляя чистоС Ρ€Π°Π±ΠΎΡ‡Π΅Π΅ Π΄Π΅Ρ€Π΅Π²ΠΎ для ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ контСкста.

git stash                        # Stash tracked changes
git stash -u                     # Include untracked files
git stash push -m "WIP: auth refactor"  # Stash with a descriptive name
git stash list                   # List all stash entries
git stash pop                    # Apply most recent stash and remove it from stack
git stash apply stash@{2}        # Apply specific stash without removing it
git stash drop stash@{2}         # Delete a specific stash entry
git stash branch feature/wip     # Create a new branch from a stash

git cherry-pick

git cherry-pick abc1234                    # Apply a single commit to current branch
git cherry-pick abc1234 def5678            # Apply multiple commits
git cherry-pick abc1234 --no-commit        # Apply changes without committing
git cherry-pick main~3..main              # Apply a range of commits

Cherry-pick β€” стандартный ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ для бэкпортирования исправлСний ошибок Π² Π²Π΅Ρ‚ΠΊΠΈ обслуТивания. Если Π²Ρ‹ исправляСтС ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ бСзопасности Π² main, Π²Ρ‹ выполняСтС cherry-pick этого ΠΊΠΎΠΌΠΌΠΈΡ‚Π° Π² v2.1-stable ΠΈ v2.0-stable Π±Π΅Π· слияния нСсвязанных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

git bisect

git bisect выполняСт Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск ΠΏΠΎ истории ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² для нахоТдСния Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±Ρ‹Π»Π° Π²Π²Π΅Π΄Π΅Π½Π° ошибка. Π­Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΌΠΎΡ‰Π½Ρ‹Ρ… ΠΈ малоизвСстных инструмСнтов ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Git.

git bisect start
git bisect bad                   # Mark current commit as broken
git bisect good v2.3.0           # Mark a known-good commit or tag
# Git checks out the midpoint commit automatically
# Test your code, then:
git bisect good                  # If this commit is fine
git bisect bad                   # If this commit is broken
# Repeat until Git identifies the first bad commit
git bisect reset                 # Return to original HEAD when done

Π’ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ с 1 000 ΠΊΠΎΠΌΠΌΠΈΡ‚Π°ΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΈ ΠΏΠ»ΠΎΡ…ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ git bisect Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Π²ΠΈΠ½ΠΎΠ²Π½ΠΈΠΊΠ° Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π·Π° 10 шагов.

git tag

Π’Π΅Π³ΠΈ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°ΡŽΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡ΠΈΠΌΡ‹Π΅ β€” ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, вСрсии Ρ€Π΅Π»ΠΈΠ·ΠΎΠ².

git tag v1.4.2                          # Lightweight tag (just a pointer)
git tag -a v1.4.2 -m "Release 1.4.2"   # Annotated tag (recommended; stores metadata)
git tag -a v1.4.2 abc1234              # Tag a specific past commit
git push origin v1.4.2                 # Push a specific tag
git push origin --tags                 # Push all tags
git tag -d v1.4.2                      # Delete local tag
git push origin --delete v1.4.2        # Delete remote tag

ВсСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ‚Π΅Π³ΠΈ для Ρ€Π΅Π»ΠΈΠ·ΠΎΠ². Они хранят имя, email, Π΄Π°Ρ‚Ρƒ ΠΈ сообщСниС создатСля Ρ‚Π΅Π³Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ подписаны с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GPG. Π›Ρ‘Π³ΠΊΠΈΠ΅ Ρ‚Π΅Π³ΠΈ подходят Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… Π·Π°ΠΊΠ»Π°Π΄ΠΎΠΊ.

git worktree

git worktree позволяСт ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ нСсколько Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ рСпозитория β€” ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠ΅. Π­Ρ‚ΠΎ устраняСт Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² stash ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΌΠΈΡ‚Π΅ Π½Π΅Π·Π°Π²Π΅Ρ€ΡˆΡ‘Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ Π½Π° hotfix.

git worktree add ../hotfix-branch hotfix/critical-auth-bug
git worktree list
git worktree remove ../hotfix-branch

Π­Ρ‚ΠΎ особСнно Ρ†Π΅Π½Π½ΠΎ Π½Π° Dedicated Server, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΌ с CI/CD-ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΠΎΠΌ, Π³Π΄Π΅ нСскольким Π·Π°Π΄Π°Ρ‡Π°ΠΌ сборки трСбуСтся ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ доступ ΠΊ Ρ€Π°Π·Π½Ρ‹ΠΌ Π²Π΅Ρ‚ΠΊΠ°ΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ рСпозитория Π±Π΅Π· Π²Π·Π°ΠΈΠΌΠ½Ρ‹Ρ… ΠΏΠΎΠΌΠ΅Ρ….

Π Π°Π±ΠΎΡ‡ΠΈΠ΅ процСссы Git для ΠΊΠΎΠΌΠ°Π½Π΄

ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ стратСгия вСтвлСния зависит ΠΎΡ‚ частоты выпусков ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Ρ€ΠΈ Π΄ΠΎΠΌΠΈΠ½ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ:

Π Π°Π±ΠΎΡ‡ΠΈΠΉ процСсс с Π²Π΅Ρ‚ΠΊΠ°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

КаТдая функция ΠΈΠ»ΠΈ исправлСниС ΠΆΠΈΠ²Ρ‘Ρ‚ Π² собствСнной Π²Π΅Ρ‚ΠΊΠ΅. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ pull request для слияния Π² main. ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΈ эффСктивный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΊΠΎΠΌΠ°Π½Π΄.

Gitflow

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ Π΄ΠΎΠ»Π³ΠΎΠΆΠΈΠ²ΡƒΡ‰ΠΈΠ΅ Π²Π΅Ρ‚ΠΊΠΈ main ΠΈ develop, Π° Ρ‚Π°ΠΊΠΆΠ΅ краткосрочныС Π²Π΅Ρ‚ΠΊΠΈ feature/, release/ ΠΈ hotfix/ со строгими ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌΠΈ слияния. ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния с явными вСрсионированными Ρ€Π΅Π»ΠΈΠ·Π°ΠΌΠΈ (Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½Ρ‹Π΅ прилоТСния).

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° основС trunk

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ коммитят Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π² main (ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΡ‡Π΅Π½ΡŒ краткосрочныС Π²Π΅Ρ‚ΠΊΠΈ, сливаСмыС Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ дня). Π’ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ΅Ρ€Π΅ опираСтся Π½Π° Ρ„Π»Π°Π³ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для скрытия Π½Π΅Π·Π°Π²Π΅Ρ€ΡˆΡ‘Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹. ΠŸΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π° для высокоскоростных ΠΊΠΎΠΌΠ°Π½Π΄, ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΡƒΡŽΡ‰ΠΈΡ… Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠ΅ Ρ€Π°Π·Π²Ρ‘Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅.

Π Π°Π±ΠΎΡ‡ΠΈΠΉ процСссЧастота выпусковРазмСр ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ CI/CD
Feature BranchΠ“ΠΈΠ±ΠΊΠ°ΡΠ›ΡŽΠ±ΠΎΠΉΠΠΈΠ·ΠΊΠ°Ρ
GitflowΠŸΠ»Π°Π½ΠΎΠ²Ρ‹Π΅ Ρ€Π΅Π»ΠΈΠ·Ρ‹Π‘Ρ€Π΅Π΄Π½ΠΈΠΉβ€“ΠšΡ€ΡƒΠΏΠ½Ρ‹ΠΉΠ‘Ρ€Π΅Π΄Π½ΡΡ
Trunk-BasedНСпрСрывноС Ρ€Π°Π·Π²Ρ‘Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅Π›ΡŽΠ±ΠΎΠΉΠ’Ρ‹ΡΠΎΠΊΠ°Ρ

Π₯остинг Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π² Git: ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ хостинг vs. управляСмыС ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹

Для ΠΊΠΎΠΌΠ°Π½Π΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ трСбуСтся сувСрСнитСт Π΄Π°Π½Π½Ρ‹Ρ…, соотвСтствиС Π½ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ трСбованиям ΠΈΠ»ΠΈ частная инфраструктура, ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ хостинг Git-сСрвСра являСтся ТизнСспособным ΠΈ Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌ Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ. Π’Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Gitea (Π»Ρ‘Π³ΠΊΠΈΠΉ, Π½Π° основС Go), GitLab CE (полная DevOps-ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°) ΠΈ Forgejo (Ρ„ΠΎΡ€ΠΊ Gitea с ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ сообщСства).

ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ‰Ρ‘Π½Π½Ρ‹ΠΉ экзСмпляр Gitea ΠΊΠΎΠΌΡ„ΠΎΡ€Ρ‚Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° ΠΏΠ»Π°Π½Π΅ VPS Hosting с 2 vCPU ΠΈ 2 GB RAM. Для Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈΠ»ΠΈ GitLab CE с CI-Ρ€Π°Π½Π½Π΅Ρ€Π°ΠΌΠΈ практичСский ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ составляСт 4–8 GB RAM.

ΠŸΡ€ΠΈ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ хостингС Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚Π΅ свой Git-сСрвСр с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ:

  • АутСнтификации ΠΏΠΎ SSH-ΠΊΠ»ΡŽΡ‡Ρƒ (ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΏΠΎ ΠΏΠ°Ρ€ΠΎΠ»ΡŽ)
  • HTTPS с Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ сСртификатом β€” SSL Certificates Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΡƒΡ‡Ρ‘Ρ‚Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅
  • ΠŸΡ€Π°Π²ΠΈΠ» брандмауэра, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… доступ ΠΊ Git-ΠΏΠΎΡ€Ρ‚Ρƒ (22 ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ SSH-ΠΏΠΎΡ€Ρ‚, 443 для HTTPS)
  • РСгулярных автоматичСских Ρ€Π΅Π·Π΅Ρ€Π²Π½Ρ‹Ρ… ΠΊΠΎΠΏΠΈΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ Π³ΠΎΠ»ΠΎΠ³ΠΎ рСпозитория .git
  • Π‘Π΅ΠΊΡ€Π΅Ρ‚ΠΎΠ² webhook для ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΉ CI/CD

Для ΠΊΠΎΠΌΠ°Π½Π΄, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρ‹ развёртывания Π½Π° основС Git ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… Π²Π΅Π±-инфраструктурой, сочСтаниС ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ‰Ρ‘Π½Π½ΠΎΠ³ΠΎ Git-сСрвСра с VPS with cPanel Π΄Π°Ρ‘Ρ‚ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ…ΡƒΠΊΠΈ развёртывания наряду с ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ инструмСнтами управлСния хостингом.

Git-Ρ…ΡƒΠΊΠΈ: автоматизация контроля качСства

Git-Ρ…ΡƒΠΊΠΈ β€” это скрипты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ автоматичСски Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… Ρ‚ΠΎΡ‡ΠΊΠ°Ρ… ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π° Git. Они находятся Π² .git/hooks/ ΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π΅ Ρ„ΠΈΠΊΡΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ‚Π°ΠΊΠΎΠΉ инструмСнт, ΠΊΠ°ΠΊ pre-commit ΠΈΠ»ΠΈ husky, для ΠΈΡ… совмСстного использования).

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ Ρ…ΡƒΠΊΠΈ для производствСнных Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… процСссов:

Π₯ΡƒΠΊΠ’Ρ€ΠΈΠ³Π³Π΅Ρ€Π’ΠΈΠΏΠΈΡ‡Π½ΠΎΠ΅ использованиС
`pre-commit`ΠŸΠ΅Ρ€Π΅Π΄ созданиСм коммитаЗапуск Π»ΠΈΠ½Ρ‚Π΅Ρ€ΠΎΠ², Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‚Π΅Ρ€ΠΎΠ², тСстов
`commit-msg`ПослС написания сообщСния ΠΊΠΎΠΌΠΌΠΈΡ‚Π°Π‘ΠΎΠ±Π»ΡŽΠ΄Π΅Π½ΠΈΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° conventional commit
`pre-push`ΠŸΠ΅Ρ€Π΅Π΄ push Π½Π° ΡƒΠ΄Π°Π»Ρ‘Π½Π½Ρ‹ΠΉ сСрвСрЗапуск ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π° тСстов
`post-receive`ПослС получСния push ΡƒΠ΄Π°Π»Ρ‘Π½Π½Ρ‹ΠΌ сСрвСромЗапуск развёртывания, ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ
`pre-rebase`ΠŸΠ΅Ρ€Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΠΌ rebaseΠŸΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ rebase ΠΎΠ±Ρ‰ΠΈΡ… Π²Π΅Ρ‚ΠΎΠΊ
# Example pre-commit hook: reject commits with debug print statements
#!/bin/bash
if git diff --cached | grep -E '^+.*(console.log|debugger|print("DEBUG)'; then
  echo "ERROR: Debug statement detected. Remove before committing."
  exit 1
fi

Π₯ΡƒΠΊ post-receive Π½Π° Π³ΠΎΠ»ΠΎΠΌ сСрвСрном Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ β€” основа простого развёртывания Π½Π° основС Git: push Π½Π° сСрвСр, Ρ…ΡƒΠΊ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ HEAD Π² ΠΊΠΎΡ€Π΅Π½ΡŒ Π²Π΅Π±-сСрвСра, выполняСт шаги сборки ΠΈ пСрСзапускаСт сСрвисы β€” Π±Π΅Π· нСобходимости Π²ΠΎ внСшнСй CI-ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅.

.gitignore: ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ чистоты Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π²

Π€Π°ΠΉΠ» .gitignore ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Git, ΠΊΠ°ΠΊΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ нСотслСТиваСмыми. Он Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ зафиксирован Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ ΠΈ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ.

# Dependencies
node_modules/
vendor/

# Build artifacts
dist/
build/
*.o
*.pyc
__pycache__/

# Environment and secrets β€” NEVER commit these
.env
.env.local
*.pem
*.key
config/secrets.yml

# IDE files
.idea/
.vscode/
*.swp

# OS files
.DS_Store
Thumbs.db

ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠ°Ρ Π»ΠΎΠ²ΡƒΡˆΠΊΠ°: Ссли Ρ„Π°ΠΉΠ» ΡƒΠΆΠ΅ отслСТивался Π΄ΠΎ добавлСния Π² .gitignore, Git ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ Π΅Π³ΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ. НСобходимо явно ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ отслСТиваниС:

git rm --cached path/to/sensitive-file
git commit -m "chore: stop tracking secrets file"

Никогда Π½Π΅ фиксируйтС ΡƒΡ‡Ρ‘Ρ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, API-ΠΊΠ»ΡŽΡ‡ΠΈ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ β€” Π΄Π°ΠΆΠ΅ Π² ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΠΌ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния, ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρ‹ сСкрСтов (HashiCorp Vault, AWS Secrets Manager) ΠΈΠ»ΠΈ Ρ„Π°ΠΉΠ»Ρ‹ .env, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ Π² .gitignore.

Настройка ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π²

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ Git Π΄Π΅Π³Ρ€Π°Π΄ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π° рСпозиториях с ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π°ΠΌΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ»ΠΈ Π³ΠΈΠ³Π°Π±Π°ΠΉΡ‚Π°ΠΌΠΈ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… рСсурсов. Π‘Ρ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΠΈ смягчСния:

  • Git LFS (Large File Storage): замСняСт большиС Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ-указатСлями Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ ΠΈ Ρ…Ρ€Π°Π½ΠΈΡ‚ фактичСскоС содСрТимоС Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ LFS-сСрвСрС. НСобходим для Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π², содСрТащих ΠΌΠ΅Π΄ΠΈΠ°Ρ„Π°ΠΉΠ»Ρ‹, вСса ML-ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΈΠ»ΠΈ скомпилированныС Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹.
  • ЧастичноС ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅: git clone --filter=blob:none Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ ΠΈ Π΄Π΅Ρ€Π΅Π²ΡŒΡ, Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ blob-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠΎ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΡŽ. Π—Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠ»ΠΎΠ½Π° для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΌΠΎΠ½ΠΎΡ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π².
  • Sparse checkout: git sparse-checkout set path/to/subdir ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ подмноТСство Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ Π΄Π΅Ρ€Π΅Π²Π°. ПолСзно Π² монорСпозиториях, Π³Π΄Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ сСрвиса.
  • Π€Π°ΠΉΠ» commit-graph: git commit-graph write --reachable ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ вычисляСт Π³Ρ€Π°Ρ„ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ², ускоряя Ρ‚Π°ΠΊΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠ°ΠΊ git log --graph ΠΈ запросы достиТимости Π² Π±ΠΎΠ»ΡŒΡˆΠΈΡ… историях.
  • git maintenance start: ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ„ΠΎΠ½ΠΎΠ²Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ обслуТивания (ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠ° свободных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ commit-graph, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° fetch) для поддСрТания быстрой Ρ€Π°Π±ΠΎΡ‚Ρ‹ рСпозитория со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ.

ВСхничСский ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ список ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… Π²Ρ‹Π²ΠΎΠ΄ΠΎΠ²

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ настройку Git Π³ΠΎΡ‚ΠΎΠ²ΠΎΠΉ ΠΊ производству, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ²:

  • Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ настроСна: user.name ΠΈ user.email ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ установлСны Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ SSH-ΠΊΠ»ΡŽΡ‡ΠΈ: аутСнтификация ΠΏΠΎ ΠΏΠ°Ρ€ΠΎΠ»ΡŽ ΠΊ ΡƒΠ΄Π°Π»Ρ‘Π½Π½Ρ‹ΠΌ сСрвСрам Π·Π°ΠΌΠ΅Π½Π΅Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠΈ SSH-ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΈΠ»ΠΈ HTTPS Π½Π° основС Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ²
  • .gitignore зафиксирован: сСкрСты, Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Ρ‹ сборки ΠΈ Ρ„Π°ΠΉΠ»Ρ‹ ОБ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π΄ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°
  • Π’Π΅Ρ‚ΠΊΠ° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ называСтся main: init.defaultBranch установлСн глобально Π²ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅Π³ΠΎ имСнования master
  • БообщСния ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ соглашСнию: Conventional Commits (feat:, fix:, chore:) ΠΈΠ»ΠΈ согласованный ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, ΡΠΎΠ±Π»ΡŽΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ‡Π΅Ρ€Π΅Π· Ρ…ΡƒΠΊ commit-msg
  • git revert для ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠΉ истории: git reset --hard ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ…, Π½Π΅ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²
  • --force-with-lease вмСсто --force: ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡΠ»ΡƒΡ‡Π°ΠΉΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡŒ push ΠΊΠΎΠ»Π»Π΅Π³
  • АннотированныС Ρ‚Π΅Π³ΠΈ для Ρ€Π΅Π»ΠΈΠ·ΠΎΠ²: git tag -a с сообщСниСм, Π° Π½Π΅ Π»Ρ‘Π³ΠΊΠΈΠ΅ Ρ‚Π΅Π³ΠΈ
  • Π₯ΡƒΠΊΠΈ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· pre-commit ΠΈΠ»ΠΈ husky: ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ качСства ΡΠΎΠ±Π»ΡŽΠ΄Π°Π΅Ρ‚ΡΡ Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±Ρ€Π°Π·Π½ΠΎ Π²ΠΎ всСй ΠΊΠΎΠΌΠ°Π½Π΄Π΅
  • Git LFS настроСн, Ссли Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ содСрТит Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ рСсурсы Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π±ΠΎΠ»Π΅Π΅ 1 MB
  • Π“ΠΎΠ»Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π½Π° сСрвСрС: ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ‰Ρ‘Π½Π½Ρ‹Π΅ ΡƒΠ΄Π°Π»Ρ‘Π½Π½Ρ‹Π΅ сСрвСры ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ git init --bare
  • РСгулярный git fetch --prune: Π²Π΅Ρ‚ΠΊΠΈ ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ отслСТивания синхронизированы с фактичСским состояниСм ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ сСрвСра

Часто Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ вопросы

Π’ Ρ‡Ρ‘ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ git fetch ΠΈ git pull?

git fetch Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹, Π²Π΅Ρ‚ΠΊΠΈ ΠΈ Ρ‚Π΅Π³ΠΈ с ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ сСрвСра Π² Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ refs ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ отслСТивания (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, origin/main), Π½Π΅ затрагивая Ρ€Π°Π±ΠΎΡ‡ΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ ΠΈΠ»ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π²Π΅Ρ‚ΠΊΡƒ. git pull β€” это git fetch, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ слСдуСт git merge (ΠΈΠ»ΠΈ git rebase, Ссли настроСно). Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ git fetch, ΠΊΠΎΠ³Π΄Π° Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ измСнСния ΠΈΠ· upstream ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΡ… ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠ΅ΠΉ.

Когда слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ git rebase вмСсто git merge?

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ rebase для Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ локальной Π²Π΅Ρ‚ΠΊΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ΠΌ pull request, сохраняя Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ истории ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Никогда Π½Π΅ выполняйтС rebase Π²Π΅Ρ‚ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΡƒΠΆΠ΅ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ ΠΈΠ»ΠΈ Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ основали свою Ρ€Π°Π±ΠΎΡ‚Ρƒ β€” ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡŒ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½Ρ‹Ρ… Ρ…Π΅ΡˆΠ΅ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² Π²Ρ‹Π½ΡƒΠΆΠ΄Π°Π΅Ρ‚ всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ расходящиСся истории.

Как навсСгда ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», случайно зафиксированный Π² ΠΊΠΎΠΌΠΌΠΈΡ‚Π΅?

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ git filter-repo (соврСмСнная Π·Π°ΠΌΠ΅Π½Π° git filter-branch): git filter-repo --path secrets.env --invert-paths. Π­Ρ‚ΠΎ пСрСзаписываСт всю ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ рСпозитория, удаляя Ρ„Π°ΠΉΠ» ΠΈΠ· ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°. ПослС пСрСзаписи Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ push всСх Π²Π΅Ρ‚ΠΎΠΊ ΠΈ Ρ‚Π΅Π³ΠΎΠ², Π·Π°Ρ‚Π΅ΠΌ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ смСнитС скомпромСтированныС ΡƒΡ‡Ρ‘Ρ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ β€” считайтС ΠΈΡ… раскрытыми нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, насколько быстро Π²Ρ‹ дСйствуСтС.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ состояниС detached HEAD ΠΈ ΠΊΠ°ΠΊ ΠΈΠ· Π½Π΅Π³ΠΎ Π²Ρ‹ΠΉΡ‚ΠΈ?

Detached HEAD ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ HEAD ссылаСтся нСпосрСдствСнно Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ…Π΅Ρˆ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°, Π° Π½Π΅ Π½Π° имя Π²Π΅Ρ‚ΠΊΠΈ. Π›ΡŽΠ±Ρ‹Π΅ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Π΄Π΅Π»Π°Π΅Ρ‚Π΅, Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ΡŒ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠ΅ ΠΈ станут нСдостиТимыми послС ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. Для восстановлСния: git switch -c new-branch-name для присоСдинСния ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² ΠΊ Π½ΠΎΠ²ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠ΅ ΠΈΠ»ΠΈ git switch main для ΠΈΡ… ΠΎΡ‚ΠΌΠ΅Π½Ρ‹.

Как Git ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ½Π°Ρ‡Π΅, Ρ‡Π΅ΠΌ тСкстовыС?

Git Ρ…Ρ€Π°Π½ΠΈΡ‚ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠ°ΠΊ Π½Π΅ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹Π΅ blob-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ β€” ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ Π·Π½Π°Ρ‡ΠΈΠΌΡ‹Π΅ построчныС Π΄ΠΈΡ„Ρ„Ρ‹ ΠΈΠ»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ автоматичСскиС слияния для Π½ΠΈΡ…. ΠšΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ Π² Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Ρ‚ΡŒΡΡ ΠΏΡƒΡ‚Ρ‘ΠΌ Π²Ρ‹Π±ΠΎΡ€Π° ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· вСрсий Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ. Для Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π² со Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌΠΈ рСсурсами настройтС Git LFS для хранСния Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π²ΠΎ внСшнСм Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅, сохраняя сам Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π»Ρ‘Π³ΠΊΠΈΠΌ ΠΈ быстрым.