Как мне вернуть основную ветку к тегу в git?

89

У нас есть отрасли зарождения и развития. Было отмечено начальное состояние мастера tag_ABC.

У нас есть несколько изменений, внесенных в ветку разработки и перенесенных в origin. Затем мы случайно слили разработку в мастер и отправили в origin.

Теперь мы хотим вернуть мастера на контрольную точку tag_ABC. Как мы можем сделать это?

Манджунатх Манохаран
источник

Ответы:

161

Ты можешь сделать

git checkout master
git reset --hard tag_ABC
git push --force origin master

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

Павел Оброк
источник
5
Таким образом, все ветви будут с силой толкаться. Вы можете попробоватьgit push --force origin master
danza
1
Для справки, чтобы вернуться к предыдущей фиксации, вы можете сделатьgit reset --hard HEAD^
Джефф
1
BTW git reset --hard HEAD^можно использовать несколько раз, чтобы сделать шаг назад по одной фиксации за раз, а затем, если он удален, git push --force origin masterможно использовать.
Люк Венке,
Также, чтобы сбросить главную ветку локальных копий других людей на использование более ранней версии git pullиgit reset --hard origin/master
Люк Венке
Небольшой совет после этого отката, можно сказать команде: тянуть из основной ветки !! Благодарность!!
JRichardsz
89

Это не прямой ответ на вопрос, но эта страница возвращается при поиске способов вернуть код ветки к выпуску тега.

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

Предположим, что ваша ветка называется master, а тег, к которому вы хотите вернуться, называется 1.1.1.

git checkout 1.1.1
git diff master > ~/diff.patch
git checkout master
cat ~/diff.patch | git apply
git commit -am 'Rolled back to version 1.1.1'
git push origin master
Джон
источник
19
Это должен быть принятый ответ, поскольку он сохраняет историю нетронутой и не вызывает проблем для других, у которых было проверено репо.
OpenUserX03
1
Это кажется элегантным. Но я попытался вернуть ветку qa к предыдущему тегу и получил сообщения об ошибке исправления. $ cat ../diff_qa.patch | git apply <stdin>: 55: завершающий пробел. <stdin>: 336: завершающий пробел. <stdin>: 12692: завершающий пробел. <stdin>: 12695: завершающий пробел. <li> {{$ tag ['rank'] + 1}}: <stdin>: 12706: завершающий пробел. ошибка: патч не удался: .env.wholo: 1
rickatech
Я пробовал несколько решений, но ни одно из них не сработало. Этот работал как шарм. Большое спасибо @John
Strabek
Это правильный способ сделать. Он неразрушающий и сохраняет полную историю
Нитин Бансал
У меня это не работает. Я могу запустить первые 3 команды без каких-либо проблем, но когда я это сделаю cat ~/diff.patch | git apply, это скажет мне error: unrecognized input. Любая идея? @NitinBansal, возможно, так как вы недавно прокомментировали?
Experience111,