current = old ;
Операции присваивания не копируют элементы одного массива в другой. Вы просто делаете матрицу current
ссылкой на матрицу old
. Вам нужно сделать мудрый экземпляр участника.
Расширение того, что я написал в комментарии
Общее правило состоит в том, что вы не должны переписывать (изменять) историю, которую вы опубликовали, потому что кто-то мог основывать свою работу на ней. Если вы переписываете (изменяете) историю, у вас могут возникнуть проблемы с объединением их изменений и обновлением для них.
Таким образом, решение состоит в создании нового коммита , который отменяет изменения , которые вы хотите избавиться. Вы можете сделать это с помощью команды 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
git reset --hard a
git reset --mixed d
git commit
Это будет действовать как откат для всех сразу. Напишите хорошее сообщение о фиксации.