Как использовать 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 имеет возможность выполнять слияние сквоша в зависимости от параметров слияния, включенных для хранилища.

Если слияние в сквош включено, опция "Сквош и слияние" должна появиться в раскрывающемся списке под кнопкой "Слияние".

Screenshot of "Squash and merge" Github feature

Ответ 7

Предположим, вы работали в feature/task1 с несколькими коммитами.

  1. Перейдите в ветку вашего проекта (project/my_project)

    git checkout project/my_project
    
  2. Создать новую ветку (feature/task1_bugfix)

    git checkout -b feature/task1_bugfix
    
  3. Мардж с опцией --squash

    git merge --squash feature/task1
    
  4. Создать отдельный коммит

    git commit -am "add single comments"
    
  5. Раздвинь свою ветку

    git push --set-upstream origin feature/task1_bugfix
    

Ответ 8

Для Git

Создать новую функцию

через терминал/оболочку:

git checkout origin/feature/<featurename>
git merge --squash origin/feature/<featurename>

Это не фиксирует его, позволяет сначала просмотреть его.

Затем зафиксируйте и завершите функцию из этой новой ветки, а также удалите/проигнорируйте старую ветку (ту, что вы использовали для разработки)