В зависимости от того, что вы нажали, есть два сценария:
Никто еще нигде не использовал выдвинутую ветвь. В этом случае вы можете использовать git reset
, чтобы принудить локальную ветвь к определенной фиксации, а затем вы можете git push
ветвь с параметром --force
.
Если, однако, есть кто-то, кто основал свою работу на ветке, которую вы случайно нажали, вы не сможете сбросить ее, так как он будет основывать свои изменения на ветке в подвешенном состоянии. Здесь git revert
вступает в игру. Он будет записывать обратный патч, эффективно отменяя предыдущие изменения. Преимущество здесь в том, что другие могут с легкостью основывать свою работу на ветке.
Выбор метода зависит от того, каков ваш репозиторий и как долго случайные патчи были там. Если разработчиков немного, общение и reset
, вероятно, ответ. Но если бы эта вещь прожила долгое время, вероятно, ее лучше вернуть - если только вы не хотите переписать всю историю!
Другой способ взглянуть на это так: git revert
настойчив, тогда как git reset / git push --force
- разрушительное переписывание истории. Для обоих есть подходящее время.
Наконец, когда я хочу следовать за Алисой по Кроличьей норе и исследовать, что находится за ее пределами, я обычно делаю это на локально созданных ветвях. Затем, если мне нравятся изменения, я обычно объединяю их в тестовую ветвь и позволяю им немного перемешаться в тестовой ветке, прежде чем объединить их с master
. Таким образом, вы избежите проблемы большую часть времени. Короче говоря, у меня часто есть 20-30 местных отделений, по одному на каждую функцию, над которой я работаю. Они, как правило, сначала проходят индивидуальное тестирование. Иногда я создаю новую ветку test
и объединяю все в эту ветку и выполняю все тесты вместе. Для отслеживания конфликтов между филиалами я использую git rerere
. Преимущество состоит в том, что я могу решить, когда функция достаточно стабильна, чтобы передавать ее другим.