Git тягнеться в неправильну гілку


74

Я та ще один розробник об’єднували та підштовхували нашу роботу до непрофільної галузі, яка називається інструментальна робота. Таким чином, ми не вплинули на решту команди. Моя гілка теми називалася 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

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

Чи є спосіб повернути це державі до виходу?

Відповіді:


104
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 ще.


Чи можна було б це використовувати git rebase -i ORIG_HEADдля видалення небажаних комітів, якщо припустимо, що ніхто ще не відмовився від майстра?
unutbu

@unutbu: Я вважаю, що кінцевий результат такого перебазування буде схожий на результат git resetу цьому випадку.
VonC

Дякую, @VonC. Вибачте за дурне запитання. Якось я не зрозумів, що git reset --hardне тільки змінює робоче дерево та індекс, але й видаляє батьківський покажчик у DAG.
unutbu

82

Скиньте головну гілку:

git reset --hard origin/master

11
Не впевнений, що це пов’язано з “правильною” відповіддю, коли мені було 2 роки, але після спроби інших пропозицій, не маючи удачі, це те, що мені вдалося.
Леві Розоль

5
це вирішило у мене проблему, яка полягає в тому, що я потрапив не в ту гілку
HorseloverFat

2
Працював у мене. Дякую
Глен

9

Ви можете використовувати, git logщоб знайти SHA-1 ревізії, яку ви хочете бути на чолі вашої toolworkгілки, а потім використати git reset --hard <SHA1>для повернення робочої копії до цієї версії.

Спершу все зробіть резервну копію! І перечитайте сторінку довідки, git resetщоб переконатися, що вона робить те, що ви хочете.

EDIT: Так, ORIG_HEAD повинен містити правильний SHA-1. Але перевірте спочатку.


Спочатку не бачив, як ти відповів. git resetмає рацію (хоча і трохи небезпечний, як ви справедливо згадуєте). +1
VonC

Віддайте перевагу цій відповіді, оскільки ви чіткіше говорите про те, до якого коміту ви хочете повернутися. У моєму випадку це було корисно, оскільки у мене було кілька локальних комітів до того, як я випадково витягнув неправильну гілку, тому я не хотів робити жорстке скидання до ORIG_HEAD.
Джозеф Хамфрі,

5

Нещодавно я робив подібне, і використовував більш просте рішення на основі цієї відповіді .

Якщо припустити , що стан toolworkгалузі , що ви хочете , щоб повернутися до була відсунута до origin, ви можете просто зробити

git fetch origin
git reset --hard origin/toolwork

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


0

Що працювало у мене просто

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

0

Ви можете перервати злиття за допомогою команди нижче

git merge --abort

Це просто скасує випадкове потяг ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.