Git: удалить предыдущую фиксацию, но сохранить последние изменения

В моем репозитории я получил некоторые коммиты:

like:

A - Added Feature A
B - Removed Feature B
C - Redesigned Feature C
D - Added Feature D
E - Added Feature D

Где E - последнее совершение, которое я сделал. Теперь я хочу избавиться от изменений, внесенных мной с помощью функции C, но хочу сохранить изменения, добавленные с помощью D и E.

Надеюсь, ты поможешь мне.

Спасибо

Ответ 1

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

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

git revert - это инструмент, используемый для создания таких злых близнецов набора коммитов.

Ответ 2

Интерактивная перезагрузка - ваш друг!

Как говорили другие:

$ git rebase -i HEAD~5

... где -i - это интерактивный флаг, а HEAD~5 означает включение последних 5 коммиттов в интерактивную rebase.

Когда вы получите редактор в результате выдачи выше, посмотрите комментарий в открывшемся файле:

# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

Ключевой бит для вас - Если вы удалите строку здесь, то КОМИТЕТ БУДЕТ ПОТЕРЯТЬ.

Итак, удалите строки, которые ссылаются на коммиты, от которых вы хотите избавиться, сохраните и закройте, а git обработает все остальное (возможно, вам придется исправить некоторые конфликты в зависимости от характера фиксации и вернуть вас пытаюсь удалить).

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

Ответ 3

Если у вас есть только локальные изменения, вы, вероятно, лучше всего следуете перезагружающему ответу. Если вы опубликовали изменения где угодно, то вы не хотите переустанавливать, потому что это изменит историю, что означает, что все остальные также должны будут пересобираться, или вы снова получите свое оскорбительное соглашение.

Если у других людей есть свои коммиты, самое чистое дело в том, чтобы отменить оскорбительные изменения, а не полностью его урезать. Используйте git revert COMMIT_ID, чтобы создать новый коммит, который отменяет изменения, внесенные вами в COMMIT_ID.

Ответ 5

выполните следующие действия:

git rebase -i HEAD~3

затем переместите фиксацию C первым в нижней части, у вас будет

D - Added Feature D
E - Added Feature D
C - Redesigned Feature C

вы сохраняете и выходите, затем

git reset HEAD^

это отменит фиксацию C.

Ответ 6

git reabse -i HEAD~3

у вас будет список ваших 3 последних сообщений фиксации

C - Redesigned Feature C
D - Added Feature D
E - Added Feature D

вы просто вставляете x git reset HEAD ^ перед фиксацией, которую хотите отменить, вы хотите отменить фиксацию C, так что это будет как

    C - Redesigned Feature C
x git reset HEAD^
    D - Added Feature D
    E - Added Feature D

выйдите из консоли rebase, вы увидите, что ваша фиксация больше не находится в журнале и их файлы поставлены.

Ответ 7

Если вы используете TortoiseGit в Windows, вы можете щелкнуть правой кнопкой мыши по папке Git, затем нажмите TortoiseGit > Show log. Вы можете просмотреть все сделанные ранее коммиты, а затем проверить фиксацию, на которую хотите вернуться.

Нажмите на фиксацию, и вы можете увидеть измененные файлы ниже. Щелкните правой кнопкой мыши файлы, которые нужно вернуть, затем нажмите revert to parent revision.

Как вернуть фиксации