Иногда бывает так, что вы работаете, делаете коммиты, а в какой-то момент оказывается, что в комментариях вы указывали не тот номер задачи или неправильно писали какое-нибудь слово. Git в таких случаях позволяет вам поправить эти сообщения. Разумеется, правки истории желательно производить до того, как вы сделали git push, чтобы не расстраивать других разработчиков, которые работают с этой веткой.
Допустим, что у нас есть репозиторий с четырьмя изменениями:
1 2 3 4 5 |
> git log --oneline c23daf6 TASK-10 fourth line 0b5b1bb TASK-10 third line b403fc1 TASK-10 second line 79733f3 TASK-10 My message 1 |
И мы вдруг понимаем, что три последних коммита относились не к TASK-10, а к TASK-20, и мы хотим изменить сообщения этих коммитов так, чтобы там фигурировала именно двадцатая таска. Для этого мы применим команду rebase:
1 |
> git rebase -i HEAD~3 |
Цифра три после HEAD~ указывает количество коммитов от головы ветки, которые мы изменить. Перед нами откроется текстовый редактор (в моем случае это был GNU nano) со следующим содержимым:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
pick b403fc1 TASK-10 second line pick 0b5b1bb TASK-10 third line pick c23daf6 TASK-10 fourth line # Rebase 79733f3..c23daf6 onto 79733f3 # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out |
Нам нужно отредактировать этот текст так, чтобы rebase останавливался на коммитах, которые мы хотим изменить, для этого нам нужно заменить слово pick на edit перед этими коммитами:
1 2 3 |
edit b403fc1 TASK-10 second line edit 0b5b1bb TASK-10 third line edit c23daf6 TASK-10 fourth line |
Строки с решётками в конце файла можно не трогать, здесь я их не показал, чтобы обратить ваше внимание на нужном.
Сохраняем изменения в файле. Способ сохранения зависит от редактора, но в случае GNU nano последовательность такая Ctrl+O, Enter, Ctrl+X.
Мы увидим нечто вроде такого:
1 2 3 4 5 6 7 8 |
Stopped at b403fc1e56db13ee2257f0e9d233940a67e38e18... TASK-10 second line You can amend the commit now, with git commit --amend Once you are satisfied with your changes, run git rebase --continue |
Это произошла остановка на коммите с сообщением “TASK-10 second line”, для того чтобы изменить комментарий, вводим следующие команды:
1 |
> git commit --amend |
В текстовом редакторе правим комментарий и сохраняем файл.
Затем вводим команду:
1 |
> git rebase --continue |
Этим мы перещемаемся к следующему коммиту:
1 2 3 4 5 6 7 8 |
Stopped at 0b5b1bb459e808d5b0139caf6993ab0b03840413... TASK-10 third line You can amend the commit now, with git commit --amend Once you are satisfied with your changes, run git rebase --continue |
Снова с вводим:
1 |
> git commit --amend |
И так далее. Таким образом правим все три коммита. После третьего git rebase --continue мы можем снова посмотреть историю и убедиться, что сообщения к коммитам поменялись:
1 2 3 4 5 6 |
> git log --oneline 132dfcb TASK-20 fourth line 53df6d4 TASK-20 third line 71182ce TASK-20 second line 79733f3 TASK-10 My message 1 > |
Вот. Теперь мы научились править коммиты в git. Мы можем запушить их в удалённый репозиторий с помощью
1 |
git push |
или
1 |
git push origin <your_branch_name> --force |
в зависимости от того успели ли вы до этого запушить свои старые коммиты.