Фиксация ветки функции сквоша после слияния с мастером

Я пытаюсь раздавить коммиты в ветке, чтобы, когда она, наконец, объединилась с мастером (после запроса на извлечение, если он был одобрен), история коммитов выглядела чистой. Следовательно, перед тем, как поднять запрос на извлечение, я делаю

git rebase -i

и переписать историю.

Однако при разработке функции в своей ветке мне приходится объединять содержимое мастера с веткой, потому что мастер обычно продвигается вперед из-за объединения других веток функций.

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

Каков наилучший способ раздавить коммиты в этом случае?


person Neil    schedule 28.02.2017    source источник


Ответы (3)


Я пытаюсь раздавить коммиты в ветке, чтобы, когда она наконец объединилась с мастером (после запроса на вытягивание, если он был одобрен), история коммитов выглядела чистой

Вы можете использовать soft reset, чтобы раздавить коммиты вашей ветки (скажем, feature). Скажем, у вас есть 5 коммитов в ветке feature. Теперь вам нужно 5 коммитов = 1 новый коммит.

$ git checkout feature
$ git log                        # see how many commits do you need to squash

$ git reset --soft HEAD~4        # note: if you have N commits then HEAD~{N-1}
Or, git reset --soft <first-commit> # reset to first commit of your branch

$ git add .                      # add the files  
$ git commit --amend -am 'Squash all commits'  # squash all the commits

$ git push -f origin feature     # force(-f) push to remote since git history is changed  

Теперь потяните изменения основной ветки.

$ git pull origin master

Создайте запрос на вытягивание прямо сейчас, используя GitHub GUI (браузер).

person Sajib Khan    schedule 01.03.2017
comment
Разве это не требует, чтобы ваши локальные коммиты были последними 4? Если вы периодически выполняете слияние с мастером, это вряд ли так. - person Tim N; 19.05.2017
comment
--amend нужно? Что он здесь делает? - person BoltzmannBrain; 30.11.2017
comment
--amend объединяет текущие локальные изменения с предыдущим коммитом (first-commit). На самом деле, git принимает: последний коммит + текущие локальные изменения = создать новый коммит (хеш/ссылка коммита изменены)! @BoltzmannBrain - person Sajib Khan; 01.12.2017

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

git reset --soft master
git commit -m 'All changes from my branch squashed'

Это в основном сбрасывает указатель ветки на ветку master без изменения какого-либо содержимого в вашем рабочем каталоге. Таким образом, в результате у вас есть все эти изменения в вашем индексе, которые вы можете зафиксировать сразу.

person poke    schedule 28.02.2017
comment
Этот ответ великолепен. Раньше я просматривал журнал git и находил хэш фиксации последней вещи, которую я не хотел включать в свой сквош, а затем выполнял программный сброс этой фиксации. Это решение дает именно то, что я хочу, даже если вы объединили другие ветки со своей, а журнал git запутан. Мой коллега делал интерактивную перебазировку, и после того, как я рассказал ему об этом методе, он тоже переключится. Работает отлично. Спасибо! - person Nathan Loyer; 31.07.2018

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

git checkout feature
git pull origin master --rebase

Это перебазирует ветку функции поверх главной ветки после получения из исходной ветки.

person Marina Liu    schedule 01.03.2017