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