Git: редактировать только сообщения предыдущих коммитов

12

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

Как мне отредактировать только сообщения предыдущих коммитов и (если возможно) сохранить дерево коммитов?

Туйен Фам
источник
10
Остерегайтесь меняющейся публичной истории!
Д. Бен Кнобл
2
Я боюсь, что ответы здесь не дают вам достаточно ужасных предупреждений. это создаст огромный беспорядок, если кто-то еще покажет вашу историю - тем более, если он совершит новую работу над ней!
Eevee
Я буду использовать его с делом, у меня есть более простой случай, я единственный, кто использует этот репо.
Туйен Фам
3
Информация: это уже спрашивали (возможно, много раз) о переполнении стека .
user202729

Ответы:

20

Чтобы редактировать сообщения коммитов серии коммитов, я запускаю

git rebase -i firstsha

где firstsha- идентификатор родительского коммита первого коммита, который я хочу отредактировать. (Вы можете использовать любую действительную ссылку здесь, поэтому git rebase -i HEAD~4покажет последние четыре коммита.)

В открывшемся редакторе измените все записи «pick» на «reword» для коммитов, которые вы хотите изменить, затем закройте редактор; Затем вас попросят ввести сообщения о коммите для всех коммитов, которые вы выбрали.

Обратите внимание , что это будет изменить дерево совершить, потому что хэши коммитов изменится. Вам придется принудительно толкнуть новое дерево или перенести его в новую ветвь. Это также может испортить слияния, поэтому избегайте редактирования коммитов слияния.

Чтобы быстро редактировать только последний коммит, запустите

git commit --amend

(но остерегайтесь всего, что сделано для фиксации, хотя).

Стивен Китт
источник
Как это повлияет на дерево коммитов, создаст ли оно промежуточную вертикальную линию в дереве коммитов? Теперь у меня было только одно дерево коммитов по вертикальной линии, и нужно изменить более 100 сообщений.
Туйен Фам
3
Он не создаст новую «линию» в вашем дереве коммитов, он изменит все коммиты. Если ваша история в настоящее время линейна, она останется линейной.
Стивен Китт
По-разному. Используете ли вы его самостоятельно и не отправляете на сервер? Тогда нет, только одна «линия». Но в противном случае их может быть два, и, основываясь на ваших ответах на первые два, мы можем помочь вам избавиться от старой «линии».
Капитан Ман
1
У Rebase есть флаг для обработки слияний (я думаю, что это так preserve-merges)
Д. Бен Кнобл,
6

То, что вы ищете, это git rebase.

Если вы хотите изменить только предыдущее git commitсообщение, вам нужно использовать только следующее:

git commit --amend

И внесите необходимые изменения в предыдущий коммит, а затем сохраните изменения.

Однако, если вам нужно изменить старые коммиты, вам нужно использовать rebase.

git rebase -i HEAD~N 

где N равно числу коммитов, к которым вы хотите вернуться, например, 2, 12, 6 и т. д. и т. д.

Здесь вы должны получить текстовый редактор с вашими коммитами. Измените параметр с pickна, rewordчтобы изменить сообщение.

После того как вы определили все коммиты, которые вы хотите изменить, и соответствующим образом изменили их параметры, сохраните и закройте редактор. Затем внесите изменения в каждое сообщение о коммите. Как только вы удовлетворены, вы можете запустить:

git push --force

И вы должны были поддерживать свою историю git, хотя и с другими значениями хэша, потому что вы внесли необходимые изменения, которые вы хотите. Вот некоторые дополнительные ссылки, которые вы должны проверить:

7.6 Git Tools - Переписывание истории
Справка GitHub - Изменение сообщения
фиксации StackOverflow - Вопрос об изменении старых сообщений фиксации

kemotep
источник
Если вы «перефразируете», вам не нужно « commit --amend», если только вы не испортили процесс фиксации.
Стивен Китт
Спасибо, вот шаги, которые я буду делать, насколько я понимаю из вашего поста: 1. сделать git rebase -i firstshaэто firstshaхэш родительского коммита коммита, который я хотел бы изменить сообщение, затем в редакторе, изменить pickна reword, enterновое сообщение, затем выполнить git rebase --continueи делать git push --force?
Туйен Фам
@StephenKitt, я только что заметил твой ответ, я делал мой, когда ты отправил свой. Я последую вашему совету и постараюсь внести эти изменения. Если это более уместно, я могу объединить свой ответ с вашим, добавив ссылки на ваш, если вы считаете, что этот вопрос лучше подойдет, чем наличие нескольких похожих ответов.
Kemotep
@TuyenPham вам нужно только сделать, чтобы git rebase -i HEAD~NN было числом коммитов назад, которое вы хотите выполнить. Измените каждый параметр фиксации, для которого вы хотите отредактировать сообщение от pickдо reword, сохраните этот файл, внесите изменения в каждый из этих файлов фиксации и сохраните их. Как только вы уверены, что вы сделали, вам нужно только git push --force [Name of git branch you are were working on]. Вы всегда можете вернуться и сделать это снова или сделать это поэтапно.
Kemotep