Відповіді:
Якщо ви додасте в команду --preserve-merges
опцію (або її синонім, -p
), git rebase -i
то git намагатиметься зберегти злиття під час перезавантаження, а не лінеаризувати історію, і ви також зможете внести зміни до комісій злиття:
git rebase -i -p HEAD~5
HEAD~5
є батьківська команда, яку ви хочете змінити (зазвичай, sha1 ^).
--preserve-merges
зараз--rebase-merges
Зауважте, що, починаючи git1.7.9.6 (і git1.7.10 +), git merge
сам завжди буде запускати редактор , щоб ви додавали деталі до об'єднання.
"
git merge $tag
" для об'єднання поміченого тегу завжди відкриває редактор під час інтерактивного сеансу редагування. Версія v1.7.10 представила змінну середовища GIT_MERGE_AUTOEDIT, щоб допомогти старим сценаріям відмовитися від такої поведінки, але доріжка технічного обслуговування також повинна підтримувати її.
Він також вводить змінну середовища, GIT_MERGE_AUTOEDIT
щоб допомогти старшим сценаріям відмовитися від такої поведінки.
Див. " Передчуття Git 1.7.10 ":
Нещодавно під час дискусії у списку розсилки Git Лінус зізнався (і я погодився), що це була одна з помилок у дизайні, яку ми допустили на початку історії Git.
І в 1.7.10 і пізніших випадках команда git merge, що виконується в інтерактивному сеансі (тобто як її стандартний вхід, так і його стандартний вихід, підключений до терміналу), відкриє редактор перед створенням комісії для запису результату злиття, щоб надати у користувача є можливість пояснити злиття, як і команда git commit, яку користувач виконує після вирішення конфліктного злиття.
Лінус сказав:
Але мене дуже не хвилює, як це насправді працює - моя головна проблема полягає в тому, що git робить занадто легким повідомлення про погані злиття.
Я думаю, що частиною цього є ще простіший ідіотизм: ми ніколи навіть не запускаємо редактора за замовчуванням для "git merge", але ми робимо для "git commit
".
Це була помилка дизайну, і це означає, що якщо ви хочете фактично додати нотатку до об'єднання, вам доведеться виконати додаткову роботу. Тож люди ні .
Зауважте, що перед Git 2.17 (Q2 2018), " git rebase -p
" помилкові повідомлення журналу комісії об'єднання, яке тепер виправлено.
Див. Комісію ed5144d (08 лютого 2018 р.) Грегорі Ерреро (``) .
Запропоновано: Vegard Nossum ( vegard
) та Quentin Casasnovas ( casasnovas
) .
(Об’єднано Хуніо С Хамано - gitster
- у комітеті 8b49408 , 27 лютого 2018 р.)
rebase -p
: виправити неправильне повідомлення про фіксацію під час дзвінкаgit merge
.Оскільки присвоєння dd6fb00 ("
rebase -p
: виправити котирування при викликуgit merge
", січень 2018 року, Git 2.16.0-rc2), повідомлення фіксації повторного базування об'єднання об'єднань передається команді злиття за допомогою виконуваного підзаділу 'git rev-parse --sq-quote
'.Подвійні лапки потрібні навколо цієї нижньої частини, так що для
git merge
команди зберігаються нові рядки .Перед цим патчем наступне повідомлення про об'єднання:
"Merge mybranch into mynewbranch Awesome commit."
стає:
"Merge mybranch into mynewbranch Awesome commit."
після а
rebase -p
.
З Git 2.23 (Q2 2019), " merge -c
" інструкція під час " git rebase --rebase-merges
" повинна дати користувачеві можливість редагувати повідомлення журналу, навіть коли в іншому випадку немає необхідності створювати нове злиття та замінювати існуюче (тобто замість швидкого перемотування вперед) ), але не зробив.
Що було виправлено.
Див. Комісію 6df8df0 (02 травня 2019 р.) Від Phillip Wood ( phillipwood
) .
(Об'єднав Хуніо С Хамано - gitster
- у комітеті c510261 , 13 червня 2019 р.)
Ще одна приємна відповідь, використовуючи лише примітивні команди - від knittl https://stackoverflow.com/a/7599522/94687 :
git checkout <sha of merge>
git commit --amend # edit message
git rebase HEAD previous_branch
або краща (більш правильна) остаточна команда ребазування:
git rebase <sha of merge> previous_branch --onto HEAD
BTW, використовуючи примітивні команди, може мати гарну "особливість" не витрачати занадто багато процесора і змусити вас чекати невідомий час, поки Git закінчить думати про список комітетів, які потребують перебазування у випадку git rebase -p -i HEAD^^^^
(така команда, що призведе до перелік лише 4 останніх з’єднань із об'єднанням як останній у моєму випадку у моєму випадку зайняв близько 50 секунд!).
Для поточних версій Git (Май 2020):
git rebase -i -r <parent>
,
потім замініть в редакторі merge -C ...
на merge -c ...
.
Це відкриє повідомлення про фіксацію в редакторі під час перезавантаження, де ви можете його змінити.
git rebase -i HEAD~5
Команда з'являється редактор. У ньому перераховані зазначені коміти (в даному випадку їх п'ять). Перший стовпець містить pick
кожну комісію. Просто замініть pick
з reword
цього редакторі і зберегти + закрийте редактор. Тоді мерзотник з'явиться редактор для кожної фіксації , де ви змінили , pick
щоб reword
і дозволить вам відредагувати повідомлення фіксації.
-p
до git rebase
команди.
! [rejected] HEAD -> master (non-fast-forward)error: failed to push some refs to