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

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

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠ΄: Skills ΠΠ°Ρ‡Π°Ρ‚ΡŒ
Π ΡƒΠ±Ρ€ΠΈΠΊΠΈ
VPS Администрация

Git Reset vs. Git Checkout vs. Git Revert: ПолноС тСхничСскоС руководство

ПониманиС Ρ€Π°Π·Π½ΠΈΡ†Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ git reset, git checkout ΠΈ git revert Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΌΡƒ с систСмой контроля вСрсий. Если ΠΊΡ€Π°Ρ‚ΠΊΠΎ: git reset пСрСзаписываСт ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ, пСрСмСщая ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ HEAD; git checkout осущСствляСт Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΡŽ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Π΅Ρ‚ΠΊΠ°ΠΌΠΈ, ΠΊΠΎΠΌΠΌΠΈΡ‚Π°ΠΌΠΈ ΠΈΠ»ΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Π±Π΅Π· измСнСния истории; Π° git revert отмСняСт ΠΊΠΎΠΌΠΌΠΈΡ‚, создавая Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚, оставляя ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ Π½Π΅Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚ΠΎΠΉ. Π’Ρ‹Π±ΠΎΡ€ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ β€” особСнно Π² ΠΎΠ±Ρ‰Π΅ΠΉ Π²Π΅Ρ‚ΠΊΠ΅ β€” ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ²Ρ€Π΅Π΄ΠΈΡ‚ΡŒ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² вашСй ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΠ»ΠΈ привСсти ΠΊ Π±Π΅Π·Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π½ΠΎΠΉ ΠΏΠΎΡ‚Π΅Ρ€Π΅ Π΄Π°Π½Π½Ρ‹Ρ….

Π­Ρ‚ΠΎ руководство Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ повСрхностного синтаксиса ΠΈ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ ΠΌΠ΅Ρ…Π°Π½ΠΈΠΊΡƒ Git, Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ состояниС вашСго Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ Π΄Π΅Ρ€Π΅Π²Π° ΠΈ индСкса послС ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ сцСнарии, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… каТдая ΠΊΠΎΠΌΠ°Π½Π΄Π° являСтся ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ (ΠΈΠ»ΠΈ катастрофичСски Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΌ) Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ.

Как Git управляСт состояниСм: Ρ‚Ρ€ΠΈ Π΄Π΅Ρ€Π΅Π²Π°

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° чёткая ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ модСль Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Git отслСТиваСт состояниС. Git Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° Ρ‚Ρ€Ρ‘Ρ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… уровнях:

  • Π Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ β€” Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Π½Π° дискС.
  • ΠžΠ±Π»Π°ΡΡ‚ΡŒ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ (индСкс) β€” снимок Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²ΠΎΠΉΠ΄Ρ‘Ρ‚ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚.
  • Π˜ΡΡ‚ΠΎΡ€ΠΈΡ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² (HEAD) β€” Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° нСизмСняСмых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ², хранящихся Π² .git/.

КаТдая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ Π² Git воздСйствуСт Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько ΠΈΠ· этих ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ. ΠŸΡƒΡ‚Π°Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ reset, checkout ΠΈ revert ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΈΠ·-Π·Π° нСзнания Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ ΡƒΡ€ΠΎΠ²Π½ΠΈ Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°Π΅Ρ‚ Ρ‚Π° ΠΈΠ»ΠΈ иная ΠΊΠΎΠΌΠ°Π½Π΄Π°.

git reset: ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡŒ локальной истории

git reset ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ HEAD Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π²Π΅Ρ‚ΠΊΠΈ Π½Π° ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚. Π’ зависимости ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ„Π»Π°Π³Π° Ρ€Π΅ΠΆΠΈΠΌΠ° ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ индСкс ΠΈ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³. Π­Ρ‚ΠΎ опСрация пСрСзаписи истории, ΠΈ ΠΏΡ€ΠΈ использовании с --hard Π΅Ρ‘ слСдуСт ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ дСструктивной.

