2010-08-24 5 views
6

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

git pull my_friend master 

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

git reset --hard HEAD 

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

git revert HEAD 

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

fatal: Commit 2d72d8f367b987d8c16f5cb1a543a6886acdcf83 is a merge but no -m option was given.

Что я должен делать?

+0

Я изменил 'revert' на 'reset' в вашем названии, потому что сброс - это то, чего вы пытались достичь. –

ответ

23

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

git reset --hard HEAD^ 

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

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

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

+0

Для людей, которые не хотят выполнять жесткий сброс, как говорит @Jefromi, используйте 'git revert' для« отмены »последнего коммита, оставив историю обоих событий. Для получения дополнительной информации о 'git revert' посмотрите: [этот ответ] (http://stackoverflow.com/a/5971281/1185053) –

2

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

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

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

git reset [--hard] HEAD^ 

, который сбрасывается на фиксацию до слияние.

2

does pull command commit?

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

Смежные вопросы