Удалить предыдущую фиксацию из локальной и удаленной ветви

#git

#git

Вопрос:

У меня есть несколько коммитов в моей ветке, скажем, commit A commit B commit C commit D commit E

Я должен удалить фиксацию D и сохранить фиксацию A, B, C как есть. Эти коммиты уже отправлены в удаленную ветку.

Я пробовал sol1, но это не позволяло мне принудительно отправлять мои изменения в удаленную ветку.

Я не хочу выполнять сброс git для коммитов A, B и C и хочу сохранить их как есть.

Как это можно сделать?

Комментарии:

1. Вам не нужно принудительно нажимать при возврате. В этом суть: не изменять историю.

2. Вам нужно только принудительно нажимать при перебазировании или сбросе

3. Кроме того, вы не упомянули, нужно ли вам сохранить E или отказаться от него.

4. Я хочу сохранить фиксацию E неповрежденной.

Ответ №1:

Есть два способа удалить D изменения, сохранив A , B C и E изменения.

Один из них — вернуться D .

 git revert HEAD^
git push
  

Это создаст новую фиксацию ~D после E . Поскольку он не изменяет историю, он не требует принудительного нажатия, что устраняет то, что, по вашим словам, остановило вас в вашей предыдущей попытке решения. Это означает, что в истории будут отображаться изменения из D и их отмена; некоторым людям это не нравится, но вам, возможно, придется спросить себя, можете ли вы позволить себе это тщеславие.

Вы можете узнать больше о возврате здесь:https://git-scm.com/docs/git-revert

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

Дело в том, что может показаться, что существует множество решений для физического удаления D — перебазирование, сброс, выбор вишни, возможно, даже фильтрация ветви… Но все они сводятся к одному и тому же. Если в конце обработки вы хотите, D чтобы того, что ранее было в истории ветки, больше не было в истории ветки, то вы пытаетесь переписать историю и нужно иметь возможность принудительно нажимать. Итак, если не удалось выполнить принудительное нажатие, т. Е. Если вы достигли состояния, при котором локально у вас есть

 A -- B -- C -- E'
  

и вы просто не можете отправить это на удаленный сервер — тогда нет смысла искать другие методы перезаписи истории; все они завершатся шагом «принудительное нажатие на удаленный сервер».

Итак, в этом случае единственным оставшимся вариантом является git revert .

Комментарии:

1.Для OP или других, у кого могут возникнуть сомнения по этому поводу: HEAD^ нацелен на родительский элемент последней фиксации в текущей извлеченной ветке. Мы могли бы также явно указать его хэш git revert abcd1234 . Итак, если, допустим, вы сделали еще одну фиксацию F поверх E до того, как увидели этот ответ, HEAD^ будет указывать на E вместо D , поэтому вам нужно использовать HEAD~2 или явный хэш. В любом случае, отличный ответ, поддержанный.