Skip to content

Git merge kinds

Π’ Git сущСствуСт нСсколько способов слияния (merge), ΠΏΠΎΠΌΠΈΠΌΠΎ fast-forward ΠΈ no fast-forward. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… ΠΈΠΌΠ΅Π΅Ρ‚ свои особСнности ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ Π² Ρ€Π°Π·Π½Ρ‹Ρ… сцСнариях. Π’ΠΎΡ‚ основныС способы слияния:

1. Fast-forward Merge (БлияниС с ΠΏΠ΅Ρ€Π΅ΠΌΠΎΡ‚ΠΊΠΎΠΉ)

Π­Ρ‚ΠΎ простоС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ указатСля Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠΈ Π½Π° послСдний ΠΊΠΎΠΌΠΌΠΈΡ‚ исходной Π²Π΅Ρ‚ΠΊΠΈ, Ссли история линСйная ΠΈ цСлСвая Π²Π΅Ρ‚ΠΊΠ° Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ². Как ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π»ΠΎΡΡŒ Ρ€Π°Π½Π΅Π΅, Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚ Π½Π΅ создаётся.

2. No Fast-forward Merge (БлияниС Π±Π΅Π· ΠΏΠ΅Ρ€Π΅ΠΌΠΎΡ‚ΠΊΠΈ)

Git создаёт ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚ слияния, Π΄Π°ΠΆΠ΅ Ссли история позволяСт Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ слияниС. Π­Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для явного фиксации ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° слияния, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π² Π°Π½Π°Π»ΠΈΠ·Π΅ истории.

3. Squash Merge (БлияниС с "Ρ€Π°Π·Π΄Π°Π²Π»ΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ" ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²)

Squash merge ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ всС ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ ΠΈΠ· исходной Π²Π΅Ρ‚ΠΊΠΈ Π² ΠΎΠ΄ΠΈΠ½ Π΅Π΄ΠΈΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚ Π² Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠ΅. Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ‡ΠΈΡΡ‚ΡƒΡŽ ΠΈ ΠΏΠΎΠ½ΡΡ‚Π½ΡƒΡŽ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ Π±Π΅Π· мноТСства ΠΌΠ΅Π»ΠΊΠΈΡ… ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ², сдСланных Π² процСссС Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π°Π΄ Ρ„ΠΈΡ‡Π΅ΠΉ. ΠŸΡ€ΠΈ этом исходныС ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ Π½Π° Π²Π΅Ρ‚ΠΊΠ΅ Π½Π΅ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ, Π½ΠΎ вСсь ΠΈΡ… ΠΊΠΎΠ΄ΠΎΠ²Ρ‹ΠΉ Π²ΠΊΠ»Π°Π΄ содСрТится Π² ΠΎΠ΄Π½ΠΎΠΌ Π½ΠΎΠ²ΠΎΠΌ ΠΊΠΎΠΌΠΌΠΈΡ‚Π΅.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: 1. Π˜ΡΡ‚ΠΎΡ€ΠΈΡ исходной Π²Π΅Ρ‚ΠΊΠΈ: A -- B -- C (main) \ D -- E -- F (feature) 2. ПослС squash-слияния всС ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ ΠΈΠ· feature ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ Π² ΠΎΠ΄ΠΈΠ½: A -- B -- C -- G (main)

ΠšΠΎΠΌΠΌΠΈΡ‚ G содСрТит измСнСния ΠΈΠ· D, E ΠΈ F.

Для выполнСния squash merge ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π°:

git merge --squash feature-branch

ПослС этого Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π·Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ слияниС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ git commit.

4. Rebase Merge (ΠŸΠ΅Ρ€Π΅Π±Π°Π·ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅)

Rebase вмСсто ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ слияния "пСрСписываСт" ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π²Π΅Ρ‚ΠΊΠΈ, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ Π²Ρ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π»ΠΈ Π²Π΅Ρ‚ΠΊΡƒ с послСднСго ΠΊΠΎΠΌΠΌΠΈΡ‚Π° Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠΈ. Π­Ρ‚ΠΎ позволяСт ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π»ΠΈΠ½Π΅ΠΉΠ½ΡƒΡŽ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ Π±Π΅Π· создания Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² слияния.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: 1. Π’Ρ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚Π΅ Π²Π΅Ρ‚ΠΊΡƒ feature ΠΎΡ‚ C ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚Π΅ нСсколько ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²: A -- B -- C (main) \ D -- E -- F (feature) 2. На main происходят Π½ΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹: A -- B -- C -- G -- H (main) \ D -- E -- F (feature) 3. ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ rebase Π²Π΅Ρ‚ΠΊΠ° feature "пСрСбазируСтся" Π½Π° послСдний ΠΊΠΎΠΌΠΌΠΈΡ‚ Π² main: A -- B -- C -- G -- H -- D' -- E' -- F' (main/feature)