ОбъяснСниС Ρ€Π΅ΠΆΠΈΠΌΠΎΠ² сброса

git reset --soft <commit>   # Move HEAD only; index and working tree unchanged
git reset --mixed <commit>  # Move HEAD + reset index; working tree unchanged (default)
git reset --hard <commit>   # Move HEAD + reset index + reset working tree
Π Π΅ΠΆΠΈΠΌHEAD пСрСмСщаСтсяБброс индСксаБброс Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ Π΄Π΅Ρ€Π΅Π²Π°Π˜Π·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ
--softΠ”Π°ΠΠ΅Ρ‚ΠΠ΅Ρ‚ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹Π΅ ΠΈ Π½Π΅ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹Π΅
--mixedΠ”Π°Π”Π°ΠΠ΅Ρ‚Π’ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹Π΅
--hardДаДаДаНСт β€” Π±Π΅Π·Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π½ΠΎ утСряны

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ использования

ОбъСдинСниС ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΎΠΉ. Если Ρƒ вас Π΅ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ Π½Π΅Π·Π°Π²Π΅Ρ€ΡˆΡ‘Π½Π½Ρ‹Ρ… Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… ΠΊΠΎΠΌΠΌΠΈΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅Ρ‰Ρ‘ Π½Π΅ Π±Ρ‹Π»ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Ρ‹, git reset --soft HEAD~3 сворачиваСт ΠΈΡ… ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² индСкс, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚ Π² Π²ΠΈΠ΄Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ чистого ΠΊΠΎΠΌΠΌΠΈΡ‚Π°.

ΠžΡ‚ΠΌΠ΅Π½Π° ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ случайно Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ git reset HEAD <file> (ΠΈΠ»ΠΈ git reset Π±Π΅Π· ссылки Π½Π° ΠΊΠΎΠΌΠΌΠΈΡ‚) удаляСт Ρ„Π°ΠΉΠ» ΠΈΠ· индСкса, Π½Π΅ затрагивая Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ β€” ΠΏΠΎ эффСкту ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎ git restore --staged <file> Π² Git 2.23+.

ВосстановлСниС послС Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠ³ΠΎ локального слияния. git reset --hard ORIG_HEAD восстанавливаСт состояниС, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Π²ΡˆΠ΅Π΅ нСпосрСдствСнно ΠΏΠ΅Ρ€Π΅Π΄ слияниСм, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Git автоматичСски записываСт HEAD Π΄ΠΎ слияния Π² ORIG_HEAD.

ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠ°Ρ Π»ΠΎΠ²ΡƒΡˆΠΊΠ°: ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° послС сброса

Если Π²Ρ‹ сбросили Π²Π΅Ρ‚ΠΊΡƒ, которая ΡƒΠΆΠ΅ Π±Ρ‹Π»Π° ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π° Π½Π° ΡƒΠ΄Π°Π»Ρ‘Π½Π½Ρ‹ΠΉ сСрвСр, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ, Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ участника, Ρ‡ΡŒΡ локальная Π²Π΅Ρ‚ΠΊΠ° отслСТиваСт этот ΡƒΠ΄Π°Π»Ρ‘Π½Π½Ρ‹ΠΉ сСрвСр, Π±ΡƒΠ΄Π΅Ρ‚ расходящаяся история. Π­Ρ‚ΠΎ ΠΎΠ΄Π½Π° ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространённых ΠΏΡ€ΠΈΡ‡ΠΈΠ½ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹Ρ… срСдах. Никогда Π½Π΅ выполняйтС git reset с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ git push --force Π² ΠΎΠ±Ρ‰Π΅ΠΉ Π²Π΅Ρ‚ΠΊΠ΅ Π±Π΅Π· явной ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ†ΠΈΠΈ с ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ.

# Dangerous on shared branches β€” use only on private/local branches
git reset --hard HEAD~2
git push --force origin feature/my-branch

