Skip to content

Git Merge ​

🧠 Π‘ΡƒΡ‚ΡŒ ​

БлияниС Π΄Π²ΡƒΡ… Π²Π΅Ρ‚ΠΎΠΊ Π² ΠΎΠ΄Π½Ρƒ. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ rebase β€” сохраняСт ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ ΠΎΠ±Π΅ΠΈΡ… Π²Π΅Ρ‚ΠΎΠΊ ΠΈ создаёт merge-ΠΊΠΎΠΌΠΌΠΈΡ‚.

MergeRebase
Π˜ΡΡ‚ΠΎΡ€ΠΈΡΠ‘ΠΎΡ…Ρ€Π°Π½ΡΠ΅Ρ‚ΡΡ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽΠŸΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°Π΅Ρ‚ΡΡ
Merge-ΠΊΠΎΠΌΠΌΠΈΡ‚Π”Π° (ΠΏΡ€ΠΈ --no-ff)НСт
БСзопасно для ΠΎΠ±Ρ‰ΠΈΡ… Π²Π΅Ρ‚ΠΎΠΊβœ…βŒ
Чистота историиДрСвовиднаяЛинСйная

πŸ’» Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ merge ​

bash
# Π’Π»ΠΈΡ‚ΡŒ feature Π² Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π²Π΅Ρ‚ΠΊΡƒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ master)
git checkout master
git merge feature/add-auth

πŸ’» Fast-forward vs --no-ff ​

Fast-forward (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ) β€” Ссли master Π½Π΅ ΡƒΡˆΡ‘Π» Π²ΠΏΠ΅Ρ€Ρ‘Π΄, ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ просто "ΠΏΡ€ΠΈΠΊΠ»Π΅ΠΈΠ²Π°ΡŽΡ‚ΡΡ":

bash
git merge feature/add-auth
# Π˜ΡΡ‚ΠΎΡ€ΠΈΡ Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ, merge-ΠΊΠΎΠΌΠΌΠΈΡ‚Π° Π½Π΅Ρ‚

--no-ff β€” всСгда создаёт merge-ΠΊΠΎΠΌΠΌΠΈΡ‚, Π΄Π°ΠΆΠ΅ Ссли ff Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½:

bash
git merge --no-ff feature/add-auth
# Π―Π²Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚ "Merge branch 'feature/add-auth'" β€” Π²ΠΈΠ΄Π½ΠΎ Π² истории

Для master ΠΈ preprod рСкомСндуСтся --no-ff β€” сохраняСт Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π³Π΄Π΅ Π½Π°Ρ‡ΠΈΠ½Π°Π»Π°ΡΡŒ Π²Π΅Ρ‚ΠΊΠ°.


πŸ’» Squash merge ​

Π‘ΠΊΠ»Π΅ΠΈΡ‚ΡŒ всС ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ Π²Π΅Ρ‚ΠΊΠΈ Π² ΠΎΠ΄ΠΈΠ½ ΠΏΠ΅Ρ€Π΅Π΄ ΠΌΠ΅Ρ€ΠΆΠ΅ΠΌ:

bash
git merge --squash feature/add-auth
git commit -m "[Auth] Add authentication flow"

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ ΠΊΠΎΠ³Π΄Π° Π² Π²Π΅Ρ‚ΠΊΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ WIP-ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² ΠΈ Ρ…ΠΎΡ‡Π΅ΡˆΡŒ чистый ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠΌΠΌΠΈΡ‚ Π² master.


πŸ’» Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² ​

bash
git merge feature/add-auth
# CONFLICT (content): Merge conflict in src/auth.php
bash
# ΠŸΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΡŽΡ‚
git status

# ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» β€” Π½Π°ΠΉΡ‚ΠΈ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Ρ‹:
<<<<<<< HEAD
ΠΊΠΎΠ΄ ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π²Π΅Ρ‚ΠΊΠΈ (master)
=======
ΠΊΠΎΠ΄ ΠΈΠ· feature/add-auth
>>>>>>> feature/add-auth

# ΠžΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ β†’ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Ρ‹ β†’ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄

# Π—Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ
git add src/auth.php
git merge --continue   # ΠΈΠ»ΠΈ git commit
bash
# ΠžΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ merge ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ ΡΠΎΡΡ‚ΠΎΡΠ½ΠΈΡŽ Π΄ΠΎ:
git merge --abort

πŸ’» Merge Ρ‡Π΅Ρ€Π΅Π· инструмСнт ​

bash
# Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ mergetool (vimdiff, vscode ΠΈ Π΄Ρ€.)
git mergetool

# ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ VS Code ΠΊΠ°ΠΊ mergetool
git config --global merge.tool vscode
git config --global mergetool.vscode.cmd 'code --wait $MERGED'

πŸ’» ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ ΠΏΠ΅Ρ€Π΅Π΄ ΠΌΠ΅Ρ€ΠΆΠ΅ΠΌ ​

bash
# Π§Ρ‚ΠΎ Π²ΠΎΠΉΠ΄Ρ‘Ρ‚ Π² merge (ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ ΠΈΠ· feature, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅Ρ‚ Π² master)
git log master..feature/add-auth --oneline

# КакиС Ρ„Π°ΠΉΠ»Ρ‹ измСнятся
git diff master...feature/add-auth --name-only

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

  • Никогда Π½Π΅ ΠΌΠ΅Ρ€ΠΆΡŒ Π² master Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΈΠ· локальной консоли β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ€Π΅Π· PR
  • --squash Π½Π΅ создаёт связь с исходной Π²Π΅Ρ‚ΠΊΠΎΠΉ β€” git branch -d ΠΏΠΎΡ‚ΠΎΠΌ Π½Π΅ сработаСт Π±Π΅Π· -D
  • ПослС --no-ff merge-ΠΊΠΎΠΌΠΌΠΈΡ‚ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ осмыслСнно, Π½Π΅ оставляй Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ΅ сообщСниС
  • git merge --abort Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли merge Π΅Ρ‰Ρ‘ Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΡ‘Π½

Built with VitePress and ❀️