Изменить старое сообщение о коммите на Git

136

Я пытался отредактировать старое сообщение фиксации, как описано здесь .

Дело в том, что сейчас при попытке запустить rebase -i HEAD~5говорит interactive rebase already started.

Итак, я пытаюсь: git rebase --continueно получаю эту ошибку:

error: Ref refs/heads/master is at 7c1645b447a8ea86ee143dd08400710c419b945b but expected c7577b53d05c91026b9906b6d29c1cf44117d6ba
fatal: Cannot lock the ref 'refs/heads/master'.

Любые идеи?

Пабло Фернандес
источник

Ответы:

125

Это говорит:

Когда вы сохраните и выйдете из редактора, он вернет вас обратно к последней фиксации в этом списке и выведет вас в командную строку со следующим сообщением:

$ git rebase -i HEAD~3
Stopped at 7482e0d... updated the gemspec to hopefully work better
You can amend the commit now, with

Это не означает:

введите снова git rebase -i HEAD~3

Постарайтесь не печатать git rebase -i HEAD~3при выходе из редактора, и все должно работать нормально.
(в противном случае в вашей конкретной ситуации git rebase -i --abortможет потребоваться сбросить все и позволить вам повторить попытку)


Как упоминает Дэйв Фогт в комментариях, он git rebase --continueпредназначен для перехода к следующей задаче в процессе перебазирования после того , как вы изменили первую фиксацию .

Кроме того , Gregg Lind упоминает в своем ответе rewordкомандованияgit rebase :

Заменив команду «pick» на команду «edit», вы можете указать, что git rebaseнужно остановиться после применения этой фиксации, чтобы вы могли редактировать файлы и / или сообщение фиксации, изменять фиксацию и продолжать перебазирование.

Если вы просто хотите отредактировать сообщение фиксации для фиксации, замените команду « pick» на команду « reword» , начиная с Git1.6.6 (январь 2010 г.) .

Он делает то же самое, что editи во время интерактивной перебазировки, за исключением того, что позволяет редактировать только сообщение фиксации, не возвращая управление оболочке . Это очень полезно.
В настоящее время, если вы хотите очистить сообщения о фиксации, вам необходимо:

$ git rebase -i next

Затем установите для всех коммитов значение «редактировать». Затем по каждому:

# Change the message in your editor.
$ git commit --amend
$ git rebase --continue

Использование « reword» вместо « edit» позволяет пропустить git-commitи git-rebaseвызовы .

VonC
источник
2
Кроме того, git rebase --continueпереходит к следующей задаче в процессе перебазирования после того, как вы изменили первую фиксацию.
Дэйв Фогт,
1
Добавление ссылки на вики-статью на github для изменения сообщения о фиксации
Joy
60

Как предложил Грегг Линд, вы можете использовать reword, чтобы вам было предложено изменить только сообщение фиксации (в противном случае оставьте фиксацию нетронутой):

git rebase -i HEAD~n

Вот nсписок последних n коммитов.

Например, если вы используете git rebase -i HEAD~4, вы можете увидеть что-то вроде этого:

pick e459d80 Do xyz
pick 0459045 Do something
pick 90fdeab Do something else
pick facecaf Do abc

Теперь замените pick на reword для коммитов, сообщения которых вы хотите редактировать:

pick e459d80 Do xyz
reword 0459045 Do something
reword 90fdeab Do something else
pick facecaf Do abc

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

Узнайте больше на странице GitHub об изменении сообщения о фиксации .

Пунит Вара
источник
Очень хорошо объяснил. Спасибо: D
Шубхам Джайн
Спасибо @ShubhamJain Рад, что мой ответ оказался полезным
Пунит Вара
Я сделал это, а затем в моей ветке появляются коммиты из других веток
Реза
@Reza, ты мог что-то напутать. Попробуйте это в другом репо. Это решение работает отлично
Пунит Вара
54

FWIW, git rebase interactive теперь имеет опцию "reword", которая делает это намного менее болезненным!

Грегг Линд
источник
3
rewordПочему при использовании git просто не позволяет редактировать сообщения коммитов в этом файле со списком коммитов? Вместо этого он запустит редактор с одним файлом сообщения фиксации в каждой rewordстроке. В этом нет необходимости. Даже если другие действия, кроме pickили rewordтребуют запуска внешних команд, rewordне потребуют этого.
Дэн Даскалеску
9

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

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

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

От последнего мастера:

git checkout -b new-branch

затем

git merge --squash problem-branch
git commit -m "new message" 

Ссылка: https://github.com/rotati/wiki/wiki/Git:-Combine-all-messy-commit-into-one-commit-before-merging-to-Master-branch

WebDever
источник
1
Ваш ответ действительно спас мне день :). Я боролся rebase -iпримерно 2 часа и безуспешно. Моя фиксация была за 18 коммитами, как вы можете себе представить. Это был более простой и удобный способ, который я мог найти без необходимости перебазирования. Спасибо друг!
Карлос Парра
6

Вот очень хороший Gist, который охватывает все возможные случаи: https://gist.github.com/nepsilon/156387acf9e1e72d48fa35c4fabef0b4

Обзор:

git rebase -i HEAD~X
# X is the number of commits to go back
# Move to the line of your commit, change pick into edit,
# then change your commit message:
git commit --amend
# Finish the rebase with:
git rebase --continue
Махмуд Залт
источник