С git rebase есть ли способ переформулировать сообщения фиксации в git-rebase-todo, используя команды по умолчанию?

предположим я бегу git rebase -i HEAD~3

pick 6b24464 foo
pick a681432 Foo
pick 8ccba08 foo foo

# Rebase 960c384..8ccba08 onto 960c384
#
# 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

Я хотел бы перефразировать сообщения фиксации непосредственно из этого файла, а не редактировать каждое сообщение фиксации по одному (как обычно с reword), вот так:

reword 6b24464 foo bar
reword a681432 Foo Bar
reword 8ccba08 foo foo bar bar

# Rebase 960c384..8ccba08 onto 960c384
#
# 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

Я надеялся, что это можно сделать, используя только reword или edit, но я не могу понять, как (если это вообще возможно). Я смог достичь того же результата с

x git cherry-pick 6b24464 && git commit -amend "foo bar"

однако это занимает больше времени, чем я хотел бы для больших перебазирует. Есть идеи?

3 ответов


Я не верю, что это можно сделать, потому что когда вы делаете git rebase -i вы получаете только первую строку каждого сообщения фиксации, а не полное сообщение фиксации.

как соглашение, сообщение фиксации должно иметь первую строку только резюме и иметь более подробную информацию об изменении в следующих строках. вот Линус Торвальдс о том, как написать правильное сообщение фиксации

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


вы, вероятно, можете использовать exec опция для достижения того, что вы хотите.

используйте команду exec, аналогичную git commit --amend -m "this is the new message"

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

#!/bin/sh
git commit --amend -m ""

затем добавьте в exec линия, где вы хотите

pick 6b24464 foo
pick a681432 Foo
x my_reword "this is a new message"
pick 8ccba08 foo foo

нет, вы не можете перефразировать сообщения в файле rebase TODO.

причину этого: Git-это применение перебазировать сверху вниз. Файл TODO только говорит Git, в каком порядке выполнить операцию перебазирования и каково ее действие (сквош, пересказ, использование, исправление и т. д.). Затем он полагается на другие механизмы (например,commit) для обработки остальных.

Если у вас есть много коммитов для пересказа, вы получите много подсказок для редактирования сообщения, которое что вы должны ожидать; вы создаете новую фиксацию [независимо] с новым сообщением, поэтому Git должен попросить вас ввести ее, пока она находится в середине обработки операции ребазирования.

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