Я реализовал классический рабочий процесс git сопровождающего/участника OSS для проекта компании на github, однако один пограничный случай приводит к некоторым странным результатам, которые я не знаю, как обойти.
Допустим, есть типичный проект, который я разветвил и добавил вышестоящий удаленный, чтобы поддерживать его в актуальном состоянии.
git clone git@github.com:kozhevnikov/<project>.git
git remote add upstream git@github.com:<company>/<project>.git
Для целей данного примера эта вилка отстает на несколько коммитов.
git reset --hard HEAD~5 && git push --force
Я работаю над этим форком и отправляю несколько коммитов, прежде чем отправить свой последний коммит и создать запрос на включение, я обновляю клон своего форка, чтобы убедиться в отсутствии конфликтов.
touch foo && git add foo && git commit -m foo && git push
touch bar && git add bar && git commit -m bar
git pull --rebase upstream master
From github.com:<company>/<project>
* branch master -> FETCH_HEAD
First, rewinding head to replay your work on top of it...
Applying: foo
Applying: bar
Теперь, когда я пытаюсь нажать на свою вилку, меня отвергают.
git push
To git@github.com:kozhevnikov/<project>.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:kozhevnikov/<project>.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again. See the
'Note about fast-forwards' section of 'git push --help' for details.
Что мне делать дальше? Все, что я хочу, это чтобы пулл-реквест содержал коммиты foo и bar, однако...
Когда я pull
, пулл-реквест содержит повторяющиеся коммиты foo, а также дополнительный коммит.
git pull
Merge made by the 'recursive' strategy.
git push
На github запрос на вытягивание выглядит так.
Showing 4 unique commits by 1 author.
12345
kozhevnikov foo 4 minutes ago
67890
kozhevnikov foo 4 minutes ago
abcde
kozhevnikov bar 2 minutes ago
fghij
kozhevnikov Merge branch 'master' of github.com:kozhevnikov/<project> just now
Когда я git pull --rebase
вместо pull
, в лучшем случае он включит чужие коммиты в мой запрос на вытягивание (те, что были сброшены), а в худшем выдаст мне сливаются конфликты.
Когда я git push --force
без каких-либо pull
или --rebase
, он работает отлично, однако мне очень неловко говорить всем использовать силу или сделать его частью стандартного рабочего процесса, поскольку я могу представить, как несколько человек или небольшая подгруппа сотрудничают над одной вилкой и наступают друг другу на пальцы ног принудительным толчком.
Есть идеи? Что я упустил?