Какие методы слияния (merge) веток вы использовали в Git и в каких случаях?

Ответ

В Git применяются разные методы слияния в зависимости от целей: сохранения истории, ее упрощения или разрешения конфликтов.

Основные методы и их применение:

  1. Fast-Forward Merge (git merge)

    • Когда использовать: Когда целевая ветка (main) не имеет новых коммитов после создания feature-ветки. История остается линейной.
    • Команда: git merge feature-branch
    • Результат: Указатель ветки main просто перематывается на коммит feature-branch. Merge-коммит не создается.
  2. Recursive Merge / Merge Commit (git merge --no-ff)

    • Когда использовать: Стандартный случай, когда ветки разошлись. Явно показывает, что была выполнена операция слияния.
    • Команда: git merge --no-ff feature-branch
    • Результат: Создается новый merge-коммит с двумя родителями, что сохраняет полную историю разработки фичи.
  3. Rebase + Merge (git rebase)

    • Когда использовать: Чтобы получить чистую линейную историю, перенеся коммиты feature-ветки на вершину main.
    • Команда:
      git checkout feature-branch
      git rebase main   # Перебазируем feature-branch на актуальный main
      git checkout main
      git merge feature-branch # Теперь слияние будет fast-forward
    • Результат: История выглядит так, как если бы фича разрабатывалась последовательно поверх main. Меняет историю, не использовать для публичных веток.
  4. Squash Merge (git merge --squash)

    • Когда использовать: Чтобы объединить все коммиты feature-ветки в один логический коммит перед слиянием в main. Упрощает историю.
    • Команда:
      git merge --squash feature-branch
      git commit -m "feat: add new payment gateway"
    • Результат: В main добавляется один новый коммит со всеми изменениями из ветки. Детальная история коммитов фичи теряется.

Выбор стратегии:

  • --no-ff — для важных фич, чтобы сохранить контекст.
  • Rebase — для личных веток и поддержания линейной истории.
  • Squash — для чистки "рабочих" коммитов перед мержем в основную ветку.

Ответ 18+ 🔞

А, ну вот, опять про эти гитовые пляски с бубном! Слушай, как будто без этого ни один проект не живёт, блядь. Сидишь такой, код пишешь, а потом — оп, надо слить, и тут начинается: а как, блядь, сливать-то? История, конфликты, коммиты... Ёпта, сейчас разжую.

Ну, основные приёмы, на которые вся эта цирковая труппа опирается:

  1. Fast-Forward, он же "простая перемотка" (git merge)

    • Когда впендюрить: Когда ты отпочковался от main, а эта главная сука даже не пошевелилась, пока ты там изобретал велосипед. История остаётся прямой, как палка.
    • Чем лупануть: git merge feature-branch
    • Что будет: Ветка main тупо перепрыгнет на конец твоей фичи. Отдельного мерж-коммита — нихуя, чистая перемотка.
  2. Настоящее слияние, он же "коммит-памятник" (git merge --no-ff)

    • Когда впендюрить: Это стандарт, детка. Когда ветки успели разъебаться в разные стороны. Чтобы всем потом было видно — вот тут, блядь, мы большую фичу впилили.
    • Чем лупануть: git merge --no-ff feature-branch
    • Что будет: Родится новый коммит-уродец с двумя родителями. Вся история, кто откуда ноги росл, сохраняется. Для важных штук — самое то.
  3. Rebase + Merge, он же "подвинься, я тут был первый" (git rebase)

    • Когда впендюрить: Хочешь историю красивую, линейную, чтобы не было этих ебучих разветвлений. Как будто ты с самого начала на свежем коде работал.
    • Чем лупануть:
      git checkout feature-branch
      git rebase main   # Пересаживаешь свою фичу на самый верх main
      git checkout main
      git merge feature-branch # А теперь сливаешь — будет та самая перемотка
    • Что будет: История становится ровненькой. НО! Это ж ты историю переписываешь, ёпта! Для своих веток — ок, для общих — пидарас шерстяной, не делай так, а то всем сломаешь.
  4. Squash Merge, он же "всё в одну кучу" (git merge --squash)

    • Когда впендюрить: Когда ты в ветке накоммитил как угорелый: "фикс", "опечатка", "ещё фикс", "ой бля". А в основную ветку это говно тащить стыдно. Схлопываем всё в один красивый коммит.
    • Чем лупануть:
      git merge --squash feature-branch
      git commit -m "feat: добавил платёжку, мать её"
    • Что будет: В main упадёт один толстый коммит со всеми изменениями. А твоя возня с "ой, запятую забыл" — нахуй сгинет, и слава богу.

Так какую же хуйню выбрать?

  • --no-ff — для серьёзных фич, чтобы не потерять контекст, блядь.
  • Rebase — для своей локальной ветки, если хочешь перед сдачей причесаться.
  • Squash — для того, чтобы не позориться и не засирать историю двадцатью коммитами "поправил отступ". Чих-пых — и чистота!