Как избежать ада слиянием и фиксацией на GitHub / BitBucket

101

У нас в репо много таких коммитов:

Merge branch 'master' of bitbucket.org:user/repo

Это происходит каждый раз, когда разработчик синхронизирует свою локальную вилку с репозиторием верхнего уровня.

Есть ли способ избежать этого ада слиянием и фиксацией от загромождения всего журнала репо? Можно ли как-то избежать их при инициировании pull-реквестов?

Я знаю, что могу выполнить git rebase, если это делается только на моей локальной виртуальной машине, есть ли эквивалент в пользовательском интерфейсе GitHub / BitBucket?

Как вы, ребята, это делаете?

Никлас9
источник

Ответы:

136

Перебазируйте ветки функций перед объединением

Если вы хотите избежать коммитов слияния, вам нужно убедиться, что все коммиты выполняются быстро. Вы делаете это, убедившись, что ваша функциональная ветка аккуратно перемещается в вашу линию разработки перед слиянием, например:

git checkout master
git checkout -b feature/foo

# make some commits

git rebase master
git checkout master
git merge --ff-only feature/foo

Rebase также имеет множество флагов, в том числе интерактивную перестановку с -iфлагом, но вам это может не понадобиться, если вы сохраняете все как можно проще и хотите сохранить всю историю веток при слиянии.

Используйте --ff-onlyфлаг

Помимо перебазирования, использование --ff-onlyфлага гарантирует, что разрешены только перемотки вперед. Фиксация не будет сделана, если это будет фиксация слияния. На странице руководства git-merge (1) говорится:

--ff-only

Отказаться от слияния и выйти с ненулевым статусом, если текущий HEAD уже не обновлен или слияние не может быть разрешено как перемотка вперед.

Тодд А. Джейкобс
источник
1
Это отличный ответ. Как можно чаще использую rebase. Однако я не знал о флаге --ff-only. Довольно круто!
Лео Корреа
3
Спасибо за советы по перебазированию и --ff-only. Однако, как сказано в моем вопросе, как я могу сделать это в пользовательском интерфейсе GitHub / BitBucket?
Niklas9
3
@Niklas Я почти уверен, что вам придется прибегнуть к CLI, чтобы делать то, что вы хотите. GitHub не раскрывает всю мощь Git; это лишь часть его функций, плюс некоторая добавленная стоимость графики и социальных сетей. Удачи!
Тодд А. Джейкобс,
3
В этом процессе следует отметить одну вещь: перед объединением ветки темы (feature / foo) обратно в master вам лучше git pull origin master (при использовании пульта дистанционного управления), чтобы убедиться, что основная ветка актуальна. . Если обновления были обнаружены, не забудьте еще раз перенести мастер в ветку темы, прежде чем объединять его обратно в мастер.
chikamichi 08
19
@CodeGnome не называйте это «обращением» к CLI ... на самом деле вы должны предупреждать о «обращении» к пользовательскому интерфейсу!
Droogans 07
9

Уже упомянутый «Тодд А. Джейкобс» - это концепция «rebase». Это просто более подробный способ сделать что-то.

Допустим, вы находитесь в главной ветке

$ git branch
  * master

Вы хотите внести исправление, поэтому создайте «ветвь исправлений», которая отделена от основного

$ git checkout -b fixbranch

Возможно, вы бы поработали пару дней над этой веткой и сделали бы пару коммитов.

День, когда вы хотели перенести свои коммиты в центральное главное репо! Мастер оформления заказа и получайте последние изменения из центрального главного репо

$ git checkout master
$ git pull origin master

Восстановите базу Fixbranch с помощью мастера, чтобы иметь чистую историю и разрешать конфликты, если таковые имеются, в самом локальном репо.

$ git checkout fixbranch
$ git rebase master

Теперь fixbranch обновлен до центрального мастера, позвольте мне объединить fixbranch с основной веткой

 $ git checkout master
 $ git merge fixbranch

Я задолбался! позвольте мне подтолкнуть местного мастера к центральному мастеру

$ git push origin master

https://git-scm.com/book/en/v2/Git-Branching-Rebasing

Кондал Колипака
источник
Я ценю этот ответ.
lasec0203