git checkout: навигация Π±Π΅Π· измСнСния истории

git checkout β€” ΠΌΠ½ΠΎΠ³ΠΎΡ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°, которая ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‡Π΅Π΅ Π΄Π΅Ρ€Π΅Π²ΠΎ для соотвСтствия Π²Π΅Ρ‚ΠΊΠ΅, ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρƒ ΠΈΠ»ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ. Она Π½Π΅ измСняСт ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ². Π’ Git 2.23 ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΡ… вСрсиях Π΅Ρ‘ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Ρ‹Π»ΠΈ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Ρ‹ Π½Π° git switch (для Π²Π΅Ρ‚ΠΎΠΊ) ΠΈ git restore (для Ρ„Π°ΠΉΠ»ΠΎΠ²), ΠΎΠ΄Π½Π°ΠΊΠΎ git checkout ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π° ΠΈ Π΄ΠΎΠΌΠΈΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ Π² производствСнных срСдах.

Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ ΠΏΠΎ синтаксису

git checkout <branch_name>          # Switch to an existing branch
git checkout -b <new_branch>        # Create and switch to a new branch
git checkout <commit_hash>          # Enter detached HEAD state at a specific commit
git checkout -- <file_name>         # Discard working directory changes to a file
git checkout <commit_hash> -- <file> # Restore a single file from a specific commit

БостояниС отсоСдинённого HEAD: Ρ‡Ρ‚ΠΎ это Π½Π° самом Π΄Π΅Π»Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚

Когда Π²Ρ‹ выполняСтС git checkout <commit_hash>, Git ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ HEAD Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π» нСпосрСдствСнно Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°, Π° Π½Π΅ Π½Π° ссылку Π²Π΅Ρ‚ΠΊΠΈ. Π­Ρ‚ΠΎ называСтся состояниСм отсоСдинённого HEAD. Π›ΡŽΠ±Ρ‹Π΅ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹, сдСланныС Π² этом состоянии, нСдостиТимы Π½ΠΈ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠΈ β€” ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΡΠΈΡ€ΠΎΡ‚Π΅Π²ΡˆΠΈΠΌΠΈ ΠΈ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ сборщиком мусора Git, Ссли Π²Ρ‹ Π½Π΅ создадитС Π²Π΅Ρ‚ΠΊΡƒ для ΠΈΡ… сохранСния.

git checkout 4f7a2c1          # HEAD now points directly to commit 4f7a2c1
git checkout -b hotfix/patch  # Rescue those commits by creating a branch

Распространённый Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ сцСнарий: Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π½Π° старый ΠΊΠΎΠΌΠΌΠΈΡ‚ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ рСгрСссии, случайно вносит исправлСниС, Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠΎΠΌΠΌΠΈΡ‚, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π½Π° main β€” ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ тСряя исправлСниС, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±Ρ‹Π»ΠΎ привязано ΠΊ Π²Π΅Ρ‚ΠΊΠ΅.

ВосстановлСниС ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΈΠ· истории

Одна ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Ρ€Π΅Π΄ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Ρ„ΠΎΡ€ΠΌ git checkout β€” Ρ†Π΅Π»Π΅Π²ΠΎΠ΅ восстановлСниС Ρ„Π°ΠΉΠ»Π°:

git checkout HEAD~3 -- src/config/database.php

Π­Ρ‚ΠΎ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ database.php Π² Ρ‚ΠΎΠΌ Π²ΠΈΠ΄Π΅, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΎΠ½ сущСствовал Ρ‚Ρ€ΠΈ ΠΊΠΎΠΌΠΌΠΈΡ‚Π° Π½Π°Π·Π°Π΄, нСпосрСдствСнно Π² ваш индСкс ΠΈ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π½Π΅ затрагивая Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„Π°ΠΉΠ» ΠΈ Π½Π΅ пСрСмСщая HEAD. Π­Ρ‚ΠΎ хирургичСский эквивалСнт ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π²Π΅Ρ‚ΠΊΠΈ.

