Изменить корневую фиксацию в Git?

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

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

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

228
задан 13ren 22 янв. '10 в 21:21
источник поделиться

5 ответов

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

# 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
217
ответ дан Charles Bailey 22 янв. '10 в 21:53
источник поделиться

Как и в Git версии 1.7.12, вы можете теперь использовать

git rebase -i --root
413
ответ дан ecdpalma 31 янв. '13 в 19:24
источник поделиться

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

git rebase --interactive --root

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

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

Это объяснение --root из Git reba docs (выделение мое):

Восстановите все коммиты, достижимые с <branch>, вместо того, чтобы ограничивать их <upstream>. Это позволяет вам переустанавливать корневую фиксацию на ветке.

53
ответ дан user456814 14 июля '13 в 22:47
источник поделиться

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

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

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

7
ответ дан jakub.g 06 марта '14 в 21:37
источник поделиться

Вы можете использовать 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
3
ответ дан Alexander Groß 22 янв. '10 в 21:46
источник поделиться

Другие вопросы по меткам