Git потянет не в ту ветку

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

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

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


person milkplus    schedule 22.10.2010    source источник


Ответы (7)


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.

person VonC    schedule 22.10.2010
comment
Можно ли использовать git rebase -i ORIG_HEAD для удаления нежелательных коммитов, при условии, что никто еще не извлек из мастера? - person unutbu; 22.10.2010
comment
@unutbu: Я считаю, что конечный результат такой перебазировки будет аналогичен git reset в этом случае. - person VonC; 22.10.2010
comment
Спасибо, @VonC. Простите за глупый вопрос. Почему-то я не осознавал, что git reset --hard не только изменяет рабочее дерево и индекс, но также удаляет родительский указатель в DAG. - person unutbu; 23.10.2010

Сбросить главную ветку:

git reset --hard origin/master
person HoBa    schedule 22.09.2011
comment
Не уверен, что это связано с тем, что правильному ответу было 2 года, но после неудачной попытки других предложений это то, что сработало для меня. - person Levi Rosol; 28.06.2012
comment
это решило мою проблему, которая заключалась в том, что я зашел не в ту ветку - person HorseloverFat; 04.12.2013
comment
Работал у меня. Спасибо - person Glen; 06.01.2016
comment
Спасибо друг! работал как шарм - person HV Sharma; 19.02.2021
comment
у меня работал, спасибо !! - person James Kuta Simiyu; 09.07.2021
comment
Сработало у меня, спасибо - person Preet; 16.07.2021

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

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

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

person Cameron Skinner    schedule 22.10.2010
comment
Сначала не видел твоего ответа. git reset прав (хотя и немного опасен, как вы правильно заметили). +1 - person VonC; 22.10.2010
comment
Предпочтите этот ответ, поскольку вы более четко указываете, к какой фиксации вы хотите вернуться. В моем случае это было полезно, так как у меня было несколько локальных коммитов до того, как я случайно вытащил не ту ветку, поэтому я не хотел делать полный сброс ORIG_HEAD. - person Joseph Humfrey; 08.04.2012

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

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

git fetch origin
git reset --hard origin/toolwork

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

person zelanix    schedule 23.11.2015

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

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)
$
person ssaltman    schedule 16.05.2018

Шаг 1:

git log

git reset --hard <hash>, 
  

Хеш-это что-то вроде 0928817nsbn78867hs3g5666

Пример: если вы git log, вы получите:

commit 0928817nsbn78867hs3g5666 (HEAD -> yourrepo, origin/yourrepo)

Шаг 2:

git reset --hard 0928817nsbn78867hs3g5666

person Mercy Jemosop    schedule 15.04.2021

Вы можете прервать это слияние, используя команду ниже

git merge --abort

Это просто отменит случайное нажатие ...

person Abdul Yasin    schedule 25.03.2020