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 изглежда така.

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