В Git есть ли способ объединить все изменения из одной ветви в другую, но в то же время объединить в один коммит?
Я часто работаю над новой функцией в отдельной ветке и буду регулярно фиксировать / отправлять - в основном для резервного копирования или переноса того, над чем я работаю, на другую машину. В основном эти коммиты говорят "Feature xxx WIP" или что-то избыточное.
Как только эта работа закончится, и я хочу слить ветку WIP обратно в master, я бы хотел отказаться от всех этих промежуточных коммитов и просто иметь один чистый коммит.
Есть простой способ сделать это?
В качестве альтернативы, как насчет команды, которая уничтожает все коммиты на ветви с момента, когда она была разветвлена?
rebase --squash
Нашел это! Команда слияния имеет
--squash
опциюв этот момент все объединено, возможно, конфликтует, но не зафиксировано. Теперь я могу:
источник
git add .
?git add .
добавляет все не проигнорированные файлы в текущем каталоге, я бы с осторожностью выбрал нежелательные файлы таким образом.git add .
вы можете использоватьgit add -u
только для добавления файлов, которые уже были добавлены в дерево.Попробуйте
git rebase -i master
на вашей ветке функции. Затем вы можете изменить все, кроме одного «выбора» на «сквош», чтобы объединить коммиты. Смотрите коммиты на сквош с ребазойНаконец, вы можете выполнить слияние из основной ветки.
источник
Использование
git merge --squash <feature branch>
в соответствии с принятым ответом помогает, но объединенная ветвь не будет отображаться как фактически объединенная.Поэтому еще лучшим решением является:
<feature branch>
с вышеупомянутым, используяgit merge --squash
Эта вики объясняет процедуру подробно.
источник
Я создал свой псевдоним git, чтобы сделать именно это. Я звоню
git freebase
! Он возьмет вашу существующую грязную ветвь объектов без возможности восстановления и заново создаст ее, чтобы она стала новой веткой с тем же именем, а ее коммиты будут сжаты в один коммит и перенесены в указанную вами ветку (master по умолчанию). В самом конце, это позволит вам использовать любое сообщение коммита, которое вам нравится, для вашей новой "бесплатной" ветки.Установите его, поместив следующий псевдоним в ваш .gitconfig:
Используйте его из вашей ветки функций, выполнив:
git freebase <new-base>
Я проверял это всего несколько раз, поэтому сначала прочтите его и убедитесь, что вы хотите запустить его. В качестве небольшой меры безопасности он печатает начальный sha1, чтобы вы могли восстановить старую ветку, если что-то пойдет не так.
Я буду поддерживать его в моем репозитории dotfiles на github: https://github.com/stevecrozz/dotfiles/blob/master/.gitconfig
источник
git merge --squash <feature branch>
это хороший вариант. "git commit" сообщает вам сообщение о фиксации всех ветвей функций с вашим выбором сохранить его.Для менее совершенного слияния.
git merge do x times --git reset HEAD ^ --soft, затем git commit.
Риск - удаленные файлы могут вернуться.
источник
Вы можете сделать это с помощью команды «rebase». Давайте назовем ветви "основной" и "особенность":
Команда rebase воспроизведет все коммиты на «feature» как один коммит с родителем, равным «main».
Возможно, вы захотите запустить его
git merge main
раньше,git rebase main
если «main» изменился с момента создания «feature» (или с момента последнего слияния). Таким образом, у вас все еще будет полная история на случай конфликта слияния.После перебазирования вы можете объединить свою ветку с главной, что должно привести к слиянию в ускоренном режиме:
См. Страницу перебазирования в Understanding Git Conceptually для хорошего обзора.
источник