Как использовать 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).