Отменить или удалить изменения из предыдущей фиксации Git

Предположим, у меня есть список коммитов: A > B > C > D > E, как я могу удалить из истории изменения, сделанные в C, чтобы было A > B > D > E?


person sergiuz    schedule 13.10.2015    source источник
comment
Вам нужно уточнить, хотите ли вы сохранить C в своей истории или нет, или вы просто хотите отменить его изменения в вашей текущей версии базы кода, и вам все равно, остается ли C в вашей истории. Вам это вообще важно?   -  person    schedule 13.10.2015
comment
См. также Отменить конкретную фиксацию в Git.   -  person    schedule 13.10.2015
comment
В данном случае меня не волнует C коммит, я его бросаю.   -  person sergiuz    schedule 13.10.2015


Ответы (3)


Вы всегда можете отменить изменения.

git revert C

Если вы хотите переписать историю, rebase для этого и существует. Тебе надо:

git rebase -i A

Затем удалите C из списка коммитов.

Подробное объяснение:

Первый вариант отменяет изменение, создавая новую фиксацию, противоположную исходной фиксации. Таким образом, репозиторий будет выглядеть так:

A > B > C > D > E > C`

Где C` противоположно C. В основном то же, что и patch --reverse

Второй вариант изменяет историю. rebase позволяет выбирать конкретные коммиты, менять порядок коммитов и многое другое. Я предлагаю прочитать git-rebase. Флаг -i предназначен для интерактивного режима, который позволяет пользователю редактировать список коммитов перед перебазированием.

Если вы удалите C из списка коммитов и выполните перебазирование, фактический вывод будет

A > B > D > E

У вас больше нет истории C в ветке.

Примечание. В обоих случаях у вас могут возникнуть конфликты в процессе. В первом случае, потому что вы применяете C` вместо E, а во втором случае, потому что вы применяете D вместо B.

person Igal S.    schedule 13.10.2015
comment
Tx Igal, не могли бы вы немного уточнить свой ответ? - person sergiuz; 13.10.2015
comment
Сделанный. Отредактировал мой ответ. - person Igal S.; 13.10.2015
comment
Вы должны упомянуть, что rebase не следует использовать, если другие люди также имеют коммит C в своей истории. Или, если эти люди согласны с необходимостью перебазировать/переделать свою работу поверх переписанного коммита, тогда перебазирование в порядке, но в любом случае вы не просто слегка перебазируете общую историю. - person ; 13.10.2015

попробуй git revert C

...и лучше всего также прочитать man git-revert

person Stephan W.    schedule 13.10.2015

Вы не можете сделать это и получить A > B > D > E. Вы всегда получите A > B > D' > E'

Чтобы удалить изменения, внесенные в C, вы можете использовать

git rebase --onto <newbase> <oldbase> <commit/branch>

в твоем случае:

git rebase --onto B C E

Это поместит изменения, внесенные в D..E из старой базы C, в новую базу B (если вы не столкнетесь с какими-либо конфликтами), что приведет к

A > B > D' > E'

Важно отметить, что D и E получают новые идентификаторы sha, в результате чего получаются D' и E', поэтому, если вы уже опубликовали C, D или E, используйте метод возврата (git revert C), иначе вы можете испортить историю других людей. .

person mariux    schedule 13.10.2015
comment
Так что этот ответ немного вводит в заблуждение. Хотя верно то, что D и E переписаны, чтобы иметь новые идентификаторы sha, изменения, вносимые каждым коммитом, остаются прежними. - person ; 13.10.2015
comment
привет .. спасибо, попытался перефразировать мой ответ, чтобы отразить, что все еще можно удалить изменения, сделанные в C, но не получить тот же идентификатор sha для E - person mariux; 13.10.2015