git pull --rebase upstream и git push origin отклоняет не ускоренную перемотку вперед?

Я реализовал классический рабочий процесс git сопровождающего/участника OSS для проекта компании на github, однако один пограничный случай приводит к некоторым странным результатам, которые я не знаю, как обойти.

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

git clone [email protected]:kozhevnikov/<project>.git
git remote add upstream [email protected]:<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 [email protected]:kozhevnikov/<project>.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to '[email protected]: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 pull request выглядит так.

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, это работает отлично, однако мне очень неловко говорить всем использовать силу или делать это частью стандартного рабочего процесса, поскольку я могу представить, как несколько человек или небольшая подгруппа сотрудничают на одной развилке и наступают на нее. пальцы ног друг друга с принудительным толчком.

Есть идеи? Что мне не хватает?


person Ilya Kozhevnikov    schedule 12.03.2012    source источник


Ответы (1)


Когда ты

git pull --rebase upstream master

вы переписываете свою собственную историю, так как вы перебазируете свою главную ветку в обновленный вышестоящий репозиторий. Когда вы отправляете перебазированное репо на свой форк, git жалуется. Вам нужно нажать --force

git push --force origin master
person ralphtheninja    schedule 12.03.2012