Как отменить несколько коммитов git?

current = old ;

Операции присваивания не копируют элементы одного массива в другой. Вы просто делаете матрицу current ссылкой на матрицу old. Вам нужно сделать мудрый экземпляр участника.

801
задан Ciro Santilli 新疆改造中心996ICU六四事件 22 May 2018 в 10:02
поделиться

2 ответа

Расширение того, что я написал в комментарии

Общее правило состоит в том, что вы не должны переписывать (изменять) историю, которую вы опубликовали, потому что кто-то мог основывать свою работу на ней. Если вы переписываете (изменяете) историю, у вас могут возникнуть проблемы с объединением их изменений и обновлением для них.

Таким образом, решение состоит в создании нового коммита , который отменяет изменения , которые вы хотите избавиться. Вы можете сделать это с помощью команды git revert .

У вас следующая ситуация:

A <-- B  <-- C <-- D                                               <-- master <-- HEAD

(стрелки здесь указывают направление указателя: «родительская» ссылка в случае коммитов, top commit в случае заголовка ветки (ссылка ветки) и имя ветки в случае ссылки HEAD).

Вам необходимо создать следующее:

A <-- B  <-- C <-- D <-- [(BCD)^-1]                   <-- master <-- HEAD

где "[(BCD) ^ - 1 ] " означает фиксацию, которая отменяет изменения в коммитах B, C, D. Математика говорит нам, что (BCD) ^ - 1 = D ^ -1 C ^ -1 B ^ -1, поэтому вы можете получить требуемую ситуацию, используя следующие команды:

$ git revert --no-commit D
$ git revert --no-commit C
$ git revert --no-commit B
$ git commit -m "the commit message"

Альтернативным решением было бы проверить содержимое фиксации A и зафиксировать это состояние:

$ git checkout -f A -- .
$ git commit -a

Тогда у вас будет следующая ситуация:

A <-- B  <-- C <-- D <-- A'                       <-- master <-- HEAD

У фиксации A 'такое же содержимое как фиксация A, но это другая фиксация (сообщение фиксации, родители, дата фиксации).

Решение Джеффа Ферланда, модифицированное Чарльзом Бейли , основано на той же идее, но использует git reset :

$ git reset --hard A
$ git reset --soft @{1}  # (or ORIG_HEAD), which is D
$ git commit
1227
ответ дан 22 November 2019 в 21:08
поделиться
git reset --hard a
git reset --mixed d
git commit

Это будет действовать как откат для всех сразу. Напишите хорошее сообщение о фиксации.

55
ответ дан 22 November 2019 в 21:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: