Подтвердить что ты не робот

Свертывание группы обязательств в одном на Git

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

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

4b9b3361

Ответ 1

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

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

Обязательно сначала прочитайте интерактивную перезагрузку.

Ответ 2

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

git checkout <branch-to-squash>

Для обеспечения безопасности отметьте текущую фиксацию.

git tag my-branch-backup

Затем переместите ветвь HEAD назад к вашему последнему хорошему фиксации (без изменения рабочей области или индекса):

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

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

git commit

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

Теперь, если вам нужно сохранить какие-либо из ваших существующих сообщений о фиксации или сделать что-нибудь более интересное, чем указано выше, вы можете использовать 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/docs/git-rebase

Ответ 3

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

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

Ответ 4

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

git rebase --interactive <commit>