Git: Как сделать сброс после слияния? - PullRequest
6 голосов
/ 24 августа 2010

Я слил главную ветку из хранилища друга в мой рабочий каталог в branch_a, используя:

git pull my_friend master

Я обнаружил, что в объединенной версии есть ошибки. Чтобы продолжить разработку, я хотел бы вернуться к моему последнему коммиту перед слиянием.
Я попробовал:

git reset --hard HEAD

Но это вернуло меня в состояние сразу после слияния. (Команда pull команды commit?!)
Я также попробовал:

git revert HEAD

но получил следующую ошибку:

роковой: совершить 2d72d8f367b987d8c16f5cb1a543a6886acdcf83 это слияние, но опция -m не указана.

Что мне делать?

Ответы [ 3 ]

25 голосов
/ 24 августа 2010

HEAD относится к текущему коммиту (как правило, к концу текущей извлеченной ветки).Вы уже совершили слияние, поэтому HEAD указывает на коммит слияния.Если вы хотите вернуться к коммиту до него, используйте:

git reset --hard HEAD^

^ означает «первый родительский элемент»;для обычного коммита это единственный родитель, а для коммита слияния это коммит, который вы извлекли при слиянии (т. е. предыдущий совет ветви, в которую вы слились).

И, конечно, если вычтобы действительно потеряться, просто откройте gitk и либо скопируйте / вставьте SHA1 коммита, в который вы хотите сбросить (git reset --hard SHA1), либо просто щелкните правой кнопкой мыши по нему и выполните сброс в gitk.

Кстати, revert не означает, что вы думаете, что он делает (звучит так, будто вы используете его в SVN, может быть? Но я никогда не использовал SVN).git revert используется для создания коммита, который отменяет (отменяет) предыдущий коммит, применяя обратный дифференциал.Вы используете его, когда хотите отменить один предыдущий коммит, который уже был опубликован.

2 голосов
/ 24 августа 2010

делает команду pull команды commit?

Да, это так.Pull - это обертка над fetch и merge.Если вы хотите увидеть изменения других до слияния, вы можете просто fetch

2 голосов
/ 24 августа 2010

После извлечения HEAD было перенесено в последний коммит, который представляет собой коммит слияния, объединяющий две ветви, а не коммит, над которым вы работали в последний раз. Вот почему reset HEAD ничего не изменит.

revert HEAD тоже не то, что вы хотите сделать, потому что он пытается создать новый коммит, возвращая изменения коммита слияния. (Вот почему вы видите ошибку; вы не можете отменить коммит слияния, не сообщив git, к какому из двух родительских коммитов вы хотите вернуться.)

Я думаю, что вы хотите:

git reset [--hard] HEAD^

, который будет сброшен до коммита до коммита слияния.

...