git revert: бСзопасная ΠΎΡ‚ΠΌΠ΅Π½Π° для ΠΎΠ±Ρ‰Π΅ΠΉ истории

git revert создаёт Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚, ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΉ ΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°. Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚ остаётся Π² истории Π½Π΅Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚Ρ‹ΠΌ. Π­Ρ‚ΠΎ СдинствСнный бСзопасный ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ для ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Ρ‹ Π² ΠΎΠ±Ρ‰ΡƒΡŽ ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΡƒΡŽ Π²Π΅Ρ‚ΠΊΡƒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ Π½Π΅ пСрСзаписываСт ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ β€” Π° Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ Π΅Ρ‘.

Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ ΠΏΠΎ синтаксису

git revert HEAD                  # Revert the most recent commit
git revert <commit_hash>         # Revert a specific commit by hash
git revert HEAD~3..HEAD          # Revert a range of commits (creates multiple revert commits)
git revert -n <commit_hash>      # Stage the revert without committing (--no-commit)

Π€Π»Π°Π³ –no-commit: пакСтная ΠΎΡ‚ΠΌΠ΅Π½Π°

ΠŸΡ€ΠΈ ΠΎΡ‚ΠΌΠ΅Π½Π΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² созданиС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΠΈΡ‚Π° ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ исходный ΠΊΠΎΠΌΠΌΠΈΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΡΠΎΡ€ΠΈΡ‚ΡŒ ΠΆΡƒΡ€Π½Π°Π». Π€Π»Π°Π³ -n (ΠΈΠ»ΠΈ --no-commit) ΠΏΠΎΠ΄Π³ΠΎΡ‚Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ всС ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ Π±Π΅Π· ΠΊΠΎΠΌΠΌΠΈΡ‚Π°, позволяя ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΈΡ… Π² ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠΌΠΌΠΈΡ‚ ΠΎΡ‚ΠΌΠ΅Π½Ρ‹:

git revert -n HEAD~4..HEAD
git commit -m "Revert: roll back broken authentication refactor"

ΠžΡ‚ΠΌΠ΅Π½Π° ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² слияния Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ особой остороТности

ΠžΡ‚ΠΌΠ΅Π½Π° ΠΊΠΎΠΌΠΌΠΈΡ‚Π° слияния Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ указания основного родитСля с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„Π»Π°Π³Π° -m, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Git Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΡƒΡŽ сторону слияния ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Β«ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉΒ» историСй:

git revert -m 1 <merge_commit_hash>

Π—Π΄Π΅ΡΡŒ -m 1 ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ родитСля (ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π²Π΅Ρ‚ΠΊΡƒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»ΠΎΡΡŒ слияниС) Π² качСствС основной Π»ΠΈΠ½ΠΈΠΈ. ΠŸΡ€ΠΎΠΏΡƒΡΠΊ этого Ρ„Π»Π°Π³Π° для ΠΊΠΎΠΌΠΌΠΈΡ‚Π° слияния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ ошибкС Git. Π­Ρ‚ΠΎ распространённоС прСпятствиС ΠΏΡ€ΠΈ ΠΎΡ‚ΠΌΠ΅Π½Π΅ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΠΈΡ‚Π° слияния Ρ€Π΅Π»ΠΈΠ·Π° Π² CI/CD-ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°Ρ….

Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅: Reset vs. Checkout vs. Revert

ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΉ`git reset``git checkout``git revert`
Π˜Π·ΠΌΠ΅Π½ΡΠ΅Ρ‚ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ коммитовДаНСтНСт (добавляСт ΠΊ Π½Π΅ΠΉ)
ВлияСт Π½Π° Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π‘ --hard ΠΈΠ»ΠΈ --mixedΠ”Π°Π”Π° (Ρ‡Π΅Ρ€Π΅Π· Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚)
ВлияСт Π½Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ (индСкс)Π”Π° (ΠΊΡ€ΠΎΠΌΠ΅ --soft)Волько Π² Ρ„ΠΎΡ€ΠΌΠ΅ с файломНСт
БСзопасСн для ΠΎΠ±Ρ‰ΠΈΡ…/ΡƒΠ΄Π°Π»Ρ‘Π½Π½Ρ‹Ρ… вСтокНСтДа (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅)Π”Π°
Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ коммитНСтНСтДа
ΠžΠ±Ρ€Π°Ρ‚ΠΈΠΌΠ§Π°ΡΡ‚ΠΈΡ‡Π½ΠΎ (Ρ‡Π΅Ρ€Π΅Π· ORIG_HEAD)Π”Π°Π”Π°
ΠžΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ слиянияНСтДа (навигация)Π”Π° (с -m)
Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ эквивалСнт Π² Git 2.23+Π’ΠΎΡ‚ ΠΆΠ΅git switch / git restoreΠ’ΠΎΡ‚ ΠΆΠ΅

