Как использовать git merge --squash?
У меня есть удаленный сервер Git, вот сценарий, который я хочу выполнить:
Для каждой ошибки / функции я создаю отдельную ветку Git
Я продолжаю фиксировать свой код в этой ветке Git с неофициальными сообщениями Git
В верхнем репозитории мы должны сделать один коммит для одной ошибки с официальным сообщением Git
Итак, как я могу объединить свою ветку с удаленной веткой, чтобы они получили только один коммит для всех моих проверок (я даже хочу предоставить сообщение о коммите для этого)?
15 ответов
Скажем, ваша ветка исправления ошибок называется 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
Параметр позволяет вам изменить черновое сообщение о коммите, содержащее каждое сообщение из ваших сдавленных коммитов, прежде чем завершить ваш коммит.
Что наконец прояснило для меня это комментарий, показывающий, что:
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
дает мне результат, который я хочу, одного коммита для слияния целой ветви функций. И мне нужно сделать не более одного ручного разрешения конфликта.
Вы хотите объединить с опцией сквоша. Это если вы хотите сделать это по одной ветке за раз.
git merge --squash feature1
Если вы хотите объединить все ветви одновременно с одиночными коммитами, то сначала интерактивно перебазируйте и раздавите каждую функцию, затем объедините осьминога:
git checkout feature1
git rebase -i master
Сквош в один коммит, затем повторите для других функций.
git checkout master
git merge feature1 feature2 feature3 ...
Последнее слияние является "слиянием осьминога", потому что оно объединяет множество веток одновременно.
Надеюсь это поможет
Предположим, вы работали в feature/task1 с несколькими коммитами.
Перейдите в ветку вашего проекта (project/my_project)
git checkout project/my_project
Создать новую ветку (feature/task1_bugfix)
git checkout -b feature/task1_bugfix
Мардж с
--squash
вариантgit merge --squash feature/task1
Создать один коммит
git commit -am "add single comments"
Толкни свою ветку
git push --set-upstream origin feature/task1_bugfix
Сливаться newFeature
разветвляться в master
с пользовательским коммитом:
git merge --squash newFeature && git commit -m 'Your custom commit message';
Если вместо этого вы делаете
git merge --squash newFeature && git commit
вы получите сообщение о коммите, которое будет включать все newFeature
Ветка коммитов, которую вы можете настроить.
Если вы уже git merge bugfix
на main
Вы можете раздавить свой коммит слияния в один с:
git reset --soft HEAD^1
git commit
Я знаю, что этот вопрос не касается конкретно Github, но, поскольку Github так широко используется, и это ответ, который я искал, я поделюсь им здесь.
Github имеет возможность выполнять слияние сквоша, в зависимости от параметров слияния, включенных для хранилища.
Если слияние в сквош включено, опция "Сквош и слияние" должна появиться в раскрывающемся списке под кнопкой "Слияние".
Чтобы раздавить локальную ветку перед тем, как нажать на нее:
проверить ветку, о которой идет речь, чтобы работать, если она еще не разрегистрирована.
Найдите sha самого старого коммита, который вы хотите сохранить.
Создать / оформить новую ветку (tmp1) из этого коммита.
git checkout -b tmp1 <sha1-of-commit>
Объедините исходную ветвь с новой, раздавив.
git merge --squash <original branch>
Зафиксируйте изменения, которые были созданы слиянием, с итоговым сообщением о фиксации.
git commit -m <msg>
Проверьте исходную ветку, которую хотите раздавить.
git checkout <branch>
Восстановите исходную фиксацию, которую вы хотите сохранить.
git reset --soft <sha1>
Восстановите эту ветку на основе новой ветки tmp1.
git rebase tmp1
Вот и все - теперь удалите временную ветку tmp1, как только вы убедитесь, что все в порядке.
Для Git
Создать новую функцию
через терминал / оболочку:
git checkout origin/feature/<featurename>
git merge --squash origin/feature/<featurename>
Это не фиксирует это, позволяет сначала просмотреть его.
Затем зафиксируйте и завершите функцию из этой новой ветки, а также удалите / проигнорируйте старую ветку (ту, что вы использовали для разработки)
git checkout YOUR_RELEASE_BRANCH
git pull
git checkout -b A_NEW_BRANCH
git merge --squash YOUR_BRANCH_WITH_MULTIPLE_COMMITS
git commit -am "squashing all commits into one"
git push --set-upstream origin A_NEW_BRANCH
Если вы получаете сообщение об ошибке: фиксация невозможна, потому что у вас есть не объединенные файлы.
git checkout master
git merge --squash bugfix
git add .
git commit -m "Message"
исправлены все файлы конфликтов
git add .
вы также можете использовать
git add [filename]
Предположим, имя ветки, в которой вы сделали несколько коммитов, называется bugfix / 123, и вы хотите отменить эти коммиты.
Сначала создайте новую ветку из develop (или как там у вашего репо). Предположим, что имя новой ветки называется bugfix / 123_up. Оформить заказ на эту ветку в git bash -
- git fetch
- git checkout bugfix / 123_up
- git merge bugfix / 123 --squash
- git commit -m "ваше сообщение"
- git push origin bugfix / 123_up
Теперь в этой ветке будет только одна фиксация со всеми вашими изменениями.
Ваша функциональная ветка готова и готова к фиксации для master, development или другой целевой ветки только с одной фиксацией
- Перейдите в ветку слияния: git checkout master && git pull
- Создайте рабочую ветку из вашего чистого локального мастера: git checkout -b work
- Объедините сквош вашей функциональной ветки на работе: git merge --squash your_feature_branch.
- Зафиксировать со стандартным или новым сообщением: git commit (с конкретным сообщением или сообщением по умолчанию)
- Вернитесь в свою ветку функций: git checkout your_feature_branch
- Направьте свою функциональную ветку на рабочий каталог: git reset --hard work
- Подтвердите, но вы готовы нажать: git push -f
- Затем при необходимости очистите рабочую ветку
Заменить master на свою целевую ветку: разработать и т. Д.
- Нет необходимости указывать, сколько коммитов от вашего мастера к вашей функциональной ветке. Git позаботится *
Использовать
git status
чтобы проверить, что происходит.
затем
git checkout master
git merge --squash bugfix
git add (add which files you want or use wildcard command like ".")
затем
git commit -m "message"
И теперь последнее, но не менее важное
git push -u origin master
Вот origin
может быть другой пульт, который вы предпочитаете.
Вы можете использовать созданный мной инструмент, чтобы упростить этот процесс: git-squash. Например, чтобы сжать все коммиты в функциональной ветке, которая была разветвлена из основной ветки, напишите:
git squash master
git push --force