Вы можете выполнить интерактивную перебазировку и вручную выбрать коммиты, которые вы хотите раздавить. Это перепишет историю вашей ветки dev
, но, поскольку вы не отправляли эти коммиты, не должно быть никаких негативных последствий, кроме того, что может произойти на вашем собственном компьютере.
Начните со следующего:
git checkout dev
git rebase -i HEAD~6
Это должно открыть окно, показывающее вам следующий список из 7 коммитов, возвращаясь на 6 шагов назад от HEAD вашей ветки dev
:
pick 07c5abd message for commit A
pick dl398cn message for commit B
pick 93nmcdu message for commit C
pick lst28e4 message for commit D
pick 398nmol message for commit E
pick 9kml38d message for commit F
pick 02jmdmp message for commit G
Первая показанная фиксация (A
выше) является самой старой, а последняя — самой последней. Вы можете видеть, что по умолчанию параметр для каждого коммита равен pick
. Если вы закончите перебазирование сейчас, вы просто сохраните каждый коммит как есть, что фактически не работает. Но так как вы хотите раздавить определенные промежуточные коммиты, отредактируйте и измените список на это:
pick 07c5abd message for commit A
pick dl398cn new commit message for "H" goes here
squash 93nmcdu message for commit C
squash lst28e4 message for commit D
pick 398nmol message for commit E
pick 9kml38d message for commit F
pick 02jmdmp message for commit G
Обратите внимание на то, что происходит выше. Набрав squash
, вы указываете Git объединить этот коммит с коммитом над ним, то есть коммитом, который был непосредственно перед им. Итак, это говорит о том, чтобы сжать коммит D
назад в коммит C
, а затем сжать C
в B
, оставив вам только один коммит для коммитов B
, C
и D
. Остальные коммиты остаются как есть.
Сохраните файл (: wq в Git Bash в Windows), и перебазирование будет завершено. Имейте в виду, что вы можете получить конфликты слияния из-за этого, как и следовало ожидать, но в их разрешении нет ничего особенного, и вы можете продолжать, как и при обычном перебазировании или слиянии.
Если вы проверите ветку после перебазирования, вы заметите, что коммиты E
, F
и G
теперь имеют новые хэши, даты и т. д. Это потому, что эти коммиты фактически были заменены новыми коммитами. Причина этого в том, что вы переписали историю, и поэтому коммиты в целом уже не могут быть такими, как были раньше.
person
Tim Biegeleisen
schedule
18.08.2016