Git ΠΠΎΠ½ΡΡΠΎΠ» Π½Π° Π²Π΅ΡΡΠΈΠΈΡΠ΅: ΠΡΠ»Π½ΠΎΡΠΎ ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΎ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ
Git Π΅ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΠΊΠΎΠ½ΡΡΠΎΠ» Π½Π° Π²Π΅ΡΡΠΈΠΈΡΠ΅ (DVCS), ΠΊΠΎΡΡΠΎ Π·Π°ΠΏΠΈΡΠ²Π° ΡΠ½ΠΈΠΌΠΊΠΈ Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΡΠΎ Π΄ΡΡΠ²ΠΎ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡ Ρ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°ΠΉΠΊΠΈ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ Π±ΡΠΎΠΉ ΡΡΡΡΡΠ΄Π½ΠΈΡΠΈ Π΄Π° ΡΠ°Π±ΠΎΡΡΡ ΠΏΠ°ΡΠ°Π»Π΅Π»Π½ΠΎ, Π±Π΅Π· Π΄Π° ΠΏΡΠ΅Π·Π°ΠΏΠΈΡΠ²Π°Ρ Π²Π·Π°ΠΈΠΌΠ½ΠΎ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΡΠΈ. ΠΡΠ΅ΠΊΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΏΡΠΈΡΠ΅ΠΆΠ°Π²Π° ΠΏΡΠ»Π½ΠΎ ΠΊΠΎΠΏΠΈΠ΅ Π½Π° Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ β Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΡΡΠ»Π°ΡΠ° ΠΈΡΡΠΎΡΠΈΡ Π½Π° ΠΊΠΎΠΌΠΈΡΠΈΡΠ΅ β Π½Π° Π»ΠΎΠΊΠ°Π»Π½Π°ΡΠ° ΡΠΈ ΠΌΠ°ΡΠΈΠ½Π°, ΠΊΠΎΠ΅ΡΠΎ Π΅Π»ΠΈΠΌΠΈΠ½ΠΈΡΠ° Π΅Π΄ΠΈΠ½ΠΈΡΠ½Π°ΡΠ° ΡΠΎΡΠΊΠ° Π½Π° ΠΎΡΠΊΠ°Π· ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π½Π°ΠΏΡΠ»Π½ΠΎ ΠΎΡΠ»Π°ΠΉΠ½ ΡΠ°Π±ΠΎΡΠ½ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΈ.
Π‘ΡΠ·Π΄Π°Π΄Π΅Π½ ΠΎΡ Linus Torvalds ΠΏΡΠ΅Π· Π°ΠΏΡΠΈΠ» 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)ΠΠΎΠ»ΠΎΡΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ° ΡΠ°ΠΌΠΎ ΠΎΠ±Π΅ΠΊΡΠ½ΠΎΡΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΠΈ ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠΈΠΈΡΠ΅ β Π±Π΅Π· ΡΠ°Π±ΠΎΡΠ½Π° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ. Π’ΠΎΠ²Π° Π΅ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΈΡΡ ΡΠΎΡΠΌΠ°Ρ Π·Π° ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅, ΠΊΡΠΌ ΠΊΠΎΠ΅ΡΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ ΠΈΠ·ΠΏΡΠ°ΡΠ°Ρ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ. ΠΠΊΠΎ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»Π½ΠΎ Ρ ΠΎΡΡΠ²Π°ΡΠ΅ Git Π½Π° ΡΡΡΠ²ΡΡ Ρ VPS Π₯ΠΎΡΡΠΈΠ½Π³, Π²ΠΈΠ½Π°Π³ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°ΠΉΡΠ΅ ΡΠΏΠΎΠ΄Π΅Π»Π΅Π½ΠΈΡΠ΅ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° ΠΊΠ°ΡΠΎ Π³ΠΎΠ»ΠΈ.
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 infogit 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 onlygit 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 ΠΈΠ»ΠΈ Π΄Π° Π½ΡΠ»ΠΈΡΠ°Ρ Π»ΠΎΠΊΠ°Π»Π½ΠΈΡΠ΅ ΡΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅.
ΠΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ ΠΈ ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅
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 ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ΅Π·Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½Π°ΡΠ° ΠΈΡΡΠΎΡΠΈΡ. ΠΡΠΎΠ²Π΅ΡΡΠ²Π° Π΄Π°Π»ΠΈ Π½ΠΈΠΊΠΎΠΉ Π΄ΡΡΠ³ Π½Π΅ Π΅ ΠΈΠ·ΠΏΡΠ°ΡΠΈΠ» ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΡΠ»Π΅Π΄ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΎΡΠΎ Π²ΠΈ ΠΈΠ·Π²Π»ΠΈΡΠ°Π½Π΅, ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΡΠ²Π°ΠΉΠΊΠΈ ΡΠ»ΡΡΠ°ΠΉΠ½Π° Π·Π°Π³ΡΠ±Π° Π½Π° Π΄Π°Π½Π½ΠΈ.
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 createdgit fetch ΠΈΠ·ΡΠ΅Π³Π»Ρ ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ, Π±Π΅Π· Π΄Π° Π·Π°ΡΡΠ³Π° ΡΠ°Π±ΠΎΡΠ½Π°ΡΠ° Π²ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ ΠΈΠ»ΠΈ ΡΠ΅ΠΊΡΡΠΈΡ ΠΊΠ»ΠΎΠ½. Π’ΠΎΠ²Π° Π΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΈΡΡ Π½Π°ΡΠΈΠ½ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π½Π°Π³ΠΎΡΠ΅ ΠΏΠΎ Π²Π΅ΡΠΈΠ³Π°ΡΠ° ΠΏΡΠ΅Π΄ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ°Π½Π΅ΡΠΎ ΠΈΠΌ.
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ΠΡΡΠ·ΠΎΡΠΎ ΡΠ»ΠΈΠ²Π°Π½Π΅ Π½Π°ΠΏΡΠ΅Π΄ ΡΠ΅ ΡΠ»ΡΡΠ²Π°, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅Π»Π΅Π²ΠΈΡΡ ΠΊΠ»ΠΎΠ½ Π½Π΅ ΡΠ΅ Π΅ ΡΠ°Π·ΠΊΠ»ΠΎΠ½ΠΈΠ» ΠΎΡ ΠΈΠ·Ρ
ΠΎΠ΄Π½ΠΈΡ β Git ΠΏΡΠΎΡΡΠΎ ΠΏΡΠ΅ΠΌΠ΅ΡΡΠ²Π° ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π°ΠΏΡΠ΅Π΄. ΠΠ΅ ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π° ΠΊΠΎΠΌΠΈΡ Π·Π° ΡΠ»ΠΈΠ²Π°Π½Π΅. --no-ff ΠΏΡΠΈΠ½ΡΠ΄ΠΈΡΠ΅Π»Π½ΠΎ ΡΡΠ·Π΄Π°Π²Π° ΠΊΠΎΠΌΠΈΡ Π·Π° ΡΠ»ΠΈΠ²Π°Π½Π΅ Π΄ΠΎΡΠΈ Π² ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ, ΠΊΠΎΠ΅ΡΠΎ Π·Π°ΠΏΠ°Π·Π²Π° Π²ΠΈΠ·ΡΠ°Π»Π½Π°ΡΠ° ΠΈΡΡΠΎΡΠΈΡ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΈΡΠ΅ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ Π² git log --graph.
Π‘Π»ΠΈΠ²Π°Π½Π΅ΡΠΎ ΡΡΠ΅Π· ΡΠ³ΡΡΡΡΠ²Π°Π½Π΅ ΡΠ²ΠΈΠ²Π° Π²ΡΠΈΡΠΊΠΈ ΠΊΠΎΠΌΠΈΡΠΈ ΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π΅Π½ ΠΊΠ»ΠΎΠ½ Π² Π΅Π΄Π½Π° ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½Π° ΠΏΡΠΎΠΌΡΠ½Π°, ΠΊΠΎΡΡΠΎ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΡΡΠ½ΠΎ ΠΊΠΎΠΌΠΈΡΠ²Π°ΡΠ΅. Π’ΠΎΠ²Π° ΠΏΡΠΎΠΈΠ·Π²Π΅ΠΆΠ΄Π° ΡΠΈΡΡΠ° Π»ΠΈΠ½Π΅ΠΉΠ½Π° ΠΈΡΡΠΎΡΠΈΡ Π² main, Π½ΠΎ ΠΎΡΡ
Π²ΡΡΠ»Ρ Π΄Π΅ΡΠ°ΠΉΠ»Π½Π°ΡΠ° ΠΈΡΡΠΎΡΠΈΡ Π½Π° ΠΊΠΎΠΌΠΈΡΠΈΡΠ΅ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΈΡ ΠΊΠ»ΠΎΠ½.
ΠΡΠ΅Π±Π°Π·ΠΈΡΠ°Π½Π΅
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ΠΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎΡΠΎ ΠΏΡΠ΅Π±Π°Π·ΠΈΡΠ°Π½Π΅ (-i) Π΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡΡ Π·Π° Ρ
ΠΈΠ³ΠΈΠ΅Π½Π° Π½Π° ΠΊΠΎΠΌΠΈΡΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΈΠΎΠ½Π°Π»ΠΈΡΡΠ°. ΠΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π²ΠΈ Π΄Π° ΠΏΡΠ΅Π½Π°ΡΠ΅ΠΆΠ΄Π°ΡΠ΅, ΡΠ³ΡΡΡΡΠ²Π°ΡΠ΅, ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠ°ΡΠ΅, ΠΏΡΠ΅ΠΌΠ°Ρ
Π²Π°ΡΠ΅ ΠΈΠ»ΠΈ ΡΠ°Π·Π΄Π΅Π»ΡΡΠ΅ ΠΊΠΎΠΌΠΈΡΠΈ ΠΏΡΠ΅Π΄ΠΈ ΡΠΏΠΎΠ΄Π΅Π»ΡΠ½Π΅ΡΠΎ ΠΈΠΌ. Π§Π΅ΡΡΠ° ΡΠΏΠΎΡΡΠ΅Π±Π°: ΠΏΠΎΡΠΈΡΡΠ²Π°Π½Π΅ Π½Π° ΠΎΠ±ΡΡΠΊΠ°Π½ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π΅Π½ ΠΊΠ»ΠΎΠ½ ΠΏΡΠ΅Π΄ΠΈ ΠΎΡΠ²Π°ΡΡΠ½Π΅ Π½Π° Π·Π°ΡΠ²ΠΊΠ° Π·Π° ΡΠ»ΠΈΠ²Π°Π½Π΅.
| Π‘ΡΡΠ°ΡΠ΅Π³ΠΈΡ | ΠΡΡΠΎΡΠΈΡ | Π‘Π»ΡΡΠ°ΠΉ Π½Π° ΡΠΏΠΎΡΡΠ΅Π±Π° | Π ΠΈΡΠΊ |
|---|---|---|---|
| Π‘Π»ΠΈΠ²Π°Π½Π΅ (ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅) | ΠΠ΅Π»ΠΈΠ½Π΅ΠΉΠ½Π°, Π·Π°ΠΏΠ°Π·Π²Π° ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ΡΠ΅ | ΠΡΠ»Π³ΠΎΡΡΠ°ΠΉΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ | Π¨ΡΠΌΠ΅Π½ `git log` |
| Π‘Π»ΠΈΠ²Π°Π½Π΅ `βno-ff` | ΠΠ΅Π»ΠΈΠ½Π΅ΠΉΠ½Π°, ΡΠ²Π½ΠΈ ΠΊΠΎΠΌΠΈΡΠΈ Π·Π° ΡΠ»ΠΈΠ²Π°Π½Π΅ | ΠΠ°Π»ΠΎΠΆΠ΅Π½Π° ΡΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΡ Π½Π° ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ΡΠ΅ | Π‘ΡΡΠΎΡΠΎ ΠΊΠ°ΡΠΎ ΠΏΠΎ-Π³ΠΎΡΠ΅ |
| Π‘Π»ΠΈΠ²Π°Π½Π΅ `βsquash` | ΠΠΈΠ½Π΅ΠΉΠ½Π°, Π΅Π΄ΠΈΠ½ ΠΊΠΎΠΌΠΈΡ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ | Π§ΠΈΡΡ ΠΎΡΠ½ΠΎΠ²Π΅Π½ ΠΊΠ»ΠΎΠ½ | ΠΡΠ±ΠΈ Π΄Π΅ΡΠ°ΠΉΠ»Π½Π°ΡΠ° ΠΈΡΡΠΎΡΠΈΡ |
| Rebase | ΠΠΈΠ½Π΅ΠΉΠ½Π°, Π±Π΅Π· ΠΊΠΎΠΌΠΈΡΠΈ Π·Π° ΡΠ»ΠΈΠ²Π°Π½Π΅ | ΠΠΈΡΠ½ΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅, ΠΏΠΎΡΠΈΡΡΠ²Π°Π½Π΅ ΠΏΡΠ΅Π΄ΠΈ PR | ΠΡΠ΅Π·Π°ΠΏΠΈΡΠ²Π° Ρ Π΅ΡΠΎΠ²Π΅; ΠΎΠΏΠ°ΡΠ½ΠΎ ΠΏΡΠΈ ΡΠΏΠΎΠ΄Π΅Π»Π΅Π½ΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ |
| Cherry-pick | ΠΠ·Π±ΠΈΡΠ°ΡΠ΅Π»Π½Π°, Π»ΠΈΠ½Π΅ΠΉΠ½Π° | ΠΡΠ΅Π½Π°ΡΡΠ½Π΅ Π½Π° ΠΏΠΎΠΏΡΠ°Π²ΠΊΠΈ Π½Π°Π·Π°Π΄ | ΠΡΠ±Π»ΠΈΡΠ°Π½ΠΈ ΠΊΠΎΠΌΠΈΡΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ |
ΠΠ»Π°ΡΠ½ΠΎΡΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ Π½Π° ΠΏΡΠ΅Π±Π°Π·ΠΈΡΠ°Π½Π΅ΡΠΎ: ΠΠΈΠΊΠΎΠ³Π° Π½Π΅ ΠΏΡΠ΅Π±Π°Π·ΠΈΡΠ°ΠΉΡΠ΅ ΠΊΠΎΠΌΠΈΡΠΈ, ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠΈ Π² ΠΏΡΠ±Π»ΠΈΡΠ΅Π½, ΡΠΏΠΎΠ΄Π΅Π»Π΅Π½ ΠΊΠ»ΠΎΠ½. ΠΡΠ΅Π±Π°Π·ΠΈΡΠ°Π½Π΅ΡΠΎ ΠΏΡΠ΅Π·Π°ΠΏΠΈΡΠ²Π° Ρ Π΅ΡΠΎΠ²Π΅ΡΠ΅ Π½Π° ΠΊΠΎΠΌΠΈΡΠΈΡΠ΅. ΠΠΊΠΎ ΠΊΠΎΠ»Π΅Π³Π° Π΅ Π±Π°Π·ΠΈΡΠ°Π» ΡΠ°Π±ΠΎΡΠ°ΡΠ° ΡΠΈ Π²ΡΡΡ Ρ ΡΠ΅Π·ΠΈ ΠΊΠΎΠΌΠΈΡΠΈ, ΠΈΡΡΠΎΡΠΈΡΡΠ° ΠΌΡ ΡΠ΅ ΡΠ΅ ΡΠ°Π·ΠΊΠ»ΠΎΠ½ΠΈ ΠΈ ΡΠΎΠΉ ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ°Π²ΠΈ ΠΏΡΠ΅Π΄ Π±ΠΎΠ»Π΅Π·Π½Π΅Π½ΠΎ ΡΡΠ³Π»Π°ΡΡΠ²Π°Π½Π΅.
Π Π°Π·ΡΠ΅ΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΈ ΠΏΡΠΈ ΡΠ»ΠΈΠ²Π°Π½Π΅
ΠΠΎΠ½ΡΠ»ΠΈΠΊΡΠΈ Π²ΡΠ·Π½ΠΈΠΊΠ²Π°Ρ, ΠΊΠΎΠ³Π°ΡΠΎ Π΄Π²Π° ΠΊΠ»ΠΎΠ½Π° ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠ°Ρ Π΅Π΄Π½ΠΎ ΠΈ ΡΡΡΠΎ ΠΌΡΡΡΠΎ Π² Π΅Π΄ΠΈΠ½ ΠΈ ΡΡΡΠΈ ΡΠ°ΠΉΠ». 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 stashgit 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 commitsCherry-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ΠΠΈΠ½Π°Π³ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ Π°Π½ΠΎΡΠΈΡΠ°Π½ΠΈ ΡΠ°Π³ΠΎΠ²Π΅ Π·Π° ΠΈΠ·Π΄Π°Π½ΠΈΡ. Π’Π΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π°Ρ ΠΈΠΌΠ΅ΡΠΎ, ΠΈΠΌΠ΅ΠΉΠ»Π°, Π΄Π°ΡΠ°ΡΠ° ΠΈ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΌΠ°ΡΠΊΠΈΡΠ°ΡΠΈΡ, ΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½ΠΈ Ρ GPG. ΠΠ΅ΠΊΠΈΡΠ΅ ΡΠ°Π³ΠΎΠ²Π΅ ΡΠ° ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈ ΡΠ°ΠΌΠΎ Π·Π° Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈ Π»ΠΎΠΊΠ°Π»Π½ΠΈ ΠΎΡΠΌΠ΅ΡΠΊΠΈ.
git worktree
git worktree ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΡΠΎ ΠΈΠ·Π²Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠ°Π±ΠΎΡΠ½ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ ΠΎΡ Π΅Π΄Π½ΠΎ ΠΈ ΡΡΡΠΎ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ β Π²ΡΡΠΊΠ° Π½Π° ΡΠ°Π·Π»ΠΈΡΠ΅Π½ ΠΊΠ»ΠΎΠ½. Π’ΠΎΠ²Π° Π΅Π»ΠΈΠΌΠΈΠ½ΠΈΡΠ° Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΠ° ΠΎΡ Π·Π°ΠΏΠ°Π·Π²Π°Π½Π΅ ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΈΡΠ²Π°Π½Π΅ Π½Π° Π½Π΅Π·Π°Π²ΡΡΡΠ΅Π½Π° ΡΠ°Π±ΠΎΡΠ°, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ΅Π²ΠΊΠ»ΡΡΠΈΡΠ΅ ΠΊΡΠΌ ΡΠΏΠ΅ΡΠ½Π° ΠΏΠΎΠΏΡΠ°Π²ΠΊΠ°.
git worktree add ../hotfix-branch hotfix/critical-auth-bug
git worktree list
git worktree remove ../hotfix-branchΠ’ΠΎΠ²Π° Π΅ ΠΎΡΠΎΠ±Π΅Π½ΠΎ ΡΠ΅Π½Π½ΠΎ Π½Π° Dedicated Server, ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ CI/CD ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ, ΠΊΡΠ΄Π΅ΡΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π·Π°Π΄Π°ΡΠΈ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ ΡΠ΅ Π½ΡΠΆΠ΄Π°ΡΡ ΠΎΡ Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π΅Π½ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ Π½Π° Π΅Π΄Π½ΠΎ ΠΈ ΡΡΡΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅, Π±Π΅Π· Π΄Π° ΡΠΈ ΠΏΡΠ΅ΡΠ°Ρ Π²Π·Π°ΠΈΠΌΠ½ΠΎ.
Git ΡΠ°Π±ΠΎΡΠ½ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΈ Π·Π° Π΅ΠΊΠΈΠΏΠΈ
ΠΡΠ°Π²ΠΈΠ»Π½Π°ΡΠ° ΡΡΡΠ°ΡΠ΅Π³ΠΈΡ Π·Π° ΡΠ°Π·ΠΊΠ»ΠΎΠ½ΡΠ²Π°Π½Π΅ Π·Π°Π²ΠΈΡΠΈ ΠΎΡ ΡΠΈΡΡΠΌΠ° Π½Π° ΠΈΠ·Π΄Π°Π²Π°Π½Π΅ ΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π° Π΅ΠΊΠΈΠΏΠ°. Π‘ΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ ΡΡΠΈ Π΄ΠΎΠΌΠΈΠ½ΠΈΡΠ°ΡΠΈ ΠΌΠΎΠ΄Π΅Π»Π°:
Π Π°Π±ΠΎΡΠ΅Π½ ΠΏΡΠΎΡΠ΅Ρ Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅
ΠΡΡΠΊΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ»ΠΈ ΠΏΠΎΠΏΡΠ°Π²ΠΊΠ° ΠΆΠΈΠ²Π΅Π΅ Π² ΡΠΎΠ±ΡΡΠ²Π΅Π½ ΠΊΠ»ΠΎΠ½. Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ ΠΎΡΠ²Π°ΡΡΡ Π·Π°ΡΠ²ΠΊΠΈ Π·Π° ΡΠ»ΠΈΠ²Π°Π½Π΅ ΠΊΡΠΌ main. ΠΡΠΎΡΡ, Π΅ΡΠ΅ΠΊΡΠΈΠ²Π΅Π½ Π·Π° ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ Π΅ΠΊΠΈΠΏΠΈ.
Gitflow
ΠΠ΅ΡΠΈΠ½ΠΈΡΠ° Π΄ΡΠ»Π³ΠΎΡΡΠ°ΠΉΠ½ΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ main ΠΈ develop, ΠΏΠ»ΡΡ ΠΊΡΠ°ΡΠΊΠΎΡΡΠ°ΠΉΠ½ΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ feature/, release/ ΠΈ hotfix/ ΡΡΡ ΡΡΡΠΎΠ³ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π° Π·Π° ΡΠ»ΠΈΠ²Π°Π½Π΅. ΠΠΎΠ΄Ρ
ΠΎΠ΄ΡΡ Π·Π° ΡΠΎΡΡΡΠ΅Ρ Ρ ΡΠ²Π½ΠΈ Π²Π΅ΡΡΠΈΠΎΠ½ΠΈΡΠ°Π½ΠΈ ΠΈΠ·Π΄Π°Π½ΠΈΡ (Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ°Π½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ).
Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ°, Π±Π°Π·ΠΈΡΠ°Π½Π° Π½Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡ ΠΊΠ»ΠΎΠ½
Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ ΠΊΠΎΠΌΠΈΡΠ²Π°Ρ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π² main (ΠΈΠ»ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΡΠ°ΡΠΊΠΎΡΡΠ°ΠΉΠ½ΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅, ΡΠ»Π΅ΡΠΈ Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° Π΄Π΅Π½). Π Π°Π·ΡΠΈΡΠ° Π² Π³ΠΎΠ»ΡΠΌΠ° ΡΡΠ΅ΠΏΠ΅Π½ Π½Π° ΡΠ»Π°Π³ΠΎΠ²Π΅ Π·Π° ΡΡΠ½ΠΊΡΠΈΠΈ, Π·Π° Π΄Π° ΡΠΊΡΠΈΠ΅ Π½Π΅Π·Π°Π²ΡΡΡΠ΅Π½Π° ΡΠ°Π±ΠΎΡΠ°. ΠΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°Π½ ΠΎΡ Π΅ΠΊΠΈΠΏΠΈ Ρ Π²ΠΈΡΠΎΠΊΠ° ΡΠΊΠΎΡΠΎΡΡ, ΠΏΡΠ°ΠΊΡΠΈΠΊΡΠ²Π°ΡΠΈ Π½Π΅ΠΏΡΠ΅ΠΊΡΡΠ½Π°ΡΠΎ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅.
| Π Π°Π±ΠΎΡΠ΅Π½ ΠΏΡΠΎΡΠ΅Ρ | Π ΠΈΡΡΠΌ Π½Π° ΠΈΠ·Π΄Π°Π²Π°Π½Π΅ | Π Π°Π·ΠΌΠ΅Ρ Π½Π° Π΅ΠΊΠΈΠΏΠ° | Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ Π½Π° CI/CD |
|---|---|---|---|
| Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π΅Π½ ΠΊΠ»ΠΎΠ½ | ΠΡΠ²ΠΊΠ°Π² | ΠΡΡΠΊΠ°ΠΊΡΠ² | ΠΠΈΡΠΊΠ° |
| Gitflow | ΠΠ»Π°Π½ΠΈΡΠ°Π½ΠΈ ΠΈΠ·Π΄Π°Π½ΠΈΡ | Π‘ΡΠ΅Π΄Π΅Π½βΠΠΎΠ»ΡΠΌ | Π‘ΡΠ΅Π΄Π½Π° |
| ΠΠ°Π·ΠΈΡΠ°Π½ Π½Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡ ΠΊΠ»ΠΎΠ½ | ΠΠ΅ΠΏΡΠ΅ΠΊΡΡΠ½Π°ΡΠΎ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ | ΠΡΡΠΊΠ°ΠΊΡΠ² | ΠΠΈΡΠΎΠΊΠ° |
Π₯ΠΎΡΡΠΈΠ½Π³ Π½Π° Git Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°: Π‘Π°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»Π½ΠΎ Ρ ΠΎΡΡΠ²Π°Π½Π΅ ΡΡΠ΅ΡΡ ΡΠΏΡΠ°Π²Π»ΡΠ²Π°Π½ΠΈ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠΈ
ΠΠ° Π΅ΠΊΠΈΠΏΠΈ, ΠΈΠ·ΠΈΡΠΊΠ²Π°ΡΠΈ ΡΡΠ²Π΅ΡΠ΅Π½ΠΈΡΠ΅Ρ Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅, ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΠΈΠ»ΠΈ ΡΠ°ΡΡΠ½Π° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°, ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»Π½ΠΎΡΠΎ Ρ ΠΎΡΡΠ²Π°Π½Π΅ Π½Π° Git ΡΡΡΠ²ΡΡ Π΅ ΠΆΠΈΠ·Π½Π΅ΡΠΏΠΎΡΠΎΠ±Π΅Π½ ΠΈ ΡΠ΅ΡΡΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ ΠΈΠ·Π±ΠΎΡ. ΠΠΏΡΠΈΠΈΡΠ΅ Π²ΠΊΠ»ΡΡΠ²Π°Ρ Gitea (Π»Π΅ΠΊΠ°, Π±Π°Π·ΠΈΡΠ°Π½Π° Π½Π° Go), GitLab CE (ΠΏΡΠ»Π½Π° DevOps ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°) ΠΈ Forgejo (ΡΠ°Π·ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅ Π½Π° Gitea Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΡ ΠΎΠ±ΡΠ½ΠΎΡΡΡΠ°).
ΠΠΈΠ½ΠΈΠΌΠ°Π»Π΅Π½ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»Π½ΠΎ Ρ ΠΎΡΡΠ²Π°Π½ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π½Π° Gitea ΡΠ°Π±ΠΎΡΠΈ ΠΊΠΎΠΌΡΠΎΡΡΠ½ΠΎ Π½Π° ΠΏΠ»Π°Π½ Π·Π° VPS Π₯ΠΎΡΡΠΈΠ½Π³ Ρ 2 vCPU ΠΈ 2 GB RAM. ΠΠ° ΠΏΠΎ-Π³ΠΎΠ»Π΅ΠΌΠΈ Π΅ΠΊΠΈΠΏΠΈ ΠΈΠ»ΠΈ GitLab CE Ρ CI ΠΈΠ·ΠΏΡΠ»Π½ΠΈΡΠ΅Π»ΠΈ, 4β8 GB RAM Π΅ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΡΡ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ.
ΠΡΠΈ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»Π½ΠΎ Ρ ΠΎΡΡΠ²Π°Π½Π΅, Π·Π°ΡΠΈΡΠ΅ΡΠ΅ ΡΠ²ΠΎΡ Git ΡΡΡΠ²ΡΡ Ρ:
- SSH ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π°Π½Π΅ Ρ ΠΊΠ»ΡΡ (Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΠΉΡΠ΅ Π½Π°ΠΏΡΠ»Π½ΠΎ ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π°Π½Π΅ΡΠΎ Ρ ΠΏΠ°ΡΠΎΠ»Π°)
- HTTPS Ρ Π²Π°Π»ΠΈΠ΄Π΅Π½ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ β SSL ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΠ΅ ΡΠ° ΠΎΡ ΡΡΡΠ΅ΡΡΠ²Π΅Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π·Π° Π·Π°ΡΠΈΡΠ° Π½Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ ΠΏΡΠΈ ΠΏΡΠ΅Π½ΠΎΡ
- ΠΡΠ°Π²ΠΈΠ»Π° Π½Π° Π·Π°ΡΠΈΡΠ½Π°ΡΠ° ΡΡΠ΅Π½Π°, ΠΎΠ³ΡΠ°Π½ΠΈΡΠ°Π²Π°ΡΠΈ ΠΈΠ·Π»Π°Π³Π°Π½Π΅ΡΠΎ Π½Π° Git ΠΏΠΎΡΡ (22 ΠΈΠ»ΠΈ ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ SSH ΠΏΠΎΡΡ, 443 Π·Π° HTTPS)
- Π Π΅Π΄ΠΎΠ²Π½ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΡΠ΅Π·Π΅ΡΠ²Π½ΠΈ ΠΊΠΎΠΏΠΈΡ Π½Π° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈΡΠ΅ Π½Π° Π³ΠΎΠ»ΠΎΡΠΎ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅
.git - Π’Π°ΠΉΠ½ΠΈ Π·Π° webhook Π·Π° CI/CD ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ
ΠΠ° Π΅ΠΊΠΈΠΏΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠΈ Π±Π°Π·ΠΈΡΠ°Π½ΠΈ Π½Π° Git ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠΈ Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅, ΠΊΠΎΠΈΡΠΎ ΡΡΡΠΎ ΡΠΏΡΠ°Π²Π»ΡΠ²Π°Ρ ΡΠ΅Π± ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°, ΡΡΡΠ΅ΡΠ°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»Π½ΠΎ Ρ ΠΎΡΡΠ²Π°Π½ Git ΡΡΡΠ²ΡΡ Ρ VPS Ρ cPanel Π²ΠΈ Π΄Π°Π²Π° ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ°Π½ΠΈ ΠΊΡΠΊΠΈ Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π·Π°Π΅Π΄Π½ΠΎ Ρ ΠΏΠΎΠ·Π½Π°ΡΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Ρ ΠΎΡΡΠΈΠ½Π³Π°.
Git ΠΊΡΠΊΠΈ: ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠΎΡΡΠΈΡΠ΅ Π·Π° ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ
Git ΠΊΡΠΊΠΈΡΠ΅ ΡΠ° ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π² ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈ ΡΠΎΡΠΊΠΈ ΠΎΡ ΠΆΠΈΠ·Π½Π΅Π½ΠΈΡ ΡΠΈΠΊΡΠ» Π½Π° Git. Π’Π΅ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ°Ρ Π² .git/hooks/ ΠΈ Π½Π΅ ΡΠ΅ ΠΊΠΎΠΌΠΈΡΠ²Π°Ρ Π² Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ (ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΠΊΠ°ΡΠΎ pre-commit ΠΈΠ»ΠΈ husky Π·Π° ΡΠΏΠΎΠ΄Π΅Π»ΡΠ½Π΅ΡΠΎ ΠΈΠΌ).
ΠΠ»ΡΡΠΎΠ²ΠΈ ΠΊΡΠΊΠΈ Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ΠΈ ΡΠ°Π±ΠΎΡΠ½ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΈ:
| ΠΡΠΊΠ° | ΠΠ°Π΄Π΅ΠΉΡΡΠ²Π°Π½Π΅ | Π§Π΅ΡΡΠ° ΡΠΏΠΎΡΡΠ΅Π±Π° |
|---|---|---|
| `pre-commit` | ΠΡΠ΅Π΄ΠΈ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠΈΡ | ΠΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Π»ΠΈΠ½ΡΠ΅ΡΠΈ, ΡΠΎΡΠΌΠ°ΡΠ΅ΡΠΈ, ΡΠ΅ΡΡΠΎΠ²Π΅ |
| `commit-msg` | Π‘Π»Π΅Π΄ Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π·Π° ΠΊΠΎΠΌΠΈΡ | ΠΠ°Π»Π°Π³Π°Π½Π΅ Π½Π° ΡΠΎΡΠΌΠ°Ρ Π½Π° ΠΊΠΎΠ½Π²Π΅Π½ΡΠΈΠΎΠ½Π°Π»Π΅Π½ ΠΊΠΎΠΌΠΈΡ |
| `pre-push` | ΠΡΠ΅Π΄ΠΈ ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ ΠΊΡΠΌ ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΎΡΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ | ΠΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠ»Π½ΠΈΡ Π½Π°Π±ΠΎΡ ΠΎΡ ΡΠ΅ΡΡΠΎΠ²Π΅ |
| `post-receive` | Π‘Π»Π΅Π΄ ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ ΠΎΡ ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΎΡΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ | ΠΠ°Π΄Π΅ΠΉΡΡΠ²Π°Π½Π΅ Π½Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅, ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ Π½Π° ΠΈΠ·Π²Π΅ΡΡΠΈΡ |
| `pre-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: ΠΈΠ·ΠΏΡΠ°ΡΠ°ΡΠ΅ ΠΊΡΠΌ ΡΡΡΠ²ΡΡΠ°, ΠΊΡΠΊΠ°ΡΠ° ΠΈΠ·Π²Π»ΠΈΡΠ° Π½ΠΎΠ²ΠΈΡ 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ΠΈΠ·Π²Π»ΠΈΡΠ° ΡΠ°ΠΌΠΎ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΎΡ ΡΠ°Π±ΠΎΡΠ½ΠΎΡΠΎ Π΄ΡΡΠ²ΠΎ. ΠΠΎΠ»Π΅Π·Π½ΠΎ Π² ΠΌΠΎΠ½ΠΎΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡΡ ΡΠ°Π±ΠΎΡΠΈ ΡΠ°ΠΌΠΎ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° Π½Π° Π΅Π΄Π½Π° ΡΡΠ»ΡΠ³Π°. - Π€Π°ΠΉΠ» Ρ Π³ΡΠ°Ρ Π½Π° ΠΊΠΎΠΌΠΈΡΠΈΡΠ΅:
git commit-graph write --reachableΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π° Π³ΡΠ°ΡΠ° Π½Π° ΠΊΠΎΠΌΠΈΡΠΈΡΠ΅, ΡΡΠΊΠΎΡΡΠ²Π°ΠΉΠΊΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΊΠ°ΡΠΎgit log --graphΠΈ Π·Π°ΡΠ²ΠΊΠΈ Π·Π° Π΄ΠΎΡΡΠΈΠΆΠΈΠΌΠΎΡΡ ΠΏΡΠΈ Π³ΠΎΠ»ΡΠΌΠ° ΠΈΡΡΠΎΡΠΈΡ. git maintenance start: ΠΠ»Π°Π½ΠΈΡΠ° ΡΠΎΠ½ΠΎΠ²ΠΈ Π·Π°Π΄Π°ΡΠΈ Π·Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° (ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΈ ΠΎΠ±Π΅ΠΊΡΠΈ, Π°ΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π° Π³ΡΠ°ΡΠ° Π½Π° ΠΊΠΎΠΌΠΈΡΠΈΡΠ΅, ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΈΠ·Π²Π»ΠΈΡΠ°Π½Π΅) Π·Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½Π΅ Π½Π° Π±ΡΡΠ·ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ Ρ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ.
Π’Π΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅Π½ ΡΠΏΠΈΡΡΠΊ Ρ ΠΊΠ»ΡΡΠΎΠ²ΠΈ ΠΈΠ·Π²ΠΎΠ΄ΠΈ
ΠΡΠ΅Π΄ΠΈ Π΄Π° ΡΡΠΈΡΠ°ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΡΠ° Π½Π° Git Π·Π° Π³ΠΎΡΠΎΠ²Π° Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ, ΠΏΡΠΎΠ²Π΅ΡΠ΅ΡΠ΅ Π²ΡΡΠΊΠΎ ΠΎΡ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅:
- ΠΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π° ΡΠ°ΠΌΠΎΠ»ΠΈΡΠ½ΠΎΡΡ:
user.nameΠΈuser.emailΠ·Π°Π΄Π°Π΄Π΅Π½ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ ΠΏΡΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΡ ΠΎΠ±Ρ Π²Π°Ρ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° - ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ SSH ΠΊΠ»ΡΡΠΎΠ²Π΅: Π£Π΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π°Π½Π΅ΡΠΎ Ρ ΠΏΠ°ΡΠΎΠ»Π° ΠΊΡΠΌ ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΈ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° Π·Π°ΠΌΠ΅Π½Π΅Π½ΠΎ Ρ Π΄Π²ΠΎΠΉΠΊΠΈ SSH ΠΊΠ»ΡΡΠΎΠ²Π΅ ΠΈΠ»ΠΈ HTTPS, Π±Π°Π·ΠΈΡΠ°Π½ Π½Π° ΡΠΎΠΊΠ΅Π½ΠΈ
.gitignoreΠΊΠΎΠΌΠΈΡΠ½Π°Ρ: Π’Π°ΠΉΠ½ΠΈ, Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΈ ΠΎΡ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° ΠΠ‘ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈ ΠΏΡΠ΅Π΄ΠΈ ΠΏΡΡΠ²ΠΈΡ ΠΊΠΎΠΌΠΈΡ- ΠΡΠ½ΠΎΠ²Π½ΠΈΡΡ ΠΊΠ»ΠΎΠ½ Π΅ Π½Π°ΡΠ΅ΡΠ΅Π½
main:init.defaultBranchΠ·Π°Π΄Π°Π΄Π΅Π½ Π³Π»ΠΎΠ±Π°Π»Π½ΠΎ, Π·Π° Π΄Π° ΡΠ΅ ΠΈΠ·Π±Π΅Π³Π½Π΅ Π½Π°ΡΠ»Π΅Π΄ΡΡΠ²Π΅Π½ΠΎΡΠΎ ΠΈΠΌΠ΅Π½ΡΠ²Π°Π½Π΅master - Π‘ΡΠΎΠ±ΡΠ΅Π½ΠΈΡΡΠ° Π·Π° ΠΊΠΎΠΌΠΈΡΠΈ ΡΠ»Π΅Π΄Π²Π°Ρ ΠΊΠΎΠ½Π²Π΅Π½ΡΠΈΡ: ΠΠΎΠ½Π²Π΅Π½ΡΠΈΠΎΠ½Π°Π»Π½ΠΈ ΠΊΠΎΠΌΠΈΡΠΈ (
feat:,fix:,chore:) ΠΈΠ»ΠΈ ΡΠΎΡΠΌΠ°Ρ, Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠ΅Π½ ΠΎΡ Π΅ΠΊΠΈΠΏΠ°, Π½Π°Π»ΠΎΠΆΠ΅Π½ ΡΡΠ΅Π· ΠΊΡΠΊΠ°commit-msg git revertΠ·Π° ΠΏΡΠ±Π»ΠΈΡΠ½Π° ΠΈΡΡΠΎΡΠΈΡ:git reset --hardΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ ΡΠ°ΠΌΠΎ ΠΏΡΠΈ Π»ΠΎΠΊΠ°Π»Π½ΠΈ, Π½Π΅ΠΈΠ·ΠΏΡΠ°ΡΠ΅Π½ΠΈ ΠΊΠΎΠΌΠΈΡΠΈ--force-with-leaseΠ²ΠΌΠ΅ΡΡΠΎ--force: ΠΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΡΠ²Π° ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ ΠΏΡΠ΅Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½ΠΈΡΡΠ° Π½Π° ΠΊΠΎΠ»Π΅Π³ΠΈ- ΠΠ½ΠΎΡΠΈΡΠ°Π½ΠΈ ΡΠ°Π³ΠΎΠ²Π΅ Π·Π° ΠΈΠ·Π΄Π°Π½ΠΈΡ:
git tag -aΡΡΡ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅, Π° Π½Π΅ Π»Π΅ΠΊΠΈ ΡΠ°Π³ΠΎΠ²Π΅ - ΠΡΠΊΠΈΡΠ΅ ΡΠΏΠΎΠ΄Π΅Π»Π΅Π½ΠΈ ΡΡΠ΅Π·
pre-commitΠΈΠ»ΠΈhusky: ΠΠΎΡΡΠΈΡΠ΅ Π·Π° ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ Π½Π°Π»ΠΎΠΆΠ΅Π½ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ Π² ΡΠ΅Π»ΠΈΡ Π΅ΠΊΠΈΠΏ - Git LFS ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½, Π°ΠΊΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ ΡΡΠ΄ΡΡΠΆΠ° Π΄Π²ΠΎΠΈΡΠ½ΠΈ Π°ΠΊΡΠΈΠ²ΠΈ Π½Π°Π΄ 1 MB
- ΠΠΎΠ»ΠΎ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π½Π° ΡΡΡΠ²ΡΡΠ°: Π‘Π°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»Π½ΠΎ Ρ
ΠΎΡΡΠ²Π°Π½ΠΈΡΠ΅ ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΈ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ Ρ
git init --bare - Π Π΅Π΄ΠΎΠ²Π΅Π½
git fetch --prune: Π Π΅ΡΠ΅ΡΠ΅Π½ΡΠΈΠΈΡΠ΅ Π·Π° ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΎ ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠ°Π½ΠΈ Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»Π½ΠΎΡΠΎ ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΎ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅
Π§Π΅ΡΡΠΎ Π·Π°Π΄Π°Π²Π°Π½ΠΈ Π²ΡΠΏΡΠΎΡΠΈ
ΠΠ°ΠΊΠ²Π° Π΅ ΡΠ°Π·Π»ΠΈΠΊΠ°ΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ git fetch ΠΈ git pull?
git fetch ΠΈΠ·ΡΠ΅Π³Π»Ρ ΠΊΠΎΠΌΠΈΡΠΈ, ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ ΠΈ ΡΠ°Π³ΠΎΠ²Π΅ ΠΎΡ ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΎΡΠΎ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π² Π»ΠΎΠΊΠ°Π»Π½ΠΈΡΠ΅ ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠΈΠΈ Π·Π° ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΎ ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ (Π½Π°ΠΏΡ. origin/main), Π±Π΅Π· Π΄Π° Π·Π°ΡΡΠ³Π° ΡΠ°Π±ΠΎΡΠ½Π°ΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ ΠΈΠ»ΠΈ ΡΠ΅ΠΊΡΡΠΈΡ ΠΊΠ»ΠΎΠ½. git pull Π΅ git fetch, ΠΏΠΎΡΠ»Π΅Π΄Π²Π°Π½ΠΎ Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ ΠΎΡ git merge (ΠΈΠ»ΠΈ git rebase, Π°ΠΊΠΎ Π΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½ΠΎ). ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ git fetch, ΠΊΠΎΠ³Π°ΡΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π½Π°Π³ΠΎΡΠ΅ ΠΏΠΎ Π²Π΅ΡΠΈΠ³Π°ΡΠ° ΠΏΡΠ΅Π΄ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ°Π½Π΅ΡΠΎ ΠΈΠΌ.
ΠΠΎΠ³Π° ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ git rebase Π²ΠΌΠ΅ΡΡΠΎ git merge?
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ rebase Π·Π° Π»ΠΈΠ½Π΅Π°ΡΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° Π»ΠΎΠΊΠ°Π»Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π΅Π½ ΠΊΠ»ΠΎΠ½ ΠΏΡΠ΅Π΄ΠΈ ΠΎΡΠ²Π°ΡΡΠ½Π΅ Π½Π° Π·Π°ΡΠ²ΠΊΠ° Π·Π° ΡΠ»ΠΈΠ²Π°Π½Π΅, ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°ΠΉΠΊΠΈ ΠΈΡΡΠΎΡΠΈΡΡΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° ΡΠ΅ΡΠΈΠΌΠ°. ΠΠΈΠΊΠΎΠ³Π° Π½Π΅ ΠΏΡΠ΅Π±Π°Π·ΠΈΡΠ°ΠΉΡΠ΅ ΠΊΠ»ΠΎΠ½, Π²ΡΡΡ Ρ ΠΊΠΎΠΉΡΠΎ Π΄ΡΡΠ³ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ Π²Π΅ΡΠ΅ ΡΠ° ΠΊΠ»ΠΎΠ½ΠΈΡΠ°Π»ΠΈ ΠΈΠ»ΠΈ Π±Π°Π·ΠΈΡΠ°Π»ΠΈ ΡΠ°Π±ΠΎΡΠ° β ΠΏΡΠ΅Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½ΠΈ Ρ Π΅ΡΠΎΠ²Π΅ Π½Π° ΠΊΠΎΠΌΠΈΡΠΈ ΠΏΡΠΈΠ½ΡΠΆΠ΄Π°Π²Π° Π²ΡΠΈΡΠΊΠΈ ΠΎΡΡΠ°Π½Π°Π»ΠΈ ΡΡΡΠ½ΠΎ Π΄Π° ΡΡΠ³Π»Π°ΡΡΠ²Π°Ρ ΡΠ°Π·ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΡΠ΅ ΠΈΡΡΠΎΡΠΈΠΈ.
ΠΠ°ΠΊ Π΄Π° ΠΏΡΠ΅ΠΌΠ°Ρ Π½Π° ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»Π½ΠΎ ΡΡΠ²ΡΡΠ²ΠΈΡΠ΅Π»Π΅Π½ ΡΠ°ΠΉΠ», ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ ΠΊΠΎΠΌΠΈΡΠ½Π°Ρ?
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ git filter-repo (ΡΡΠ²ΡΠ΅ΠΌΠ΅Π½Π½Π°ΡΠ° Π·Π°ΠΌΡΠ½Π° Π½Π° git filter-branch): git filter-repo --path secrets.env --invert-paths. Π’ΠΎΠ²Π° ΠΏΡΠ΅Π·Π°ΠΏΠΈΡΠ²Π° ΡΡΠ»Π°ΡΠ° ΠΈΡΡΠΎΡΠΈΡ Π½Π° Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ, ΠΏΡΠ΅ΠΌΠ°Ρ
Π²Π°ΠΉΠΊΠΈ ΡΠ°ΠΉΠ»Π° ΠΎΡ Π²ΡΠ΅ΠΊΠΈ ΠΊΠΎΠΌΠΈΡ. Π‘Π»Π΅Π΄ ΠΏΡΠ΅Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ, ΠΏΡΠΈΠ½ΡΠ΄ΠΈΡΠ΅Π»Π½ΠΎ ΠΈΠ·ΠΏΡΠ°ΡΠ΅ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ ΠΈ ΡΠ°Π³ΠΎΠ²Π΅, ΡΠ»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ ΡΠΌΠ΅Π½Π΅ΡΠ΅ ΡΠ°Π·ΠΊΡΠΈΡΠΈΡΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΎΠ½Π½ΠΈ Π΄Π°Π½Π½ΠΈ β ΠΏΡΠΈΠ΅ΠΌΠ°ΠΉΡΠ΅, ΡΠ΅ ΡΠ° ΠΊΠΎΠΌΠΏΡΠΎΠΌΠ΅ΡΠΈΡΠ°Π½ΠΈ, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΊΠΎΠ»ΠΊΠΎ Π±ΡΡΠ·ΠΎ Π΄Π΅ΠΉΡΡΠ²Π°ΡΠ΅.
ΠΠ°ΠΊΠ²ΠΎ Π΅ ΠΎΡΠ΄Π΅Π»Π΅Π½ΠΎ HEAD ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ ΠΈ ΠΊΠ°ΠΊ Π΄Π° ΡΠ΅ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²Ρ ΠΎΡ Π½Π΅Π³ΠΎ?
ΠΡΠ΄Π΅Π»Π΅Π½ΠΎΡΠΎ HEAD ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ Π²Π°ΡΠΈΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π» HEAD ΠΏΡΠ΅ΠΏΡΠ°ΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΊΡΠΌ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ΅Π½ Ρ
Π΅Ρ Π½Π° ΠΊΠΎΠΌΠΈΡ, Π° Π½Π΅ ΠΊΡΠΌ ΠΈΠΌΠ΅ Π½Π° ΠΊΠ»ΠΎΠ½. ΠΡΠΈΡΠΊΠΈ ΠΊΠΎΠΌΠΈΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΏΡΠ°Π²ΠΈΡΠ΅, Π½ΡΠΌΠ° Π΄Π° ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ ΠΊΡΠΌ Π½ΠΈΠΊΠΎΠΉ ΠΊΠ»ΠΎΠ½ ΠΈ ΡΠ΅ ΡΡΠ°Π½Π°Ρ Π½Π΅Π΄ΠΎΡΡΠΈΠΆΠΈΠΌΠΈ ΡΠ»Π΅Π΄ ΠΏΡΠ΅Π²ΠΊΠ»ΡΡΠ²Π°Π½Π΅. ΠΠ° Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅: git switch -c new-branch-name Π·Π° ΠΏΡΠΈΠΊΠ°ΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠΌΠΈΡΠΈΡΠ΅ ΠΊΡΠΌ Π½ΠΎΠ² ΠΊΠ»ΠΎΠ½, ΠΈΠ»ΠΈ git switch main Π·Π° ΠΎΡΡ
Π²ΡΡΠ»ΡΠ½Π΅ΡΠΎ ΠΈΠΌ.
ΠΠ°ΠΊ Git ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π° Π΄Π²ΠΎΠΈΡΠ½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΏΠΎ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ Π½Π°ΡΠΈΠ½ ΠΎΡ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅?
Git ΡΡΡ ΡΠ°Π½ΡΠ²Π° Π΄Π²ΠΎΠΈΡΠ½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΊΠ°ΡΠΎ Π½Π΅ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΈ blob-ΠΎΠ²Π΅ β Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π° ΡΠΌΠΈΡΠ»Π΅Π½ΠΈ ΡΠ°Π·Π»ΠΈΠΊΠΈ Π½Π° Π½ΠΈΠ²ΠΎ ΡΠ΅Π΄ΠΎΠ²Π΅ ΠΈΠ»ΠΈ Π΄Π° ΠΈΠ·Π²ΡΡΡΠ²Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΈ ΡΠ»ΠΈΠ²Π°Π½ΠΈΡ Π²ΡΡΡ Ρ ΡΡΡ . ΠΠΎΠ½ΡΠ»ΠΈΠΊΡΠΈΡΠ΅ Π² Π΄Π²ΠΎΠΈΡΠ½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ°Π²Π°Ρ ΡΡΠ΅Π· ΠΈΠ·Π±ΠΎΡ Π½Π° Π΅Π΄Π½Π° Π²Π΅ΡΡΠΈΡ ΠΈΠ·ΡΡΠ»ΠΎ. ΠΠ° Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° ΡΡΡ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΈ Π΄Π²ΠΎΠΈΡΠ½ΠΈ Π°ΠΊΡΠΈΠ²ΠΈ, ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΠΉΡΠ΅ Git LFS Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π²ΠΎΠΈΡΠ½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΈΠ·Π²ΡΠ½ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ, ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°ΠΉΠΊΠΈ ΡΠ°ΠΌΠΎΡΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΠΎ ΠΈ Π±ΡΡΠ·ΠΎ.
ΠΎΡ Π²ΡΠΈΡΠΊΠΈ Ρ
ΠΎΡΡΠΈΠ½Π³ ΡΡΠ»ΡΠ³ΠΈ