Когда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ: ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ git reset ΠΊΠΎΠ³Π΄Π°:

  • Π’Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ Π² локальной, Π½Π΅ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠ΅ ΠΈ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ, ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΎΡ‚Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹.
  • Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΡƒ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠΌ.
  • Π’Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ локальноС слияниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ Π±Ρ‹Π»ΠΎ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ΠΎ.
  • Π’Ρ‹ СдинствСнный Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠ΅ ΠΈ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΅Ρ‘ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ΠΌ pull request.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ git checkout ΠΊΠΎΠ³Π΄Π°:

  • Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Π΅Ρ‚ΠΊΠ°ΠΌΠΈ Π² процСссС Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.
  • Π’Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ состояниС рСпозитория Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ историчСского ΠΊΠΎΠΌΠΌΠΈΡ‚Π°, Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ измСняя.
  • Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ» Π΄ΠΎ Π΅Π³ΠΎ состояния Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°.
  • Π’Ρ‹ создаётС Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ‚ΠΊΡƒ ΠΈΠ· ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ Π² истории.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ git revert ΠΊΠΎΠ³Π΄Π°:

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

Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ сцСнарий: восстановлСниС послС git reset –hard

Если Π²Ρ‹ случайно Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ git reset --hard ΠΈ потСряли ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹, ΠΎΠ½ΠΈ Π½Π΅ исчСзли Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ. Reflog Git записываСт ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π» HEAD, Π΄Π°ΠΆΠ΅ послС Тёсткого сброса:

git reflog
# Output example:
# a1b2c3d HEAD@{0}: reset: moving to HEAD~3
# 7e8f9a0 HEAD@{1}: commit: Add payment gateway integration
# ...

git reset --hard HEAD@{1}   # Restore to the commit before the accidental reset

Записи reflog ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΡ‚Π΅ΠΊΠ°ΡŽΡ‚ Ρ‡Π΅Ρ€Π΅Π· 90 Π΄Π½Π΅ΠΉ (gc.reflogExpire), поэтому это ΠΎΠΊΠ½ΠΎ восстановлСния Π½Π΅ бСсконСчно. На производствСнном сСрвСрС ΠΈΠ»ΠΈ Π² срСдС VPS Π₯остинга, Π³Π΄Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ‰Ρ‘Π½Π½Ρ‹ΠΉ Git-сСрвис, Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ Gitea ΠΈΠ»ΠΈ GitLab, Π²Π°ΠΌ слСдуСт ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ .git Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½ Π² рСгулярныС ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ³ΠΎ копирования ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΠ·-Π·Π° этого срока дСйствия.

Π Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ вашСй Git-инфраструктуры

