Я действительно удивлен, что это не дубликат ... Оказывается Я уже ответил почти на тот же вопрос . Фиксация это дубликат (т.е. есть ветка с 2 ненужными коммитами). Однако проблема сформулирована совсем по-другому (например, в другом вопросе не упоминаются запросы на извлечение), и я бы не нашел ее, если бы там не было моего ответа.
Использование git rebase --onto
.
В вашем локальном хранилище:
git checkout newbranch
git rebase master --onto origin/master
git push origin +newbranch # May look slightly different for you; The point is, you need to force push (the + does that).
NB, во второй строке master
можно заменить на HEAD~
или другой ссылкой на commit-2
.
Краткое объяснение: git принимает коммиты между указанным на него (в данном случае master
) и текущим коммитом и реплицирует их один за другим в точке, определенной как --onto
. Если некоторые коммиты не могут быть применены автоматически, процесс приостанавливается, и вам приходится разрешать конфликты вручную.
Предостережение: не нажимайте силой, если вы не уверены, что это безопасно . Если вы перешли в свой собственный репозиторий fork и можете предположить, что его никто не использует, у вас, вероятно, все в порядке (даже если это технически общедоступно). Это ваша частная ветка, которой иногда может быть достаточно, чтобы означать, что все в порядке. Но важно знать риски, связанные с удалением истории (или попытка ).
Альтернативы (cherry-pick): мой ответ на другой вопрос подробно описывает некоторые альтернативы. Ситуация там по сути та же, ветка F1 содержит ненужные коммиты.