Я совершил и нажал ветку. Теперь я решил отменить последние два коммита, я знаю, что могу сделать git reset --hard HEAD~2
, и я просто сделал это. Теперь в моей локальной ветке коммиты на два шага назад. Но как я могу отправить это в удаленную ветку? Я имею в виду, как я могу сделать так, чтобы удаленная ветка также была на 2 коммита?
Причина, по которой я спрашиваю, заключается в том, что после локального возврата я изменил код и зафиксировал. Когда я нажимаю на удаленное репо, я получаю ошибку отклонения:
Updates were rejected because the tip of your current branch is behind
==== ОБНОВЛЕНИЕ ====
Я попробовал ответ @Tim Biegeleisen, git revert --no-commit HEAD~5..
но получил ошибку:
error: commit d7f37d67f8dbdaecc534c06316b7417657e527 is a merge but no -m option was given. fatal: revert failed
И удаленная ветвь показывает, что последняя фиксация - это «ветвь слияния« foo »..."
git push
не работает?
@niCkcAMel это должно быть нет, если только OP не вынуждает это, поскольку история была переписана.
@RomainValeri имеет смысл.
Если вы сделаете обычный git push
, он, вероятно, скажет вам, что вы отстали и что вам нужно синхронизироваться, но если вы сделаете git push --force
, он обновит удаленную ветку до предыдущего коммита.
Я бы не советовал делать сброс.
Самый безопасный способ - сделать возврат, например:
git revert enter-your-commit-id-here
А потом смело нажимаем на пульт.
Вернется ли он до идентификатора фиксации или вернет фиксацию идентификатора фиксации в команде?
@Leem Это использование вернет только 1 коммит, поэтому его нужно будет запустить 2 раза. Для вопроса лучше использовать ответ Тима, это относится к более общему случаю.
Спасибо, я обновил свой вопрос. Не могли бы вы взглянуть?
Конечно, а как насчет git revert master~2..master
?
Должен ли я изменить master
на название ветки, которую я использую? и если я хочу вернуть 5 шагов, должен ли я использовать 5 вместо 2?
Да, проверял и пытался, но git не создал нового коммита для тех возвратов, которые я до сих пор не понимаю, как обновить удаленную ветку, чтобы она была такой же, как локальная возвращенная версия.
Учитывая, что ваша ветка является общедоступной и общедоступной, вам, вероятно, следует нет выполнить полную перезагрузку, чтобы фактически удалить первые 2 коммита. Вместо этого используйте git revert
:
git revert master~2..master
или, может быть
git revert --no-commit HEAD~2..
Это добавит новый коммит поверх HEAD
вашей ветки master
, что функционально отменит текущие 2 верхних коммита. Обратите внимание, что эти коммиты все еще будут там, а это означает, что любой, кто потянет, просто получит новый коммит.
Редактировать:
Судя по вашему комментарию и сообщению об ошибке, один из двух коммитов является фиксацией слияния. Это означает, что вам нужно будет указать Git, за каким из двух родителей следовать при откате. Я не знаю, как сделать это в одной команде с диапазоном коммитов, но мы можем попробовать сделать два отдельных возврата. Предполагая, что HEAD указывает на фиксацию слияния:
git revert -m 1 abc123 # or use -m 2 to follow the other parent
Здесь abc123
— хэш SHA-1 коммита HEAD, который вы можете найти с помощью git log
. Затем выполните второй возврат для второго коммита:
git revert xyz345
Попробовал 2-ю команду, теперь получаю error: commit d7f37d67f8dbdaecc534c06316b7417657e527 is a merge but no -m option was given. fatal: revert failed
@Leem Похоже, у вас есть одна или несколько коммитов слияния. Это усложняет ситуацию, см. мой обновленный ответ.
что такое xyz345 в вашем примере? Скажем, теперь мне нужно вернуть 5 коммитов назад. Верхний коммит — это слияние
Затем верните фиксацию слияния, а затем git revert master~6..master~2
Теперь я git возвращаю коммиты один за другим с помощью команды git revert <hash>
, но поверх головы не добавляется новый коммит, и мне нечего нажимать на удаленный. Вопрос по-прежнему актуален: как я могу обновить удаленную ветку, чтобы она была такой же, как возвращенная локальная ветка.
Я не знаю, что вы сделали, но если коммитов возврата не появляется, значит, вы сделали что-то не так.
Оказывается, даже несмотря на то, что эти возвраты не создают новую фиксацию, но после того, как я git push origin my-branch-name, он обновляет удаленную ветку до восстановленной версии.
Я действительно сделал именно то, что предложил ваш ответ. Для других людей, сталкивающихся с той же проблемой: этот ответ решает проблему, но коммиты возврата не отображаются (по крайней мере, для меня). Я просто нажимаю ветку после возврата, она работает.
Вы один в этом репозитории? Или поделиться им с кем-нибудь?