Как использовать git merge --squash?
У меня есть удаленный сервер Git, вот сценарий, который я хочу выполнить:
Для каждой ошибки/функции я создаю отдельную ветку Git
Я продолжаю фиксировать свой код в этой ветке Git с неофициальными сообщениями Git
В верхнем репозитории мы должны сделать один коммит для одной ошибки с официальным сообщением Git
Итак, как я могу объединить свою ветку с удаленной веткой, чтобы они получили только один коммит для всех моих проверок (я даже хочу предоставить сообщение о коммите для этого)?
Ответы
Ответ 1
Скажем, ваша ветка исправления ошибок называется 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
позволяет изменить черновое сообщение о коммите, содержащее каждое сообщение из ваших сдавленных коммитов, прежде чем завершить ваш коммит.
Ответ 2
Что, наконец, прояснило это для меня, было comment, показывающее, что:
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
, я получаю результат, который я хочу, из одной фиксации для слияния всей ветки функции. И мне нужно выполнить не более одного ручного разрешения конфликтов.
Ответ 3
Вы хотите объединиться с параметром squash. Это, если вы хотите сделать это по одной ветки за раз.
git merge --squash feature1
Если вы хотите объединить все ветки одновременно с одиночными коммитами, сначала перетащите их в интерактивном режиме и сквойте каждую функцию, а затем соедините осьминоги:
git checkout feature1
git rebase -i master
Сквош в одну фиксацию, затем повторите для других функций.
git checkout master
git merge feature1 feature2 feature3 ...
Это последнее слияние является "слиянием осьминогов", потому что оно объединяет сразу несколько ветвей.
Надеюсь, что это поможет
Ответ 4
Если у вас уже есть git merge bugfix
на main
, вы можете выровнять фиксацию слияния в одном с помощью:
git reset --soft HEAD^1
git commit
Ответ 5
Объединить ветку newFeature
с master
с помощью специального коммита:
git merge --squash newFeature && git commit -m 'Your custom commit message';
Если вместо этого вы делаете
git merge --squash newFeature && git commit
вы получите сообщение о коммите, которое будет содержать все коммиты ветки newFeature
, которые вы можете настроить.
Я объясняю это подробно здесь: https://youtu.be/FQNAIacelT4
Ответ 6
Я знаю, что этот вопрос не касается конкретно Github, но, поскольку Github очень широко используется, и это ответ, который я искал, я поделюсь им здесь.
Github имеет возможность выполнять слияние сквоша в зависимости от параметров слияния, включенных для хранилища.
Если слияние в сквош включено, опция "Сквош и слияние" должна появиться в раскрывающемся списке под кнопкой "Слияние".
Ответ 7
Предположим, вы работали в 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
Ответ 8
Для Git
Создать новую функцию
через терминал/оболочку:
git checkout origin/feature/<featurename>
git merge --squash origin/feature/<featurename>
Это не фиксирует его, позволяет сначала просмотреть его.
Затем зафиксируйте и завершите функцию из этой новой ветки, а также удалите/проигнорируйте старую ветку (ту, что вы использовали для разработки)