Как использовать Git Merge -квадрат?
-
24-10-2019 - |
Вопрос
У меня есть удаленный сервер GIT, вот сценарий, который я хочу выполнить:
Для каждой ошибки/функции я создаю различную ветвь GIT
Я продолжаю совершать свой код в этом филиале GIT с неофициальными сообщениями GIT
В лучшем хранилище мы должны сделать один коммит для одной ошибки с официальным сообщением GIT
Итак, как я могу объединить свою филиал в удаленную филиал, чтобы они получили только один коммит для всех моих чеков (я даже хочу предоставить для этого сообщение о коммите)?
Решение
Скажем bugfix
И вы хотите объединить это в master
:
git checkout master
git merge --squash bugfix
git commit
Это займет все коммиты от bugfix
вель 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 ...
Это последнее слияние - «слияние осьминога», потому что оно сразу объединяет много ветвей.
Надеюсь это поможет
Если у вас уже есть git merge bugfix
на 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
Филиал совершает, что вы можете настроить.
Я подробно объясняю это здесь: https://youtu.be/fqnaiacelt4
Я знаю, что этот вопрос не о GitHub конкретно, но так как GitHub так широко используется, и это ответ, который я искал, я поделюсь им здесь.
GitHub имеет возможность выполнять слияние сквоша, в зависимости от параметров слияния, включенных для репозитория.
Если слияния сквош включены, опция «Сквош и слияние» должна появиться в раскрывающейся спине под кнопкой «слияние».
Предположим, вы работали в функции/Task1 с несколькими коммитами.
Перейдите в филиал своего проекта (Project/MY_PROJECT)
git checkout project/my_project
Создайте новую филиал (функция/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
Для git
Создать новую функцию
через терминал/оболочка:
git checkout origin/feature/<featurename>
git merge --squash origin/feature/<featurename>
Это не совершает его, позволяет сначала просмотреть его.
Затем совершите функцию и завершите функцию из этой новой ветви, и удалите/игнорируйте старый (тот, на котором вы сделали).