Git втянуть в неправильную ветку
Сам я и еще один разработчик сливались и подталкивали нашу работу к не-мастер-ветки, называемой инструментальной. Таким образом, мы не повлияли на остальную часть команды. Моя ветка темы называлась DPM-93, и мой рабочий процесс git был таким.
# do some work
git checkout DPM-93
git commit -m "did some work"
# catch up
git checkout toolwork
git pull origin toolwork
# rebase my topic branch
git checkout DPM-93
git rebase toolwork
# merge and push my changes
git checkout toolwork
git merge --no-ff DPM-93
git push origin toolwork
Это в основном работало нормально, пока я случайно не выпустил эти команды git
git checkout toolwork
git pull origin master
В этот момент в инструменте для веток появилось множество новых вещей, и я не уверен, как избавиться от него, не удалив мое рабочее пространство и повторное клонирование из репо.
Есть ли способ вернуть это состояние в состояние до вытягивания?
Ответы
Ответ 1
git reset --hard ORIG_HEAD
Из git reset
справочная страница (если вы только что нажали):
Отменить слияние или вытащить
$ git pull (1)
Auto-merging nitfol
CONFLICT (content): Merge conflict in nitfol
Automatic merge failed; fix conflicts and then commit the result.
$ git reset --hard (2)
$ git pull . topic/branch (3)
Updating from 41223... to 13134...
Fast-forward
$ git reset --hard ORIG_HEAD (4)
- Попробуйте обновить с восходящего потока, что привело к множеству конфликтов; вы не были готовы тратить много времени на слияние прямо сейчас, поэтому вы решили сделать это позже.
- "
pull
" не выполнил слияние, поэтому "git reset --hard
", который является синонимом "git reset --hard HEAD
", очищает беспорядок от индексного файла и рабочего дерева. - Объединить ветвь темы в текущую ветку, что привело к быстрой перемотке вперед.
- Но вы решили, что ветвь темы еще не готова для общественного потребления.
"pull" или "merge" всегда оставляет исходный кончик текущей ветки в ORIG_HEAD
, поэтому перезагрузка жестко привязывает ваш индексный файл и рабочее дерево к этому состоянию и сбрасывает подсказку от ветки до этой фиксации.
Подробнее см. HEAD
и ORIG_HEAD
.
Ответ 2
Reset главная ветвь:
git reset --hard origin/master
Ответ 3
Вы можете использовать git log
, чтобы найти SHA-1 ревизии, которую хотите возглавить ветки toolwork
, затем используйте git reset --hard <SHA1>
, чтобы вернуть рабочую копию в эту ревизию.
Запустите все сначала! И перечитайте страницу руководства для git reset
, чтобы убедиться, что она делает то, что вы хотите.
EDIT: О да, ORIG_HEAD должен содержать правильный SHA-1. Но сначала проверьте.
Ответ 4
Недавно я сделал аналогичную вещь и использовал более простое решение на основе этого ответа.
Предполагая, что состояние ветки toolwork
, которую вы хотите вернуть в , было нажато на origin
, вы можете просто сделать
git fetch origin
git reset --hard origin/toolwork
В моем случае значение ORIG_HEAD
было перезаписано другим слиянием в другой ветке, и для этого мне не пришлось беспокоиться о поиске правильной фиксации в журнале.