У меня есть удаленный сервер Git, вот сценарий, который я хочу выполнить:
Для каждой ошибки / функции я создаю отдельную ветку Git
Я продолжаю фиксировать свой код в этой ветке Git с неофициальными сообщениями Git
В верхнем репозитории мы должны сделать один коммит для одной ошибки с официальным сообщением Git
Итак, как я могу объединить свою ветку с удаленной веткой, чтобы они получили только один коммит для всех моих проверок (я даже хочу предоставить сообщение о коммите для этого)?
git
git-merge
git-squash
SunnyShah
источник
источник
git merge --squash
делает все это в командной строке одним выстрелом, и вы просто надеетесь, что это сработает.git rebase -i
вызывает редактор и позволяет точно настроить ребаз. Это медленнее, но вы можете видеть, что вы делаете. Кроме того, существуют различия между rebase и слиянием, которые слишком малы, чтобы их можно было использовать в комментарии.merge --squash
от старого к новому, а затем объедините новую ветку с мастером. Старая ветка устаревает.Ответы:
Скажем, ваша ветка исправления ошибок называется,
bugfix
и вы хотите объединить ее вmaster
:Это возьмет все коммиты из
bugfix
ветви, раздавит их в 1 коммит и объединит его с вашейmaster
веткой.Пояснение :
Переключается на вашу
master
ветку.Принимает все коммиты из
bugfix
ветви и объединяет их с вашей текущей веткой.Создает один коммит из объединенных изменений.
Пропуск
-m
параметра позволяет вам изменить черновик коммита, содержащий каждое сообщение из ваших сдавленных коммитов, прежде чем завершить коммит.источник
git commit
(без-m
параметров), и вы сможете модифицировать черновик коммит-сообщения, содержащий все сообщения коммита, которые вы сжатые.git commit --amend -m '...'
позже.git commit
больше не будет отображаться полезное сообщение о фиксации, содержащее все сообщения о фиксации, которые вы подавили. В этом случае попробуйтеgit commit --file .git/SQUASH_MSG
(через stackoverflow.com/a/11230783/923560 ).git commit -a --author="Author" --message="Issue title #id"
git merge --squash
позволяет вам создать один коммит поверх текущей ветви, эффект которого такой же, как и слияние другой ветви. Но это не приведет к записи слияния, что означает, что ваш запрос на получение результата не будет иметь изменений, но не будет помечен как объединенный! Итак, вам нужно будет просто удалить эту ветку, чтобы сделать.Что наконец прояснило для меня это комментарий, показывающий, что:
эквивалентно выполнению:
Когда я хочу объединить ветку объектов со 105 (!!) коммитами и объединить их все в один, я не хочу,
git rebase -i origin/master
потому что мне нужно отдельно разрешать конфликты слияния для каждого из промежуточных коммитов (или, по крайней мере, тех, которые мерзавец не может понять сам). Использованиеgit merge --squash
дает мне желаемый результат одного коммита для слияния целой ветви функций. И мне нужно сделать не более одного ручного разрешения конфликта.источник
git merge master
, а затем толькоgit merge --squash feature
в основной ветви.git merge --squash feature
из основной ветви?Вы хотите объединить с опцией сквоша. Это если вы хотите сделать это по одной ветке за раз.
Если вы хотите объединить все ветви одновременно с одиночными коммитами, то сначала интерактивно перебазируйте и раздавите каждую функцию, а затем объедините осьминога:
Сквош в один коммит, затем повторите для других функций.
Последнее слияние является «слиянием осьминога», потому что оно объединяет множество веток одновременно.
Надеюсь это поможет
источник
Если у вас есть уже
git merge bugfix
наmain
, вы можете раздавить ваше слияние совершить в один с:источник
git reset --soft HEAD^1
кажется, отменяет последний коммит, выполненный перед слиянием, по крайней мере, в случае быстрого слияния.git reset --soft HEAD^<number-of-commits-to-squash>
.Объединить
newFeature
веткуmaster
с пользовательским коммитом:Если вместо этого вы делаете
git merge --squash newFeature && git commit
вы получите сообщение о коммите, которое будет включать все
newFeature
коммиты ветки, которые вы можете настроить.Я подробно объясняю это здесь: https://youtu.be/FQNAIacelT4
источник
Я знаю, что этот вопрос не касается конкретно Github, но, поскольку Github очень широко используется, и это ответ, который я искал, я поделюсь им здесь.
Github имеет возможность выполнять слияние сквоша, в зависимости от параметров слияния, включенных для хранилища.
Если слияние в сквош включено, опция «Сквош и слияние» должна появиться в раскрывающемся списке под кнопкой «Слияние».
источник
Предположим, вы работали в feature / task1 с несколькими коммитами.
Перейдите в ветку вашего проекта (project / my_project)
Создать новую ветку (feature / task1_bugfix)
Мардж с
--squash
опциейСоздать один коммит
Раздвинь свою ветку
источник
Для Git
Создать новую функцию
через терминал / оболочку:
Это не фиксирует это, позволяет вам сначала просмотреть его.
Затем зафиксируйте и завершите функцию из этой новой ветки, а также удалите / проигнорируйте старую ветку (ту, на которой вы создали dev).
источник
если вы получили ошибку: фиксация невозможна, потому что у вас есть файлы без слияния.
исправлены все файлы конфликтов
Вы также можете использовать
источник
Чтобы раздавить свою местную ветку, прежде чем нажать ее:
Проверьте ветку, в которой вы хотите работать, если она еще не проверена.
Найдите ша самого старого коммита, который вы хотите сохранить.
Создайте / извлеките новую ветку (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-squash . Например, чтобы раздавить все коммиты в ветви функций, которая была отделена от основной ветви, напишите:
источник