Skip to content

Git Rebase ​

🧠 Π‘ΡƒΡ‚ΡŒ ​

ΠŸΠ΅Ρ€Π΅Π½Π΅ΡΡ‚ΠΈ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ Π²Π΅Ρ‚ΠΊΠΈ Π½Π° Π½ΠΎΠ²ΠΎΠ΅ основаниС β€” история становится Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ Π²Π΅Ρ‚ΠΊΠ° создавалась с Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ master.

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ merge β€” пСрСписываСт ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ. Волько для своих Π²Π΅Ρ‚ΠΎΠΊ, Π½ΠΈΠΊΠΎΠ³Π΄Π° для ΠΎΠ±Ρ‰ΠΈΡ… (master, preprod, staging).


πŸ’» ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π²Π΅Ρ‚ΠΊΡƒ ΠΎΡ‚ master ​

Π‘Π°ΠΌΡ‹ΠΉ частый случай β€” ΠΏΠΎΠ΄Ρ‚ΡΠ½ΡƒΡ‚ΡŒ свСТиС измСнСния ΠΈΠ· master Π² feature-Π²Π΅Ρ‚ΠΊΡƒ:

bash
git fetch origin
git rebase origin/master

πŸ’» Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ rebase ​

ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ, ΡΠΊΠ»Π΅ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ послСдниС N ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²:

bash
git rebase -i HEAD~3   # послСдниС 3 ΠΊΠΎΠΌΠΌΠΈΡ‚Π°

Π’ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ β€” ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°:

pick a1b2c3 [Auth] Add login form       ← ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ
squash d4e5f6 wip: fix typo             ← ΡΠΊΠ»Π΅ΠΈΡ‚ΡŒ с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ
fixup g7h8i9 forgot semicolon           ← ΡΠΊΠ»Π΅ΠΈΡ‚ΡŒ, Π²Ρ‹Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ сообщСниС
reword h0i1j2 old message               ← ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΌΠΈΡ‚
drop k3l4m5 debug console.log           ← ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠΈΡ‚
edit n6o7p8 [Auth] Add JWT              ← ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ для ΠΏΡ€Π°Π²ΠΊΠΈ

squash β€” ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сообщСниС.
fixup β€” Ρ‚ΠΎ ΠΆΠ΅, Π½ΠΎ сообщСниС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΠΈΡ‚Π° выбрасываСтся автоматичСски.


πŸ’» ΠšΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ ΠΏΡ€ΠΈ rebase ​

bash
# Git остановится Π½Π° ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π½ΠΎΠΌ ΠΊΠΎΠΌΠΌΠΈΡ‚Π΅
# CONFLICT (content): Merge conflict in src/auth.php

# Π Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π² Ρ„Π°ΠΉΠ»Π΅, Π·Π°Ρ‚Π΅ΠΌ:
git add src/auth.php
git rebase --continue

# ΠŸΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚ (остороТно):
git rebase --skip

# ΠžΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ rebase ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ исходному ΡΠΎΡΡ‚ΠΎΡΠ½ΠΈΡŽ:
git rebase --abort

πŸ’» Force push послС rebase ​

Rebase пСрСписываСт ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ β€” ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ push Π½Π΅ ΠΏΡ€ΠΎΠΉΠ΄Ρ‘Ρ‚:

bash
# БСзопасный force push β€” Π½Π΅ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡˆΠ΅Ρ‚ Ρ‡ΡƒΠΆΠΈΠ΅ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹
git push origin feature/add-auth --force-with-lease

# ΠžΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ --force β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Π²Π΅Ρ‚ΠΊΠ° ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ твоя
git push origin feature/add-auth --force

--force-with-lease провСряСт Ρ‡Ρ‚ΠΎ remote Π½Π΅ ΡƒΡˆΡ‘Π» Π²ΠΏΠ΅Ρ€Ρ‘Π΄ с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° послСднСго fetch.
Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ Π΅Π³ΠΎ вмСсто --force β€” страховка ΠΎΡ‚ случайного затирания Ρ‡ΡƒΠΆΠΈΡ… ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ².


πŸ’» Бброс Π²Π΅Ρ‚ΠΊΠΈ Π΄ΠΎ состояния remote ​

Когда накопился мусор ΠΈ ΠΏΡ€ΠΎΡ‰Π΅ Π½Π°Ρ‡Π°Ρ‚ΡŒ чисто:

bash
git fetch origin
git reset --hard origin/master

# Π£Π΄Π°Π»ΠΈΡ‚ΡŒ нСотслСТиваСмыС Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ ΠΏΠ°ΠΏΠΊΠΈ
git clean -fd

# Π£Π΄Π°Π»ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ· .gitignore (остороТно β€” ΡƒΠ΄Π°Π»ΠΈΡ‚ .env)
git clean -fdx

git clean -fdx ΡƒΠ΄Π°Π»ΠΈΡ‚ всё нСотслСТиваСмоС Π²ΠΊΠ»ΡŽΡ‡Π°Ρ .env β€” сдСлай бэкап.


⚠️ ΠŸΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈ ​

  • Никогда Π½Π΅ rebase master, preprod, staging β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ feature-Π²Π΅Ρ‚ΠΊΠΈ
  • ПослС rebase всСгда Π½ΡƒΠΆΠ΅Π½ --force-with-lease, ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ push ΡƒΠΏΠ°Π΄Ρ‘Ρ‚
  • --force Π±Π΅Π· --with-lease опасСн Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ β€” ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Ρ‚Π΅Ρ€Π΅Ρ‚ΡŒ Ρ‡ΡƒΠΆΠΈΠ΅ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹
  • Если rebase Π΄ΠΎΠ»Π³ΠΈΠΉ ΠΈ слоТный β€” git rebase --abort ΠΈ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉ merge
  • git clean -fdx Π½Π΅ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠΌ β€” ΡƒΠ΄Π°Π»Ρ‘Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π½Π΅ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· git

Built with VitePress and ❀️