Запуск ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ‰Ρ‘Π½Π½ΠΎΠ³ΠΎ Git-сСрвСра β€” Π±ΡƒΠ΄ΡŒ Ρ‚ΠΎ GitLab CE, Gitea ΠΈΠ»ΠΈ Gogs β€” Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π½Π°Π΄Ρ‘ΠΆΠ½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° ΠΈ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π±Π΅Π·ΠΎΡ‚ΠΊΠ°Π·Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Один ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Ρ‘Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΈΠ»ΠΈ прСрванная ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Π²ΠΎ врСмя Ρ†ΠΈΠΊΠ»Π° git gc ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°Ρ€ΡƒΡˆΠΈΡ‚ΡŒ Ρ†Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ рСпозитория. Для ΠΊΠΎΠΌΠ°Π½Π΄, ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… нСсколькими рСпозиториями, Π’Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ сСрвСр обСспСчиваСт ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ рСсурсы, ΠΏΠΎΠ»Π½Ρ‹ΠΉ root-доступ для Ρ‚ΠΎΠ½ΠΊΠΎΠΉ настройки ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² core.packedGitWindowSize ΠΈ pack.threads Git, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ½ΡƒΡŽ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ NVMe, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΌΠΎΠ½ΠΎΡ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π².

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

Если ваш Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ процСсс Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ развёртывания, запускаСмыС git push, Π·Π°Ρ‰ΠΈΡ‚Π° вашСго сСрвСра Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ SSL-сСртификатом являСтся ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ β€” ΠΊΠ°ΠΊ для ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… Π½Π°Π³Ρ€ΡƒΠ·ΠΎΠΊ Π²Π΅Π±Ρ…ΡƒΠΊΠΎΠ², Ρ‚Π°ΠΊ ΠΈ для Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΡƒΠ΄Π°Π»Ρ‘Π½Π½Ρ‹Ρ… Git-Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π² Π½Π° основС HTTPS Π±Π΅Π· ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ сСртификатов.

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ тСхничСскиС Π²Ρ‹Π²ΠΎΠ΄Ρ‹

  • git reset --hard β€” СдинствСнная ΠΈΠ· Ρ‚Ρ€Ρ‘Ρ… ΠΊΠΎΠΌΠ°Π½Π΄, которая ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π±Π΅Π·Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π½ΠΎΠΉ, нСвосстановимой ΠΏΠΎΡ‚Π΅Ρ€Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, Ссли срок дСйствия reflog истёк.
  • git revert β€” СдинствСнная ΠΊΠΎΠΌΠ°Π½Π΄Π°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ бСзопасно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ послС git push Π±Π΅Π· нСобходимости ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ.
  • БостояниС отсоСдинённого HEAD ΠΎΡ‚ git checkout <hash> Π½Π΅ удаляСт ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ β€” Π½ΠΎ Π»ΡŽΠ±Ρ‹Π΅ Π½ΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹, сдСланныС Π² этом состоянии, Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡΠΈΡ€ΠΎΡ‚Π΅Π²ΡˆΠΈΠΌΠΈ, Ссли Π²Ρ‹ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ git checkout -b <new_branch>.
  • Π€Π»Π°Π³ -n для git revert критичСски Π²Π°ΠΆΠ΅Π½ для поддСрТания чистого ΠΆΡƒΡ€Π½Π°Π»Π° ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΠ°Ρ‚Π΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.
  • Git 2.23+ раздСляСт git checkout Π½Π° git switch ΠΈ git restore для ясности β€” ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ исходной ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΎΠ±Π΅ соврСмСнныС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ сразу ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ понятными.
  • ВсСгда провСряйтС Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π²Π΅Ρ‚ΠΊΡƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ git status ΠΈ git log --oneline -5 ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ любой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΎΡ‚ΠΌΠ΅Π½Ρ‹.
  • Π’ ΠΎΠ±Ρ‰Π΅ΠΉ инфраструктурС примСняйтС ΠΏΡ€Π°Π²ΠΈΠ»Π° Π·Π°Ρ‰ΠΈΡ‚Ρ‹ Π²Π΅Ρ‚ΠΎΠΊ (GitHub, GitLab, Gitea β€” всС ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ это) для Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ git push --force Π² Π²Π΅Ρ‚ΠΊΠ°Ρ… main ΠΈ release Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ сСрвСра.

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

