Как не в интерактивном режиме squa sh a git ветка с длинной историей (до слияния)? - PullRequest
0 голосов
/ 30 апреля 2020

Немного предыстории.

В моей компании есть большое хранилище git. Мы делаем разработку на ветке (надеюсь, недолгую) и затем выполняем слияние (без squa sh) с мастером. К сожалению, сейчас у нас есть проект, который жил в своем филиале месяцами. Этому способствовали многочисленные разработчики, и он насчитывает более ста коммитов. Несколько дюжин этих коммитов являются слияниями с мастером, и они чередуются с нашими собственными коммитами.

Теперь мы хотим объединить весь этот код с мастером - но в форме всех маленьких коммитов. Мы хотим сква sh им. Однако мы столкнулись с противодействием DevOps. Слияния выполняются автоматически с помощью инструмента, и DevOps настаивают на том, что операция git «squa sh and merge» может привести к проблемам. Короче говоря, они не будут делать никаких сквошей или ребаз для нас. Мы прекрасно справляемся с потерей всей нашей истории коммитов. Но любая возможность испортить хозяина (или ввести ошибочные слияния) должна быть исключена.

Как мы можем автоматически взамен sh зафиксировать коммиты по запросу извлечения ПЕРЕД созданием слияния?

Я знаю, что мы можем сделать "git rebase", но это будет ручной процесс прохождения всех 100+ коммитов. Подверженных ошибкам. Не достаточно для нас.

При запуске "git diff" я вижу все изменения между нашей веткой и мастером, красивые и чистые. Есть ли способ:

  1. Преобразовать все эти изменения в ОДИН коммит;
  2. Сделать это автоматически (нет необходимости в вводе человеком во время процесса);
  3. С переписыванием истории веток (должно закончиться мастер-перебазированием + 1 большой коммит вместо 100 с малых коммитов);
  4. Все сделано на ветке до (не во время) слияния.

1 Ответ

1 голос
/ 30 апреля 2020

Если вам нужен только один коммит, который имеет все отличия от мастера как один коммит, вы можете сделать это:

git checkout the-branch
git merge master -m "get the latest from master"
# set our branch _pointer_ on master, do not change a comma from our working tree
git reset --soft master
# at this point, all the differences between master and the other branch are on index, ready to be committed
git commit -m "single commit with all changes"

И все готово. Ваша ветвь - это один коммит поверх мастера, никаких хлопот.

...