Edytować root commit w Git?

Są sposoby na zmianę komunikatu z późniejszych commitów:

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

Jak możesz zmienić komunikat commit pierwszego commita (który nie ma rodzica)?

Author: Martin G, 2010-01-22

5 answers

Zakładając, że masz czyste drzewo robocze, możesz wykonać następujące czynności.

# 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
 240
Author: CB Bailey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-17 09:46:37

Od wersji Git 1.7.12, możesz teraz użyć

git rebase -i --root
 467
Author: ecdpalma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-14 18:02:51

Aby rozwinąć odpowiedź ecdpalma , możesz teraz użyć opcji --root, aby powiedzieć rebase, że chcesz przepisać root / pierwszy commit:

git rebase --interactive --root

Wtedy commit root pojawi się na liście do zrobienia rebase i możesz wybrać, aby go edytować lub przeformułować:

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

To jest wyjaśnienie --root z Git rebase docs (emfaza mine):

Rebase wszystkich commitów osiągalnych z <branch>, zamiast ograniczać je <upstream>. Pozwala to na zmiana bazy commitów root na gałęzi.

 55
Author: Community,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:20

Innym sposobem na uniknięcie tego problemu, jeśli wiesz, że będziesz zmieniał nazwę na" pierwszy " commit w przyszłości, jest utworzenie pustego commita na początku:

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

I dopiero wtedy zacznij robić" prawdziwe " commity, wtedy możesz łatwo zmienić na nim bazę w standardowy sposób używając sth jak git rebase -i HEAD^

 9
Author: jakub.g,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-06 18:37:01

Możesz użyć 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
 4
Author: Alexander Groß,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-25 06:06:20