Вы уже заменяете все свои коммиты
Commit C1
говорит, что его родительский коммит - C
. Вам нужен новый и другой коммит - вы можете назвать его E1
, например, - который говорит, что его родителем является E
.
Этот новый и другой коммит будет иметь новый и другой хэш-идентификатор. В конце, тем не менее, у вас все еще будет четыре коммита - они будут просто от E1
до E4
. Ваше имя my_branch
будет идентифицировать новый коммит E4
; commit C4
будет забыт и со временем уйдет, если кто-то или что-то еще не овладеет им и не отпустит:
E1 E2 E3 E4
o---o---o---o <-- my_branch
A B C D E/
o---o---o---o---o <-- master
\
o---o---o---o [abandoned]
C1 C2 C3 C4
Когда git rebase
попадает в конфликт, он останавливается в середине перебазирования
Rebase работает, копируя каждый коммит, по одному, превращая снимок в C1
в набор изменений для фиксации C
- его родительский - и применяя этот набор изменений для фиксации E
. Git делает это, используя внутренний механизм слияния Git, то есть Git также сравнивает C
против E
, чтобы определить, как применить C
против C1
.
В этом случае это сравнение и копирование прошло успешно, и Git успешно создал коммит E1
. Затем Git попытался построить E2
, сравнив C2
с C1
, чтобы превратить его в набор изменений, а затем слить его с изменениями от C1
до E1
. Вот где произошел конфликт. Итак, на данный момент, у вас есть:
E1
o <-- HEAD
A B C D E/
o---o---o---o---o <-- master
\
o---o---o---o <-- my_branch
C1 C2 C3 C4
Фиксация E2
выполняется, но еще не существует. Вы должны разрешить конфликт, git add
разрешенные файлы и запустить git rebase --continue
, чтобы Git сделал новый коммит E2
:
E1 E2
o---o <-- HEAD
A B C D E/
o---o---o---o---o <-- master
\
o---o---o---o <-- my_branch
C1 C2 C3 C4
В этот момент Git сможет попытаться скопировать C3
. Если все пойдет хорошо, Git сделает E3
самостоятельно. В противном случае он перестанет получать вашу помощь снова, и вы пройдете тот же процесс и в конечном итоге будете использовать git rebase --continue
, чтобы заставить Git копировать C4
в E4
.
Как только E4
успешно сделан, не осталось копий для выполнения, и git rebase
выполняет свой последний трюк: он перемещает имя my_branch
так, что оно указывает на E4
вместо C4
, повторно -прикрепление специального имени HEAD
к имени my_branch
.