С 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 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 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"

Однако, это больше времени, чем для больших переделов. Любые идеи?

Ответ 1

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

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

Также, пожалуйста, напишите хорошие сообщения git commit. Хорошее сообщение о коммите выглядит так:

Header line: explain the commit in one line (use the imperative)

Body of commit message is a few lines of text, explaining things
in more detail, possibly giving some background about the issue
being fixed, etc etc.

The body of the commit message can be several paragraphs, and
please do proper word-wrap and keep columns shorter than about
74 characters or so. That way "git log" will show things
nicely even when it indented.

Make sure you explain your solution and why you're doing what you're
doing, as opposed to describing what you're doing. Reviewers and your
future self can read the patch, but might not understand why a
particular solution was implemented.

Reported-by: whoever-reported-it
Signed-off-by: Your Name <[email protected]>

где эта строка заголовка действительно должна быть значимой, и на самом деле должна быть только одна строка. Эта строка заголовка показывается такими инструментами, как gitk и shortlog, и должна суммировать изменения в одной читаемой строке текста, независимо от более длинного объяснения. Пожалуйста, используйте глаголы в императиве в сообщении коммита, как в Fix bug that..., Add file/feature ... или Make Subsurface...

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

Ответ 2

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

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

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

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

Затем добавьте строку exec, где хотите

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

Ответ 3

Нет, вы не можете переписывать сообщения в файле TODO для переустановки.

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

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

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