Откат в Git - PullRequest
       9

Откат в Git

25 голосов
/ 20 октября 2008

Я зафиксировал и выдвинул несколько патчей: A1 -> A2 -> A3 -> A4 (HEAD)

Каждый вытащил эти наборы изменений в свою локальную копию.

Теперь мы хотим «откатиться» на А2 и продолжить оттуда развитие - по сути, отбросив А3 и А4. Какой лучший способ сделать это?

Ответы [ 3 ]

45 голосов
/ 21 октября 2008

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

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

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

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

7 голосов
/ 20 октября 2008

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

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

Сделать это так же просто, как

git branch new-master master~2
5 голосов
/ 20 октября 2008

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

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

Я нашел git magic хорошим ресурсом для git.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...