Π‘ΡΡΡΠΊΡΡΡΠ° Π½Π° 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 resetGit Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π° ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΠΎΡ 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
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 branchconfig
ΠΠΎΠΊΠ°Π»Π½ΠΈΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π΅Π½ ΡΠ°ΠΉΠ» Π½Π° Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ. Π’ΠΎΠΉ Π·Π°ΠΌΠ΅ΡΡΠ²Π° Π³Π»ΠΎΠ±Π°Π»Π½ΠΈΡΠ΅ (~/.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 |
| Stash | refs/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 30Bare Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°: Π₯ΠΎΡΡΠ²Π°Π½Π΅ ΠΎΡ ΡΡΡΠ°Π½Π° Π½Π° ΡΡΡΠ²ΡΡΠ°
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 Π½Π΅ ΡΠ΅ ΠΊΠ»ΠΎΠ½ΠΈΡΠ°Ρ. ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ Π²ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ²Π° hookspre-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 Π·Π°Π΄Π΅ΠΉΡΡΠ²Π°Π½ΠΈΡ.
ΠΎΡ Π²ΡΠΈΡΠΊΠΈ Ρ
ΠΎΡΡΠΈΠ½Π³ ΡΡΠ»ΡΠ³ΠΈ