Git тянуть в неправильную ветку - PullRequest
62 голосов
/ 22 октября 2010

Я и еще один разработчик объединили и перенесли нашу работу в неосновную ветвь, которая называется toolwork.Таким образом, мы не повлияли на остальную часть команды.Моя ветка темы называлась 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

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

Есть ли способ вернуть это всостояние до тяги?

Ответы [ 5 ]

92 голосов
/ 22 октября 2010
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)
  1. Попытка обновления из апстрима привела к множеству конфликтов; Вы не были готовы потратить много времени на слияние прямо сейчас, поэтому вы решили сделать это позже.
  2. "pull" не сделал коммит слияния, поэтому "git reset --hard", который является синонимом "git reset --hard HEAD", удаляет беспорядок из файла индекса и рабочего дерева.
  3. Слияние тематической ветви с текущей веткой, что привело к ускоренной перемотке вперед.
  4. Но вы решили, что ветка темы еще не готова к публичному потреблению.
    "pull" или "merge" всегда оставляют исходный наконечник текущей ветви в ORIG_HEAD, поэтому при его жестком сбросе файл индекса и рабочее дерево возвращаются в это состояние и сбрасывает наконечник ветвь этого коммита.

Подробнее см. HEAD и ORIG_HEAD.

65 голосов
/ 23 сентября 2011

Сброс главной ветки:

git reset --hard origin/master
9 голосов
/ 22 октября 2010

Вы можете использовать git log, чтобы найти SHA-1 ревизии, которой хотите быть в начале ветки toolwork, а затем использовать git reset --hard <SHA1>, чтобы вернуть рабочую копию этой ревизии.

Сначала сделайте резервную копию! И перечитайте справочную страницу для git reset, чтобы убедиться, что она делает то, что вам нужно.

РЕДАКТИРОВАТЬ: Да, ORIG_HEAD должен содержать правильный SHA-1. Но проверь сначала.

4 голосов
/ 23 ноября 2015

Недавно я сделал подобное и использовал более простое решение на основе этого ответа .

Предполагая, что состояние ветви toolwork, которую вы хотите вернуть в , было переведено в origin, вы можете просто сделать

git fetch origin
git reset --hard origin/toolwork

В моем случае значение ORIG_HEAD было перезаписано другим слиянием в другой ветви, и при этом мне не пришлось беспокоиться о поиске правильного коммита в журнале.

0 голосов
/ 16 мая 2018

То, что у меня сработало, это просто

git reset --hard

Я сделал это из локального репозитория с неудачным слиянием / извлечением:

Laptop@LAPTOP-xxxxxxxx /d/Google Drive/xxxxxxx/Github/xxxxx (staging_ec2|MERGING)
$ git reset --hard
HEAD is now at 2d5a511 [last commit comment]

Laptop@LAPTOP-xxxxxxxx /d/Google Drive/xxxxxxx/Github/xxxxx (staging_ec2)
$
...