#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
или явный хэш. В любом случае, отличный ответ, поддержанный.