Откат в Git

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

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

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

25
задан Winner Crespo 19 November 2013 в 14:57
поделиться

3 ответа

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

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

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

git branch new-master master~2
7
ответ дан Pat Notz 19 November 2013 в 14:57
поделиться

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

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

, я нашел волшебство мерзавца быть хорошим ресурсом для мерзавца.

5
ответ дан Community 19 November 2013 в 14:57
поделиться
  • 1
    @PallavTrivedi - Я не думаю, что это должно быть принятым ответом. Don' t понимают меня превратно, этот ответ корректен, поскольку он успешно заставляет предупреждение замолчать. Но это предупреждение чрезвычайно полезно. Я предложил бы делать Ваш self ссылки явный (где можно поглядеть на код и легко видеть кандидатов на проблемы цикла сильной ссылки), а не имейте not-so-obvious неявную ссылку на self Escape one' s внимание. Apple добавила это полезное предупреждение по причине. – Rob 31 March 2018 в 02:27

От корневого каталога Вашей рабочей копии просто делают

git checkout A2 -- .  
git commit -m 'going back to A2'
<час>

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

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

45
ответ дан Aristotle Pagaltzis 19 November 2013 в 14:57
поделиться
  • 1
    @Starsky it' s проблема, потому что это относится ко всем Переходным приставкам, таким образом, это скроет предупреждения других Переходных приставок – Nycen 25 April 2019 в 10:11
Другие вопросы по тегам:

Похожие вопросы: