Ответ 1
Предположим, вы хотите переписать историю дерева, возвращаясь до (но не включая) commit a739b0d
.
export EDITOR=vim # or your favorite editor
git rebase a739b0d --interactive
Обязательно сначала прочитайте интерактивную перезагрузку.
У меня есть привычка делать огромное количество мелких коммитов, и я в порядке с ним. Но я хотел бы время от времени брать кучу этих линейных коммитов и сворачивать их вместе как одно коммит с возможностью писать новое сообщение фиксации.
Я просмотрел документацию, но мне показалось немного загадочным. Кто-нибудь знает, как это сделать?
Предположим, вы хотите переписать историю дерева, возвращаясь до (но не включая) commit a739b0d
.
export EDITOR=vim # or your favorite editor
git rebase a739b0d --interactive
Обязательно сначала прочитайте интерактивную перезагрузку.
Предполагая, что вам не нужно сохранять какие-либо из ваших существующих сообщений о фиксации, существует отличный (и быстрый) 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
Используйте команду git rebase -i <commit>
, где <commit>
- это SHA для последней стабильной фиксации.
Это приведет вас к редактору, где вы можете заменить метку pick
, которая находится рядом с каждой фиксацией, начиная с <commit>
, которую вы включили в качестве аргумента в свою интерактивную команду rebase. В команде, которую вы хотите начать сбрасывать, замените pick
на reword
, и для каждой фиксации, которую вы хотите свернуть, замените pick
на fixup
. Сохраните, и вам будет разрешено предоставить новое сообщение о фиксации.
Вы можете вырезать любое количество коммитов в один, используя
git rebase --interactive <commit>