Свернуть группу комитетов в один на Git - PullRequest
62 голосов
/ 30 июля 2011

У меня есть привычка делать огромное количество маленьких коммитов, и я в порядке.Но я хотел бы время от времени брать кучу этих линейных коммитов и сворачивать их вместе как один коммит с возможностью написать новое сообщение о коммите.

Я изучил документацию, номне показалось немного загадочным.Кто-нибудь знает, как это сделать?

Ответы [ 4 ]

53 голосов
/ 14 мая 2015

Предполагая, что вы не заботитесь о сохранении каких-либо существующих сообщений коммита, есть отличный (и быстрый) рецепт git, который вы можете использовать.Во-первых, убедитесь, что ваша ветвь извлечена:

git checkout <branch-to-squash>

В целях безопасности давайте пометим текущую фиксацию.

git tag my-branch-backup

Затем переместите ветку HEAD обратно к вашей последней хорошей фиксации (без изменения рабочей области или индекса). РЕДАКТИРОВАТЬ: последний хороший коммит - это самый последний коммит в вашей ветке, который вы хотите сохранить.

git reset --soft <last-good-commit>

Используя git status, вы заметите, что все изменения в вашей функцииФилиал сейчас поставлены.Все, что осталось сделать, это ...

git commit

Этот метод отлично подходит для объединения длинных, запутанных историй мерзавцев и грубых слияний.Кроме того, нет конфликтов для слияния / перебазирования, которые нужно разрешить!

Теперь, если вам нужно сохранить какое-либо из ваших существующих сообщений о коммитах или сделать что-то более необычное, чем позволяет вышеописанное, вы захотите использовать git rebase --interactive.

Решение, полученное из: http://makandracards.com/makandra/527-squash-several-git-commits-into-a-single-commit

Ссылка: http://git -scm.com / docs / git-reset

Ссылка: http://git -scm.com / документы / ГИТ-перебазироваться

53 голосов
/ 30 июля 2011

Предположим, вы хотите переписать историю дерева, возвращаясь до (но не включая) фиксации a739b0d.

export EDITOR=vim # or your favorite editor
git rebase a739b0d --interactive

Обязательно прочтите интерактивный перебаз * Сначала 1006 *.

14 голосов
/ 29 марта 2014

Используйте команду git rebase -i <commit>, где <commit> - SHA для последней стабильной фиксации.

Это приведет вас к вашему редактору, где вы сможете заменить метку pick, которая находится рядом с каждым коммитом, начиная с <commit>, который вы указали в качестве аргумента для своей интерактивной команды rebase. В команде, с которой вы хотите начать сворачивание, замените pick на reword, и для каждого последующего коммита, который вы хотите свернуть в нее, замените pick на fixup. Сохраните, и вам будет разрешено предоставить новое сообщение о коммите.

5 голосов
/ 30 июля 2011

Вы можете раздавить любое количество коммитов в один, используя

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