Я совершил и нажал несколько патчей: A1 → A2 → A3 → A4 (HEAD)
Все эти изменения вносили в свою локальную копию.
Теперь мы хотим "откат" до A2 и продолжаем развиваться оттуда - по существу выбрасываем A3 и A4. Какой лучший способ сделать это?
Я совершил и нажал несколько патчей: A1 → A2 → A3 → A4 (HEAD)
Все эти изменения вносили в свою локальную копию.
Теперь мы хотим "откат" до A2 и продолжаем развиваться оттуда - по существу выбрасываем A3 и A4. Какой лучший способ сделать это?
Из корневого каталога вашей рабочей копии просто
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 не будет знать, чтобы сделать это автоматически, поэтому вам нужно координировать работу с каждым сотрудником. Короче говоря, не делайте этого.
Отбрасывание этих коммитов, скорее всего, будет иметь некоторые негативные последствия для всех, кто вытаскивает из вашего репозитория. В качестве другого варианта вы можете захотеть создать альтернативную ветвь разработки, начиная с A2:
A1-->A2-->A3-->A4 (master/HEAD) \ -->B1-->B2 (new-master/HEAD)
Выполнение этого так же просто, как
git branch new-master master~2
Вы хотите git-revert
и Чтобы сохранить A3 и A4 и записать факт, что вы возвращаетесь, используйте git-reset
в зависимости от того, как вы хотите лечить A3 и A4. Чтобы удалить все следы A3 и A4, используйте git-reset --hard
.git-revert
.
edit. Решение Aristotle Pagaltzis git-checkout
превосходно, хотя для небольших ревертов я не вижу проблемы с git-revert
. Тем не менее, я прошу, чтобы будущие варианты были отданы Ответ Аристотеля Пагальциса
Я нашел git magic, чтобы быть хорошим ресурсом для git.