Как использовать git merge --squash?

У меня есть удаленный сервер Git, вот сценарий, который я хочу выполнить:

  • для каждой ошибки / функции я создаю другую ветку Git

  • Я продолжаю фиксировать свой код в этой ветви Git с неофициальными сообщениями Git

  • в верхнем репозитории мы должны сделать одну фиксацию для одной ошибки с официальным сообщением Git

Итак, как я могу объединить свою ветку с удаленной веткой, чтобы они просто одна фиксация для всех моих проверок (я даже хочу предоставить сообщение фиксации для этого)?

6 ответов


скажите, что ваша ветка исправления ошибок называется bugfix и вы хотите объединить их в master:

git checkout master
git merge --squash bugfix
git commit

это займет все коммиты от bugfix ветвь, раздавите их в 1 фиксацию и объедините ее с вашим master филиала.


объяснение:

git checkout master

переключается на свой master филиала.

git merge --squash bugfix

принимает все коммиты из bugfix филиал и объединяет его с вашим текущим отделение.

git commit

создает одну фиксацию из Объединенных изменений.

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


вы хотите слиться с опцией squash. Это если вы хотите сделать это по одной ветке за раз.

git merge --squash feature1

Если вы хотите объединить все ветви одновременно с одиночными коммитами, то сначала перебазируйте интерактивно и раздавите каждую функцию, затем Octopus merge:

git checkout feature1
git rebase -i master

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

git checkout master
git merge feature1 feature2 feature3 ...

Это последнее слияние является "слиянием осьминогов", потому что оно объединяет сразу много ветвей.

надеюсь, что это помогает


то, что наконец прояснило это для меня, было комментарий показывает, что:

git checkout main
git merge --squash feature

- это эквивалент делаю:

git checkout feature
git diff main > feature.patch
git checkout main
patch -p1 < feature.patch
git add .

когда я хочу объединить ветку функций с 105(!!) совершает и все они раздавлены в один, я не хочу git rebase -i origin/master потому что мне нужно отдельно разрешать конфликты слияния для каждого промежуточных коммитов (или, по крайней мере, тех, которые git не может понять сам). Используя git merge --squash получает мне результат I хотите, одной фиксации для слияния всей ветви объекта. И, мне нужно только сделать самое большее одно ручное разрешение конфликта.


Если вы уже git merge bugfix on main, вы можете раздавить свое слияние в одно с:

git reset --soft HEAD^1
git commit

слияние newFeature филиала в master с пользовательской фиксацией:

git merge --squash newFeature && git commit -m 'Your custom commit message';

если вы

git merge --squash newFeature && git commit

вы получите сообщение, которое будет включать в себя все newFeature ветки коммиты, которые вы можете настроить.


Для Git

создать новую функцию

через терминал/основа:

git checkout origin/feature/<featurename>
git merge --squash origin/feature/<featurename>

Это не фиксирует его, позволяет сначала просмотреть его.

затем зафиксируйте и завершите функцию из этой новой ветви и удалите/проигнорируйте старую (ту, на которой вы делали dev).