Как я могу редактировать старое сообщение git commit программно? - PullRequest
0 голосов
/ 01 июня 2018

Вы можете программно редактировать только последнее сообщение о коммите:

git commit --amend -m 'xxxxxxx'

Или интерактивный случайный коммит:

git rebase -i HEAD~n
# Vim opens up, select the commit you want to modify, and change the word "pick" for "edit"
git commit --amend -m "Changing an old commit message!"
git rebase --continue

Как объединить оба?Я хочу изменить сообщение программно, но не до последнего, а до предыдущего коммита.

Фиксация, которую я хочу изменить, уже отправлена ​​на git-сервер, но другие люди повторно синхронизируют gitПроект не является проблемой.

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

Если вы просто меняете несколько коммитов, используйте git rebase -i и опцию «reword».Например ...

pick 6256642 mv file1 file2
pick 20c2e82 Add another line to file2

# Rebase 8236784..20c2e82 onto 8236784 (2 commands)
#
# 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
# d, drop = remove commit

Переключите pick на reword, и вам будет предложен редактор для переписывания сообщения фиксации.


Если вам нужно сделатьто же самое для многих коммитов, используйте git filter-branch с --msg-filter.Исходное сообщение о фиксации находится на стандартном вводе, новое сообщение о фиксации находится на стандартном выводе.Вот один из способов изменить «цвет» на «цвет» во всех коммитах в текущей ветви.

git filter-branch --msg-filter "perl -ple 's{color}{colour}g'"
0 голосов
/ 05 февраля 2019

Поскольку вы хотите внести изменение программно, интерактивная перебазировка (git rebase -i) не является опцией.

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

Вы создаете новую временную ветку с целевым коммитом в качестве HEAD, редактируете сообщение фиксации, объединяете старыйперейдите на новую, а затем удалите старую временную ветку.

В сценарии оболочки:

CURBRANCH=`git rev-parse --abbrev-ref HEAD`
TMPBRANCH=tmp$$
git checkout $SHA -b $TMPBRANCH
MSG=`tempfile`
git log --format=%B -n 1 HEAD > $MSG
... edit the $MSG file
git commit --amend -F $MSG
SHA=`git rev-list -n 1 HEAD`   # Commit has change, so SHA has also changed
rm $MSG
git rebase --onto $TMPBRANCH HEAD $CURBRANCH
git branch -d $TMPBRANCH
0 голосов
/ 01 июня 2018

Причина, по которой вы не можете просто «изменить» произвольный коммит, заключается в том, что коммиты являются неизменяемыми.Когда вы изменяете коммит, он фактически заменяет текущий коммит другим и перемещает вашу ветку в новый коммит.Коммит со старым сообщением, именем автора и т. Д. Остается в истории до тех пор, пока вы его не очистите:

Before:

        master
          |
          v
A -- B -- C

After:

        master
          |
          v
A -- B -- C'
      \
       \- C

Для имитации «внесения изменений» в произвольный коммитвам нужно будет переписать не только этот коммит, но и всю историю после него, поскольку коммит включает своих родителей как часть своих неизменных данных:

Before:

        master
          |
          v
A -- B -- C

After:

         master
           |
           v
A -- B' -- C'
 \ 
  \- B --- C

ВыЭто можно сделать, создав ветку для интересующего вас коммита, изменив его и изменив диапазон коммитов, следующих за оригиналом, до кончика вашей оригинальной ветки на новую ветку.Вот пример, показывающий, что вы ищете:

Start:

             master
               |
               v
A -- B -- C -- D

New Branch:

             master
               |
               v
A -- B -- C -- D
     ^
     |
    temp

Amend:

             master
               |
               v
A -- B -- C -- D
 \
  \- B'
     ^
     |
    temp

Rebase:

A -- B  -- C  -- D
 \
  \- B' -- C' -- D'
     ^           ^
     |           |
    temp       master

Cleanup:

A -- B  -- C  -- D
 \
  \- B' -- C' -- D'
                 ^
                 |
               master

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

...