Π­Ρ‚ΠΎ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ слоТных Π³Ρ€Π°Ρ„ΠΎΠ² ΠΈ Π²Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠΉ, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΠ»ΠΎΠΆΠ½ΠΈΡ‚ΡŒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ². Команда для рСбСйса:

git rebase main

5. Three-way Merge (ВрёхстороннСС слияниС)

ВрёхстороннСС слияниС происходит, ΠΊΠΎΠ³Π΄Π° Π² ΠΎΠ±Π΅ΠΈΡ… Π²Π΅Ρ‚ΠΊΠ°Ρ… Π±Ρ‹Π»ΠΈ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ послС раздСлСния Π²Π΅Ρ‚ΠΊΠΈ. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС Git ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ "ΠΎΠ±Ρ‰ΠΈΠΉ ΠΏΡ€Π΅Π΄ΠΎΠΊ" (common ancestor) Π΄Π²ΡƒΡ… Π²Π΅Ρ‚ΠΎΠΊ ΠΈ выполняСт слияниС, Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Ρ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ измСнСниями Π² Π²Π΅Ρ‚ΠΊΠ°Ρ…. Π­Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ процСсс, ΠΊΠΎΠ³Π΄Π° fast-forward слияниС Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈ Git создаёт Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚ слияния.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: 1. Π˜ΡΡ‚ΠΎΡ€ΠΈΡ Π΄Π²ΡƒΡ… Π²Π΅Ρ‚ΠΎΠΊ: A -- B -- C (ΠΎΠ±Ρ‰ΠΈΠΉ ΠΏΡ€Π΅Π΄ΠΎΠΊ) | \ | D -- E (feature) \ F -- G (main)

ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ трёхстороннСго слияния, Git Π±Π΅Ρ€Ρ‘Ρ‚ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ C, G, ΠΈ E, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚ M, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ всС измСнСния: A -- B -- C -- F -- G -- M (main) \ / D -- E

6. Octopus Merge (ОсьминоТьС слияниС)

Octopus merge ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Π΄Π²ΡƒΡ… Π²Π΅Ρ‚ΠΎΠΊ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. Π­Ρ‚ΠΎ способ ΡƒΠ΄ΠΎΠ±Π΅Π½, ΠΊΠΎΠ³Π΄Π° Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Π»ΠΊΠΈΡ… Π²Π΅Ρ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠ»ΠΈΡ‚ΡŒ сразу. Π­Ρ‚ΠΎΡ‚ Ρ‚ΠΈΠΏ слияния ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ создаёт Π½ΠΎΠ²Ρ‹Ρ… ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² слияния, Ссли Π½Π΅Ρ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ².

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ слияния Ρ‚Ρ€Ρ‘Ρ… Π²Π΅Ρ‚ΠΎΠΊ:

git merge branch1 branch2 branch3

Если всС измСнСния Π² этих Π²Π΅Ρ‚ΠΊΠ°Ρ… Π½Π΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΡŽΡ‚, ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½Ρ‹ Π² ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠΌΠΌΠΈΡ‚.

Когда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ способ?

  • Fast-forward β€” ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π»ΠΈΠ½Π΅ΠΉΠ½ΡƒΡŽ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ ΠΈ слияниС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π±Π΅Π· создания Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°.
  • No fast-forward β€” ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΆΠ΅Π½ сам Ρ„Π°ΠΊΡ‚ слияния ΠΈΠ»ΠΈ трСбуСтся ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π²Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠΈ.
  • Squash merge β€” ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ нСсколько ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² Π² ΠΎΠ΄ΠΈΠ½ для Π±ΠΎΠ»Π΅Π΅ чистой истории.
  • Rebase β€” ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² слияния ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π»ΠΈΠ½Π΅ΠΉΠ½ΡƒΡŽ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ всС измСнСния происходили ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.
  • Three-way merge β€” примСняСтся ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΠΎΠ±Π΅ΠΈΡ… Π²Π΅Ρ‚ΠΊΠ°Ρ….
  • Octopus merge β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для объСдинСния сразу Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²Π΅Ρ‚ΠΎΠΊ, ΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ².