Редактировать корневой коммит в Git? - PullRequest
289 голосов
/ 22 января 2010

Есть способы изменить сообщение из последующих коммитов:

git commit --amend                    # for the most recent commit
git rebase --interactive master~2     # but requires *parent*

Как изменить сообщение о коммите самого первого коммита (у которого нет родителя)?

Ответы [ 5 ]

505 голосов
/ 31 января 2013

Начиная с версии Git 1.7.12 , теперь вы можете использовать

git rebase -i --root
250 голосов
/ 22 января 2010

Предполагая, что у вас чистое рабочее дерево, вы можете сделать следующее.

# checkout the root commit
git checkout <sha1-of-root>

# amend the commit
git commit --amend

# rebase all the other commits in master onto the amended root
git rebase --onto HEAD HEAD master
59 голосов
/ 14 июля 2013

Чтобы развернуть ответ ecdpalma , теперь вы можете использовать опцию --root, чтобы сообщить rebase, что вы хотите переписать root / first commit:

git rebase --interactive --root

ЗатемКорневой коммит появится в списке перебазирования TODO, и вы можете отредактировать или перефразировать его:

reword <root commit sha> <original message>
pick <other commit sha> <message>
...

Это объяснение --root из документации Git rebase (выделено мной):

Перебазируйте все коммиты, доступные с <branch>, вместо ограничения их <upstream>. Это позволяет вам перебазировать корневой коммит (ы) в ветке .

11 голосов
/ 06 марта 2014

Просто чтобы предоставить альтернативу более высоким рейтингам ответов:

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

git commit --allow-empty -m "Initial commit"

и только потом начинайте делать "настоящие" коммиты. Затем вы можете легко сделать перебазировку поверх этого коммита стандартным способом, например git rebase -i HEAD^

4 голосов
/ 22 января 2010

Вы можете использовать git filter-branch:

cd test
git init

touch initial
git add -A
git commit -m "Initial commit"

touch a
git add -A
git commit -m "a"

touch b
git add -A
git commit -m "b"

git log

-->
8e6b49e... b
945e92a... a
72fc158... Initial commit

git filter-branch --msg-filter \
"sed \"s|^Initial commit|New initial commit|g\"" -- --all

git log
-->
c5988ea... b
e0331fd... a
51995f1... New initial commit
...