Кто-то принял запрос на удаление, который не должен был быть. Теперь у нас есть куча неработающего кода. Как вы отмените запрос на удаление? Я просто собирался отменить изменения в коммите непосредственно перед слиянием, но я заметил, что он слился в кучу коммитов. Так что теперь есть все эти коммиты от этого человека за несколько дней до слияния. Как вы отмените это?
git
github
merge
pull-request
Будет
источник
источник
Ответы:
Есть лучший ответ на эту проблему, хотя я мог бы просто пошагово разобрать это.
Вам нужно будет получить и проверить последние изменения в вышестоящей версии, например:
Взглянув на журнал коммитов, вы должны найти что-то похожее на это:
Теперь вы хотите отменить весь пул-запрос с возможностью отмены позже. Для этого вам нужно взять идентификатор коммита слияния .
В приведенном выше примере коммит слияния является верхним, где написано «Объединенный запрос извлечения # 123 ...» .
Сделайте это, чтобы отменить оба изменения ( «Добавить панель» и «Добавить foo» ), и в результате вы получите один коммит, который полностью отменит запрос на извлечение, который вы можете отменить позже, и сохранит историю изменений в чистоте:
источник
git checkout upstream/master -b revert/john/foo_and_bar
? что именно он делает?Посмотрите на свой граф коммитов (с помощью gitk или аналогичной программы). Вы увидите коммиты из запроса на получение, и вы увидите свои собственные коммиты и коммит слияния (если это не было слияние с ускоренной перемоткой вперед). Вам просто нужно найти последний из ваших собственных коммитов перед слиянием и сбросить ветку на этот коммит.
(Если у вас есть ветвь reflog, еще проще найти коммит до слияния.)
(Изменить после получения дополнительной информации в комментариях :)
Хорошо, давайте посмотрим на график:
Я предполагаю, что последним (самым правым) коммитом было ваше неправильное слияние по запросу извлечения , которое слило синюю линию, показанную здесь. Ваш последний хороший коммит будет тем, что был ранее на черной линии, здесь отмечен красным:
Сбросьте до этого коммита, и у вас все будет хорошо.
Это означает, что в вашей локальной рабочей копии сделайте это (убедившись, что у вас больше нет незафиксированных файлов, например, с помощью git stash):
Теперь подтвердите, что вы действительно выполняете коммит, который я там пометил, и вы не увидите ничего из извлеченного материала в его происхождении.
(если ваш пульт Github назван
origin
- иначе измените имя).Теперь все должно выглядеть правильно на GitHub тоже. Коммиты по-прежнему будут находиться в вашем хранилище, но не будут доступны ни одной ветке, поэтому не должны причинять там никакого вреда. (И они все еще будут в хранилище RogerPaladin, конечно.)
(Возможно, существует специфический для Github веб-способ сделать то же самое, но я не слишком знаком с Github и его системой управления запросами на получение.)
Обратите внимание, что если кто-то уже мог вытащить вашего мастера с неверным коммитом, у него возникнет та же проблема, что и у вас, и он не сможет внести свой вклад. перед сбросом на новую версию мастера.
Если существует вероятность того, что это произошло, или вы просто хотите избежать каких-либо проблем, используйте
git revert
команду вместоgit reset
, чтобы отменить изменения с новым коммитом, вместо того, чтобы вернуться к более старому. (Некоторые люди думают, что вы никогда не должны делать сброс с опубликованными ветками.) Смотрите другие ответы на этот вопрос о том, как это сделать.Для будущего:
Если вам нужны только некоторые коммиты ветви RogerPaladin, рассмотрите возможность использования
cherry-pick
вместоmerge
. Или свяжитесь с RogerPaladin, чтобы переместить их в отдельную ветку и отправить новый запрос на извлечение.источник
reset --hard
и принудительное нажатие очень плохая практика.) Ответ @errordeveloper ниже показывает способ сделать это без переписывания истории или принудительного толканияЕсли тяга была последним, что он сделал, то
источник
git reset --hard HEAD~1
я использовалgit push origin -f
для обновления удаленного хранилища. Но будьте осторожны, будьте осторожны, прежде чем делать это.Начиная с 24 июня 2014 года, вы можете легко отменить пиар (см. «Отмена запроса на удаление ») с помощью:
Представляем кнопку возврата
Остается проверить, использует ли это возвращение
-m
или нет (также для отмены слияний)Но Адиль Раза добавляет в комментариях (декабрь 2019):
Предупреждение : Кораем отмечает в комментариях, что:
Кораем отсылает нас к « Github: Изменения игнорируются после возврата (
git cherry-pick
,git rebase
) » для более.источник
Чтобы отменить GitHub Pull-запрос с коммитами, которые вы не хотите удалять, вы должны выполнить:
git reset --hard --merge <commit hash>
хеш коммита является коммитом перед слиянием запроса на извлечение. Это удалит все коммиты из запроса извлечения, не влияя на коммиты в истории.
Хороший способ найти это - перейти к теперь закрытому запросу и найти это поле:
Pull Request Image
После того, как вы запустите
git reset
, выполните:git push origin --force <branch name>
Это должно вернуть ветку обратно перед запросом извлечения, БЕЗ влияния на любые коммиты в ветви, переданные в историю коммитов между коммитами из запроса на извлечение.
РЕДАКТИРОВАТЬ:
Если вы нажмете кнопку возврата в запросе извлечения, это создаст дополнительную фиксацию в ветви. Он НЕ УСТАВЛЯЕТ и не растворяет. Это означает, что если вы нажмете кнопку возврата, вы не сможете открыть новый запрос на повторное добавление всего этого кода.
источник
Я использую это место все время, спасибо.
Я искал, как отменить запрос на получение и попал сюда.
Я собирался просто
git reset --hard
«давным-давно» и сделать перемотку назад туда, где я был, прежде чем сделать запрос на извлечение.Помимо просмотра здесь, я также спросил своего коллегу, что он будет делать, и у него был типично хороший ответ: используя пример выходных данных в первом ответе выше:
Как и в большинстве вещей в Git, если вы делаете это каким-то непростым способом, вы, вероятно, делаете это неправильно.
источник