Как использовать git merge --squash? - PullRequest
1004 голосов
/ 15 марта 2011

У меня есть удаленный сервер Git, вот сценарий, который я хочу выполнить:

  • Для каждой ошибки / функции я создаю отдельную ветку Git

  • Я продолжаю фиксировать свой код в этой ветке Git с неофициальными сообщениями Git

  • В верхнем репозитории мы должны сделать один коммит для одной ошибки с официальным сообщением Git

Итак, как я могу объединить мою ветку с удаленной веткой, чтобы они получили всего один коммит для всех моих проверок (я даже хочу предоставить для этого сообщение о коммите)?

Ответы [ 8 ]

1656 голосов
/ 15 марта 2011

Скажем, ваша ветвь с исправлением ошибок называется 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

Создает один коммит из объединенных изменений.

Пропуск *Параметр 1026 * позволяет изменить черновое сообщение о коммите, содержащее каждое сообщение из ваших сдавленных коммитов, до завершения вашего коммита.

103 голосов
/ 19 августа 2014

Что окончательно прояснило для меня это комментарий , показывающий, что:

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 merge --squash дает мне желаемый результат одного коммита для слияния целой ветви функций.И мне нужно сделать не более одного ручного разрешения конфликта.

93 голосов
/ 15 марта 2011

Вы хотите объединить с опцией сквоша. Это если вы хотите сделать это по одной ветке за раз.

git merge --squash feature1

Если вы хотите объединить все ветви одновременно с одиночными коммитами, то сначала интерактивно перебазируйте и раздавите каждую функцию, затем объедините осьминога:

git checkout feature1
git rebase -i master

Сквош в один коммит, затем повторите для других функций.

git checkout master
git merge feature1 feature2 feature3 ...

Последнее слияние является "слиянием осьминога", потому что оно объединяет множество веток одновременно.

Надеюсь, это поможет

21 голосов
/ 13 марта 2015

Если у вас уже есть git merge bugfix на main, вы можете раздавить свой коммит слияния в один с помощью:

git reset --soft HEAD^1
git commit
8 голосов
/ 17 марта 2017

Объединить newFeature ветвь в master с пользовательской фиксацией:

git merge --squash newFeature && git commit -m 'Your custom commit message';

Если вместо этого вы выполните

git merge --squash newFeature && git commit

, вы получитесообщение коммита, которое будет включать все коммиты ветки newFeature, которые вы можете настроить.

3 голосов
/ 23 февраля 2019

Я знаю, что этот вопрос не касается конкретно Github, но, поскольку Github очень широко используется, и это ответ, который я искал, я поделюсь им здесь.

Github имеет возможность выполнять слияние сквоша, в зависимости от параметров слияния, включенных для хранилища.

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

Screenshot of

2 голосов
/ 27 декабря 2018

Предположим, вы работали в 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
    
0 голосов
/ 05 октября 2017

Для Git

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...