В Git после создания фиксации она закрепляется; вы не можете его изменить. Все, что вы можете сделать — изменить его, выбрать вишни и т. д. — это создать новый коммит, который будет похож на него.
Я понимаю ваше замешательство: слово «исправить» немного неправильно; это несколько вводит в заблуждение, так как предлагает что-то изменить на месте. В Git изменение коммита на самом деле состоит в создании совершенно нового коммита с теми же родителями, что и исходный коммит.
В качестве примера предположим, что после запуска git checkout B
вы оказались в следующей ситуации:
(Ваш HEAD
отсоединен, но это не относится к делу.) Независимо от того, вносите ли вы изменения и поэтапно или нет, запуск git commit --amend
поставит вас в следующую ситуацию:
Коммит D
может быть очень, очень похож на B
; в частности, он может иметь точно такой же патч, точно такое же сообщение коммита, что и B
, и т. д. Однако временные метки (коммит, автор) обычно отличаются (если вы не можете изменить фиксацию менее чем за секунду!), что означает SHA -1 из D
будет отличаться от B
; и если два коммита не имеют одного и того же SHA, они не являются одним и тем же коммитом.
Когда мы говорим, что B
является родительским коммитом C
, мы имеем в виду коммит C
ссылается на коммит B
по его SHA. Однако коммит C
не может ничего узнать о SHA коммита D
, поскольку коммит D
был создан после C
. Следовательно, D
не может быть родителем C
. Вот почему коммит D
идет по касательной и не имеет потомков.
Если вы хотите приземлиться в следующем состоянии,
где B'
даже немного отличается от B
, вы должны использовать git rebase -i
, а не git commit --amend
.
person
jub0bs
schedule
20.09.2014