Подтвердить что ты не робот

Откат в Git

Я совершил и нажал несколько патчей: A1 → A2 → A3 → A4 (HEAD)

Все эти изменения вносили в свою локальную копию.

Теперь мы хотим "откат" до A2 и продолжаем развиваться оттуда - по существу выбрасываем A3 и A4. Какой лучший способ сделать это?

4b9b3361

Ответ 1

Из корневого каталога вашей рабочей копии просто

git checkout A2 -- .  
git commit -m 'going back to A2'

Использование git revert для этой цели было бы громоздким, так как вы хотите избавиться от целой серии коммитов и revert отменить их по одному.

Вы не хотите git reset. Это просто изменит ваш указатель ветки master: вы остаетесь без записи ошибочного направления. Также больно координировать: поскольку фиксация, которую вы изменили master, не является дочерним элементом указателя ветвления удаленных репозиториев master, нажатие будет неудачно - если вы не добавите -f (force) или не удалите master сначала откройте в удаленном репозитории и заново создайте его, нажав. Но тогда все, кто пытается потянуть, по-прежнему будут иметь старую историю в своей локальной ветке master, поэтому раз расходятся origin/master, git pull попытается выполнить слияние. Это не конец света: они могут выйти из этой ситуации, выполнив git rebase --onto origin/master $old_origin_master_commit master (например, переустановите свои локальные коммиты, сделанные поверх старого origin/master, в верхней части нового origin/master). Но Git не будет знать, чтобы сделать это автоматически, поэтому вам нужно координировать работу с каждым сотрудником. Короче говоря, не делайте этого.

Ответ 2

Отбрасывание этих коммитов, скорее всего, будет иметь некоторые негативные последствия для всех, кто вытаскивает из вашего репозитория. В качестве другого варианта вы можете захотеть создать альтернативную ветвь разработки, начиная с A2:

A1-->A2-->A3-->A4 (master/HEAD)
      \
       -->B1-->B2 (new-master/HEAD)

Выполнение этого так же просто, как

git branch new-master master~2

Ответ 3

Вы хотите git-revert и git-reset в зависимости от того, как вы хотите лечить A3 и A4. Чтобы удалить все следы A3 и A4, используйте git-reset --hard. Чтобы сохранить A3 и A4 и записать факт, что вы возвращаетесь, используйте git-revert.

edit. Решение Aristotle Pagaltzis git-checkout превосходно, хотя для небольших ревертов я не вижу проблемы с git-revert. Тем не менее, я прошу, чтобы будущие варианты были отданы Ответ Аристотеля Пагальциса

Я нашел git magic, чтобы быть хорошим ресурсом для git.