Рассмотрим две наиболее частые операции — изменение названия коммита и слияние нескольких коммитов в один.
Допустим, вы выполнили команду
|
1 |
git log --oneline |
И увидели следующую историю ваших коммитов в ветке:
|
1 2 3 4 5 6 7 |
62c5b5202c (HEAD -> my-feature) Amend comments and formatting 95631e29df update funcition defenition 9f99da3b76 Remove constructor from Gene Class f30f70962a Cosmetic changes as code review f256b8a634 Cosemtic changes as code review ba29ebc296 Refactoring: place options into separate method f7e855a9af Update form fields of Gene Class |
Вам не понравилось описание для 95631e29df — где есть ошибки, а также само описание начинается со строчной буквы.
А коммиты f30f70962a и f256b8a634 — это этапы одного процесса исправлений в коде, и их желательно просто свести в один.
Git предлагает выполнить обе операции в рамках одного процесса — rebase. Чтобы запустить этот процесс, надо определить точку его начала — а именно коммит, который не будет затронут вашими операциями.
В нашем случае — это ba29ebc296. Это первый коммит, идущий перед парочкой, которую мы хотим объединить.
|
1 |
git rebase -i ba29ebc296 |
Процесс идет поэтапно. Вначале git нам предложит обозначить план операций. Для этого он составит список коммитов, в виде текстового файла и предложит его отредактировать. После запуска предыдущей команды, запустится штатный текстовый редактор, и вы увидите следующее:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
pick 62c5b5202c Amend comments and formatting pick 95631e29df update funcition defenition pick 9f99da3b76 Remove constructor from Gene Class pick f30f70962a Cosmetic changes as code review pick f256b8a634 Cosemtic changes as code review pick ba29ebc296 Refactoring: place options into separate method pick f7e855a9af Update form fields of Gene Class # Rebase 62c5b5202c..f7e855a9af onto ba29ebc296 (7 commands) # # Commands: # p, pick <commit> = use commit # r, reword <commit> = use commit, but edit the commit message # e, edit <commit> = use commit, but stop for amending # s, squash <commit> = use commit, but meld into previous commit # f, fixup [-C | -c] <commit> = like "squash" but keep only the previous # commit's log message, unless -C is used, in which case |
Здесь нужно выбрать операции, который будет совершатся над коммитами. Внизу, в виде подсказки, они перечислены. В нашем примере нужны две — «reword» или «r» — для переименования, а также «squash» или «s» — для слияния соседних коммитов.
Поменяйте pick на нужную команду для каждого коммита. Squash работает как сведение коммита в тот, что идет выше по списку. Для нашего случая:
|
1 |
pick 62c5b5202c Amend comments and formatting<br>r 95631e29df update funcition defenition<br>pick 9f99da3b76 Remove constructor from Gene Class<br>pick f30f70962a Cosmetic changes as code review<br>s f256b8a634 Cosemtic changes as code review<br>pick ba29ebc296 Refactoring: place options into separate method<br>pick f7e855a9af Update form fields of Gene Class |
Pick — означает, что коммит будет взят без изменений.
На этом этапе не нужно менять тексты комментариев, только требуется выбрать тип операции, которую вы хотите произвести.
Когда вы сохраните изменения в тексте и выйдете из редактора, git будет поэтапно запрашивать у вас информацию по каждому из запланированных изменений. Снова будет запускаться текстовый редактор и вам надо будет вводить/изменять название коммита.
Например, изменение названия:
|
1 2 3 4 5 6 7 8 |
update funcition defenition # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Date: Mon Mar 16 09:17:27 2026 +0500 # # interactive rebase in progress; onto ba29ebc296 |
Измените название и сохраните файл, выйдите из редактора. И так для всех операций, которые меняют историю.
Что делаем после
Если вы изменяли историю коммитов, которые уже отправлены в origin, то ваша ветка окажется в состоянии:
|
1 |
Your branch and 'origin/my-feature' have diverged |
Если вас устраивает то, что получилось. А также, если вашей веткой пользуетесь только вы. То можете смело push изменения, для этого нужно приложить некоторые усилия :)
|
1 |
git push --force |
Ветка в origin перепишется новой историей коммитов.
Если пошло что то не так, то это происходит пока у вас локально. Вы можете сбросить все изменения, чтобы вернуться к состоянию ветки синхронному origin:
|
1 |
git checkout my-feature<br>git reset --hard |
Если в результате rebase вы оказались в состоянии detached, но вас устраивает то, что вы видите в истории коммитов, то вы можете подцепить ветку к текущему положению.
|
1 2 |
git branch -f my-feature HEAD git checkout my-feature |