Git: использовать отменить или оформить заказ, чтобы отменить внесенные изменения? - PullRequest
5 голосов
/ 27 января 2011

Git - это феноменальный инструмент, но мне еще не пришло в голову найти лучший способ отменить внесенные изменения.Вот ситуация.

Я на ветке и отправил несколько коммитов на GitHub.С тех пор было решено, что я зашел слишком далеко по кроличьей норе, и нам нужно отменить несколько коммитов, которые я сделал, и начать все сначала.По сути, мне нужно отменить все выдвинутые коммиты, вернуться к предыдущему.Вот две команды, которые я считаю подходящими

git revert  # - creates a new commit that "undoes" the changes of one specific commit
git checkout 'commit SHA' # - sets the head to that specific commit, wherein I will re-push to the repo, undoing my changes... I think

Итак, я прав?Нужно ли мне делать git checkout для конкретного коммита, к которому я хочу вернуться?Или в этом запутанном процессе есть что-то, чего я не понимаю?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 27 января 2011

В зависимости от того, что вы нажали, есть два сценария:

  • Никто еще нигде не использовал выдвинутую ветвь. В этом случае вы можете использовать git reset, чтобы принудить локальную ветвь к определенной фиксации, а затем вы можете git push ветвь с параметром --force.

  • Если, однако, есть кто-то, кто основал свою работу на ветке, которую вы случайно нажали, вы не сможете сбросить ее, так как он будет основывать свои изменения на ветке в подвешенном состоянии. Здесь git revert вступает в игру. Он будет записывать обратный патч, эффективно отменяя предыдущие изменения. Преимущество здесь в том, что другие могут с легкостью основывать свою работу на ветке.

Выбор метода зависит от того, каков ваш репозиторий и как долго случайные патчи были там. Если разработчиков немного, общение и reset, вероятно, ответ. Но если бы эта вещь прожила долгое время, вероятно, ее лучше вернуть - если только вы не хотите переписать всю историю!

Другой способ взглянуть на это так: git revert настойчив, тогда как git reset / git push --force - разрушительное переписывание истории. Для обоих есть подходящее время.

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

0 голосов
/ 27 января 2011

Как правильно заметил Хория, вам нужно выполнить git reset.

Git checkout означает, что вы переключаетесь на другую ветку или с помощью checkout -b вы можете создать новую ветку и сразу перейти к ней.

0 голосов
/ 27 января 2011

Попробуйте git reset: http://git -scm.com / docs / git-reset

...