Отменить запрос на слияние? - PullRequest
133 голосов
/ 26 июня 2011

Кто-то принял запрос на удаление, который не должен был быть. Теперь у нас есть куча неработающего кода. Как отменить запрос на удаление? Я просто собирался отменить изменения в коммите непосредственно перед слиянием, но я заметил, что он слился в кучу коммитов. Так что теперь есть все эти коммиты от этого человека за несколько дней до слияния. Как вы отмените это?

Ответы [ 6 ]

123 голосов
/ 30 апреля 2013

Существует лучший ответ на эту проблему, хотя я мог бы просто пошагово разобрать это.

Вам нужно будет получить и получить последние последние изменения, например, так ::10000

git fetch upstream
git checkout upstream/master -b revert/john/foo_and_bar

Взглянув на журнал коммитов, вы должны найти что-то похожее на это:

commit b76a5f1f5d3b323679e466a1a1d5f93c8828b269
Merge: 9271e6e a507888
Author: Tim Tom <tim@tom.com>
Date:   Mon Apr 29 06:12:38 2013 -0700

    Merge pull request #123 from john/foo_and_bar

    Add foo and bar

commit a507888e9fcc9e08b658c0b25414d1aeb1eef45e
Author: John Doe <john@doe.com>
Date:   Mon Apr 29 12:13:29 2013 +0000

    Add bar

commit 470ee0f407198057d5cb1d6427bb8371eab6157e
Author: John Doe <john@doe.com>
Date:   Mon Apr 29 10:29:10 2013 +0000

    Add foo

Теперь вы хотите отменить весь пул-запрос с возможностью отмены позже. Для этого вам потребуется взять идентификатор коммит слияния .

В приведенном выше примере коммит слияния является верхним, где он говорит "Объединенный запрос на извлечение # 123 ..." .

Сделайте это, чтобы отменить оба изменения ( «Добавить панель» и «Добавить foo» ), и в результате вы получите один коммит, который полностью отменит запрос на извлечение, который вы можете позже отмените и сохраните историю изменений в чистоте:

git revert -m 1 b76a5f1f5d3b323679e466a1a1d5f93c8828b269
86 голосов
/ 26 июня 2011

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

(Если у вас есть ветвь reflog, еще проще найти коммит до слияния.)


(Изменить после получения дополнительной информации в комментариях:)

Хорошо, давайте посмотрим на график:

screenshot 1

Я полагаю, что последний (самый правый) коммит был вашим неправильным объединить по запросу pull , который объединил синюю линию, показанную здесь. Ваш последний хороший коммит будет тем, что был ранее на черной линии, здесь отмечен красным:

enter image description here

Сбросьте до этого коммита, и все будет в порядке.

Это означает, что в вашей локальной рабочей копии сделайте это (убедившись, что у вас больше нет незафиксированных файлов, например, с помощью git stash):

git checkout master
git reset --hard 7a62674ba3df0853c63539175197a16122a739ef
gitk 

Теперь подтвердите, что вы действительно выполняете коммит, который я там пометил, и вы не увидите ничего из извлеченного материала в его происхождении.

git push -f origin master

(если ваш пульт Github назван origin - иначе измените имя).

Теперь все должно выглядеть правильно и на github. Коммиты все еще будут в вашем репозитории, но не будут доступны ни одной ветке, поэтому не должны причинять там никакого вреда. (И они все еще будут в хранилище RogerPaladin, конечно.)

(Возможно, существует специфический для Github веб-способ сделать то же самое, но я не слишком знаком с Github и его системой управления запросами на получение.)

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

Если есть вероятность, что это произошло, или вы просто хотите избежать каких-либо проблем, используйте команду git revert вместо git reset, чтобы отменить изменения с новым коммитом, вместо того, чтобы вернуться к более старому. (Некоторые люди думают, что вам никогда не следует делать сброс с опубликованными ветками.) Другие ответы на этот вопрос см. В разделе «Как это сделать».

На будущее:

Если вам нужны только некоторые коммиты ветви RogerPaladin, рассмотрите возможность использования cherry-pick вместо merge. Или свяжитесь с RogerPaladin, чтобы переместить их в отдельную ветку и отправить новый запрос на извлечение.

32 голосов
/ 27 февраля 2013

Если тяга была последней вещью, которую он сделал, тогда

git reset --hard HEAD~1
21 голосов
/ 27 июня 2014

Начиная с 24 июня 2014 года, вы можете легко попытаться отменить PR (см. « Отмена запроса на получение ») с помощью:

Представляем кнопку возврата

Вы можете легко отозвать запрос на загрузку на GitHub, нажав Восстановить:

https://camo.githubusercontent.com/0d3350caf2bb1cba53123ffeafc00ca702b1b164/68747470733a2f2f6769746875622d696d616765732e73332e616d617a6f6e6177732e636f6d2f68656c702f70756c6c5f72657175657374732f7265766572742d70756c6c2d726571756573742d6c696e6b2e706e67

Вам будет предложено создать новый пул-запрос с отмененными изменениями:

https://camo.githubusercontent.com/973efae3cc2764fc1353885a6a45b9a518d9b78b/68747470733a2f2f6769746875622d696d616765732e73332e616d617a6f6e6177732e636f6d2f68656c702f70756c6c5f72657175657374732f7265766572742d70756c6c2d726571756573742d6e65772d70722e706e67

Остается проверить, если для этого возврата используется -m или нет (также для возврата слияний)

6 голосов
/ 18 июля 2017

Чтобы отменить GitHub Pull-запрос с коммитами, которые вы не хотите удалять, вы должны выполнить:

git reset --hard --merge <commit hash>

с хэшем коммита, являющимся коммитом перед слиянием запроса на извлечение. Это удалит все коммиты из запроса извлечения, не влияя на коммиты в истории.

Хороший способ найти это - перейти к теперь закрытому запросу и найти это поле:

Pull Request Image Изображение запроса на извлечение

После запуска git reset, запустите:

git push origin --force <branch name>

Это должно вернуть ветку обратно перед запросом извлечения, БЕЗ влияния на любые коммиты в ветке, которые попали в историю коммитов между коммитами из запроса извлечения.

EDIT:

Если вы нажмете кнопку возврата в запросе на извлечение, это создаст дополнительную фиксацию в ветви. Это НЕ uncommit или unmerge. Это означает, что если вы нажмете кнопку возврата, вы не сможете открыть новый запрос на повторное добавление всего этого кода.

0 голосов
/ 27 апреля 2017

Я использую это место все время, спасибо.

Я искал, как отменить запрос на извлечение и получил здесь.

Я собирался просто git reset --hard ""давным-давно "и сделаем перемотку назад туда, где я находился, прежде чем выполнять запрос на извлечение.

Помимо просмотра здесь, я также спросил своего коллегу, что он будет делать, и у него был типично хороший ответ:используя пример вывода в первом ответе выше:

git reset --hard 9271e6e

Как и в большинстве вещей в Git, если вы делаете это каким-то непростым способом, вы, вероятно, делаете это неправильно.

...