git Пулл-реквест и работа с ветками (pull request) - алгоритм на примере php & composer

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

  1. Добавьте в свой локальный репозиторий (локальный клон форка) ещё один удаленный репозиторий (помимо origin-а, который указывает на ваш форк, скажем, на гитхабе), например с именем iff (предположим, что вы делаете пулл-реквест куда-то сюда)
  2. Ответвитесь от вашей текущей ветки, создав новую, с именем, скажем pl, переключитесь на неё -- в этой ветке уже должно быть все, что вам нужно для пулл-реквеста, но пусть изменения в одном файле, например composer.json нужно заменить но тот, что был в исходном репозитории, для этого сначала обновим у себя инфромацию о ветках репозитория iff:
    git fetch iff
  3. Отмена изменений, ненужных в пулл-реквесте

  4. Чтобы "отменить" вообще все изменения в конкретном файле просто выполним команду забора файла в "исходном" из другой ветки дополнительного внешнего репозитория:
    git checkout iff/master -- composer.json
    

    Если же вам все же необходимы какие-то правки (исходный composer.json не подходит, например вы изменили завимости пакета и хотите предложить эти изменения в пулл-реквесте), то просто приведите файл в нужное состояние вручную (например, если вы меняли имя пакета при использовании форка, то необходимо вернуть старое имя пакета).

  5. Закоммитим изменения в ветке pl нашего локального репозитория и сделаем push во внешний репозиторий origin.
    Все, теперь ветка pl в origin (напр. на гитхабе) готова к пул-реквесту)
  6. Последующие пулл-реквесты (как не делать форк каждый раз)

  7. Далее вы можете продолжать разработку в основной ветке, не забывайте при этом периодически (как минимум, один раз перед началом правок для очередного пулл-реквеста) делать пулл из оригинального репозитория, чтобы иметь проект в свежем состоянии, например:
    git pull iff/master

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

  8. Когда очередные изменения будут готовы, и вы захотите сделать пулл-реквест, просто влейте вашу основную ветку в специальную ветку пулл-реквеста (у нас это pl), снова приведите в порядок файлы, которые пришлось поправить из-за работы с форком (выше рассматривался checkout для полного затирания или частичные ручные правки).

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

Key Words for FKN + antitotal forum (CS VSU):