Как удалить коммиты из пул реквеста


114

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

Я нашел несколько похожих вопросов в StackOverflow, но не могу применить то, что там есть. Это мой первый пулреквест на GitHub, поэтому мне странно, как все это работает.

Выделенный коммит - это тот коммит, который мне нужно сохранить и удалить все остальное. Это становится четвертым коммитом в истории, потому что я делаю слияние.

введите описание изображения здесь

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

Может кто-нибудь объяснить, что происходит и как решить эту проблему?


2
Вам нужно выполнить перебазирование и только «выбрать» коммит «добавленный из github» (то есть закомментировать строки для каждого другого коммита)
Робби Аверилл

1
переустановите какую ветку на какую ветку вы можете добавить дополнительные объяснения.
Humazed

what branch= ветка, над которой вы работаете, onto what branch= ветка, в которую вы тянете запрос,
Робби Аверилл

Я объяснил, на что намекнул @Robbie Averill в моем ответе. Странно, что до сих пор никто не написал ответа, объясняющего это.
Ferit

Ответы:


112

У вас есть несколько способов сделать это.

Этот пост - прочтите часть об откате , в котором подробно объясняется, что мы хотим сделать и как это сделать.

Вот самое простое решение вашей проблемы:

# Checkout the desired branch
git checkout <branch>

# Undo the desired commit
git revert <commit>

# Update the remote with the undo of the code
git push origin <branch>

Команда revert создаст новую фиксацию с отменой исходной фиксации.


2
Работает ли это, даже когда мы разделили проект от другого человека и хотим удалить некоторые комментарии в запросе на перенос?
Доктор Джеки

123

Люди не хотели бы видеть неправильную фиксацию и откатную фиксацию, чтобы отменить изменения неправильной фиксации. Это загрязняет историю коммитов.

Вот простой способ удалить неправильную фиксацию вместо отмены изменений с помощью откатной фиксации.

  1. git checkout my-pull-request-branch

  2. git rebase -i HEAD~n// где n- количество последних коммитов, которые вы хотите включить в интерактивную перебазировку.

  3. Заменить pickс dropдля фиксаций вы хотите отказаться.
  4. Сохранить и выйти.
  5. git push --force

8
это сработало для меня как шарм. У меня была куча коммитов, которых не должно было быть в PR. Я просто интерактивно перебазировал его, отбросил те коммиты и вернул их обратно
FullStackEngineer

5
Для того, чтобы подтолкнуть я должен был сделать: git push origin HEAD:myBranch --force. Но в остальном здорово и полезно.
ScottyBlades

4
Это также полезно, когда вы хотите исправить открытый PR в GitHub, вам просто нужно иметь возможность делать принудительный толчок
Владимир Идальго

2
Что вы имеете в виду, говоря «Заменить pickна dropдля коммитов, которые вы хотите отменить»?
jorijnsmit

2
@jorijnsmit они имеют в виду, что после запуска git rebase -i HEAD~<n>в верхней части файла будут <n>строки коммитов, каждая из которых содержит текст pick <commit id>. По умолчанию используется значение pick, поэтому для каждого коммита, который вы хотите отбросить, измените текст pickнаdrop
Slim,

6

Если вы удаляете коммит и не хотите сохранять его изменения, у @ferit есть хорошее решение.

Если вы хотите добавить этот коммит в текущую ветку, но не имеет смысла быть частью текущего PR, вы можете вместо этого сделать следующее:

  1. использовать git rebase -i HEAD~n
  2. Поменяйте коммит, который вы хотите удалить, на нижнюю (самую последнюю) позицию
  3. Сохранить и выйти
  4. используйте, git reset HEAD^ --softчтобы отменить фиксацию изменений и вернуть их в поэтапное состояние.
  5. используйте git push --forceдля обновления удаленной ветки без удаленной фиксации.

Теперь вы удалите фиксацию со своего пульта дистанционного управления, но все равно будете иметь локальные изменения.


2

Итак, сделайте следующее,

Допустим, ваша ветка называется my_branch, и у нее есть дополнительные коммиты.

  1. git checkout -b my_branch_with_extra_commits (Сохранение этой ветки под другим именем)
  2. gitk (Открывает консоль git)
  3. Найдите коммит, который хотите сохранить. Скопируйте SHA этого коммита в блокнот.
  4. git checkout my_branch
  5. gitk (Это откроет консоль git)
  6. Щелкните правой кнопкой мыши фиксацию, к которой вы хотите вернуться (Состояние перед изменениями), и нажмите " reset branch to here"
  7. Сделать git pull --rebase origin branch_name_to _merge_to
  8. git cherry-pick <SHA you copied in step 3. >

Теперь посмотрите историю коммитов локальной ветки и убедитесь, что все в порядке.


0

Вот что мне помогло:

  1. Создайте новую ветку с существующей. Назовем существующий branch_oldи новый как branch_new.

  2. Сбросьте branch_newдо стабильного состояния, когда у вас вообще не было проблем с фиксацией. Например, чтобы поставить его на уровень местного мастера, сделайте следующее:

    git reset - жесткий мастер git push - принудительное происхождение

  3. cherry-pickкоммиты из branch_oldвbranch_new

  4. git push
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.