Π’ Ρ‡Ρ‘ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ git reset --soft ΠΈ git reset --mixed?

ОбС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ HEAD Π½Π° ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚, Π½ΠΎ --soft оставляСт ваши измСнСния ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΌΠΈ Π² индСксС, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ --mixed (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ) Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‡ΠΈΡ‰Π°Π΅Ρ‚ индСкс, оставляя измСнСния Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅. Ни ΠΎΠ΄Π½Π° ΠΈΠ· Π½ΠΈΡ… Π½Π΅ Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ»Ρ‹ Π½Π° дискС.

МоТно Π»ΠΈ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ послС git reset --hard?

Π”Π°, Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΠΊΠ½Π° истСчСния срока дСйствия reflog (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 90 Π΄Π½Π΅ΠΉ). Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ git reflog для поиска Ρ…ΡΡˆΠ° ΠΊΠΎΠΌΠΌΠΈΡ‚Π° потСрянного состояния, Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ git reset --hard <hash> ΠΈΠ»ΠΈ git checkout -b recovery <hash> для Π΅Π³ΠΎ восстановлСния.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ git revert для ΠΊΠΎΠΌΠΌΠΈΡ‚Π° слияния Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ„Π»Π°Π³Π° -m?

ΠšΠΎΠΌΠΌΠΈΡ‚ слияния ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²ΡƒΡ… Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ. Git Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Ρ‡ΡŒΡŽ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π±Π΅Π· указания основной Π»ΠΈΠ½ΠΈΠΈ с вашСй стороны. -m 1 ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Git ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ родитСля основной Π²Π΅Ρ‚ΠΊΠΎΠΉ, отмСняя измСнСния, внСсённыС ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Ρ‘Π½Π½ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠΎΠΉ.

ЯвляСтся Π»ΠΈ git checkout -- <file> Ρ‚Π΅ΠΌ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ git restore <file>?

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ Π΄Π° β€” ΠΎΠ±Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΎΡ‚Π±Ρ€Π°ΡΡ‹Π²Π°ΡŽΡ‚ Π½Π΅ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹Π΅ измСнСния Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° для Ρ„Π°ΠΉΠ»Π°, восстанавливая Π΅Π³ΠΎ ΠΈΠ· индСкса. git restore Π±Ρ‹Π»Π° Π²Π²Π΅Π΄Π΅Π½Π° Π² Git 2.23 ΠΊΠ°ΠΊ ΠΌΠ΅Π½Π΅Π΅ нСоднозначная Π·Π°ΠΌΠ΅Π½Π°, Π½ΠΎ git checkout -- <file> Π΄Π°Ρ‘Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π²ΠΎ всСх вСрсиях Git.

Когда катСгоричСски нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ git reset Π² Π²Π΅Ρ‚ΠΊΠ΅?

Никогда Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ git reset (особСнно с --hard ΠΈΠ»ΠΈ --mixed) Π² любой Π²Π΅Ρ‚ΠΊΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΡƒΠΆΠ΅ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ ΠΈΠ»ΠΈ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ выполняли pull. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ€Π°ΡΡ…ΠΎΠΆΠ΄Π΅Π½ΠΈΡŽ ΠΈΡ… локальной истории с ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠΉ, трСбуя ΠΎΡ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ участника выполнСния ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ сброса ΠΈΠ»ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ клонирования β€” ΠΈ рискуСт ΠΌΠΎΠ»Ρ‡Π° ΠΎΡ‚Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΠΈΡ… ΠΌΠ°ΡˆΠΈΠ½Π°Ρ….