Если вы объединяете одну ветку с другой и по какой-то причине решаете, что хотите отменить слияние, есть несколько способов сделать это с помощью Git.
Решение этой проблемы проще, если вы еще не отправили изменения в
удаленное репо, и если вы это сделали, вам, вероятно, придется
полагаться на что-то вроде git revert
вместо решения, предложенного
ниже. В этой короткой статье я объясню, как можно отменить слияние Git,
которое еще не было запущено.
Первым шагом будет использование reflog
для поиска фиксации прямо
перед слиянием:
$ git reflog
Выполнение этого в вашем репо вернет список последних коммитов, включая
их сокращенные хэши, расстояние от HEAD
и описание. Это будет
выглядеть примерно так:
$ git reflog
8135d07 [email protected] {0}: commit (merge): Merge branch local/bug-34 into local/master
03979c8 [email protected] {1}: commit: Added support for query params
9f7a993 [email protected] {2}: commit (initial): Initial commit
Как только вы найдете фиксацию, к которой хотите вернуться, используйте
команду reset
, аналогичную тому, что мы делали при возврате к
предыдущей фиксации , что по сути
то, что мы делаем здесь:
$ git reset --hard <commit-hash>
Итак, в приведенном выше примере мы могли бы захотеть вернуться к фиксации с сообщением «Добавлена поддержка параметров запроса», что мы бы сделали следующим образом:
$ git reset --hard 03979c8
Параметр --hard
вернет код в древовидной, промежуточной и рабочей
копиях. Если вы не хотите потерять какие-либо локальные изменения,
которые вы сделали, то --merge
или --mixed
могут быть лучшими
вариантами для вас.
Если фиксация, к которой вы хотите вернуться, находится только одна за
HEAD
, вы можете вместо этого использовать ORIG_HEAD
в качестве
ярлыка в команде reset
:
$ git reset --hard ORIG_HEAD
В некоторых случаях это будет проще, так как вам не придется
использовать reflog
для поиска хэша фиксации. ORIG_HEAD
примерно
эквивалентен [email protected] {1}
, поэтому используйте его только в
том случае, если вы хотите отменить одну фиксацию.
Примечание : после того, как вы отправили изменения в удаленное
репо, не рекомендуется возвращать коммиты таким образом, поскольку вы
стираете историю. В этом случае я бы рекомендовал использовать команду
git revert
, которая отменит нежелательные изменения как отдельную
фиксацию.