Git тянет в неправильную ветку


Я и еще один разработчик объединяли и продвигали нашу работу в не-мастерскую ветку под названием toolwork. Таким образом, мы не повлияли на остальную часть команды. Моя тема ветки называлась ДПМ-93 и моей работы ЖКТ это.

# 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

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

есть ли способ вернуть это состояние, прежде чем тянуть?

5 57

5 ответов:

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, поэтому сброс hard к нему возвращает ваш индексный файл и рабочее дерево обратно в это состояние и сбрасывает кончик ветви до этого фиксации.

посмотреть HEAD и ORIG_HEAD дополнительные.

сбрасывать ветку master:

git reset --hard origin/master

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

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

EDIT: О да, ORIG_HEAD должен содержать правильный SHA-1. Но сначала проверь.

недавно я сделал аналогичную вещь и использовал более простое решение, основанное на ответ.

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

git fetch origin
git reset --hard origin/toolwork

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

то, что сработало для меня просто

git reset --hard

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

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)
$