Расширение того, что я написал в комментарии
Общее правило состоит в том, что вы не должны переписывать (изменять) историю, которую вы опубликовали, потому что кто-то мог основывать свою работу на ней. Если вы переписываете (изменяете) историю, у вас могут возникнуть проблемы с объединением их изменений и с их обновлением.
Итак, решение состоит в том, чтобы создать новую фиксацию, которая отменяет изменения, от которых вы хотите избавиться. Вы можете сделать это с помощью git revert".
У вас следующая ситуация:
A <-- B <-- C <-- D <-- master <-- HEAD
(здесь стрелки указывают направление указателя: родительская ссылка в случае фиксации, верхняя фиксация в случае заголовка ветки (ссылка ветки) и имя ветки в случае ссылки HEAD).
Вам нужно создать следующее:
A <-- B <-- C <-- D <-- [(BCD)-1] <-- master <-- HEAD
где [(BCD)^-1]
означает фиксацию, которая отменяет изменения в коммитах B, C, D. Математика говорит нам, что (BCD) -1 = D -1 C -1 < / sup> B -1, поэтому вы можете получить требуемую ситуацию, используя следующие команды:
$ git revert --no-commit D
$ git revert --no-commit C
$ git revert --no-commit B
$ git commit -m "the commit message for all of them"
Работает для всего, кроме коммитов слияния.
Альтернативным решением было бы проверить содержимое фиксации A и зафиксировать это состояние. Также работает с коммитами слияния. Однако добавленные файлы не будут удалены. Если у вас есть какие-либо локальные изменения git stash
сначала:
$ git checkout -f A -- . # checkout that revision over the top of local files
$ git commit -a
Тогда у вас будет следующая ситуация:
A <-- B <-- C <-- D <-- A' <-- master <-- HEAD
Фиксация A 'имеет то же содержимое, что и фиксация A, но представляет собой другую фиксацию (сообщение фиксации, родители, дата фиксации).
Альтернативное решение Джеффа Ферланда, измененное Чарльзом Бейли, основано на той же идее, но использует git reset. Здесь он немного видоизменен, так РАБОТАЕТ НА ВСЕ:
$ git reset --hard A
$ git reset --soft D # (or ORIG_HEAD or @{1} [previous location of HEAD]), all of which are D
$ git commit
person
Jakub Narębski
schedule
24.09.2009
git push -f HEAD~4:master
(при условии, что удаленная ветка является главной). Да, вы можете нажать любую такую фиксацию. - person u0b34a0f6ae   schedule 23.09.2009git revert
. - person Jakub Narębski   schedule 23.09.2009