Внедрих класически 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
работи перфектно, но ми е много неудобно да кажа на всички да използват силата или да я направят част от стандартния работен процес, тъй като мога да си представя няколко души или малък подекип, които си сътрудничат върху една вилица и стъпват пръстите на краката един на друг с принудителен тласък.
Някакви идеи? какво ми липсва