Ho implementato il classico flusso di lavoro git di manutentore/contributore OSS per un progetto aziendale su github, tuttavia un caso limite produce alcuni risultati strani che non sono sicuro di come muoversi.git pull --rebase upstream e git push origin non rifiuta l'avanzamento rapido?
Diciamo che c'è un tipico progetto che ho biforcato e aggiunto a monte remoto per tenerlo aggiornato.
git clone [email protected]:kozhevnikov/<project>.git
git remote add upstream [email protected]:<company>/<project>.git
Per gli scopi di questo esempio questa forcella è indietro di alcuni commit.
git reset --hard HEAD~5 && git push --force
Io lavoro su questo forchetta e spingere alcuni commit, prima di spingere il mio ultimo commit e la creazione di una richiesta di pull aggiorno il clone della forchetta per assicurarsi che non vi siano conflitti.
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
Ora, quando provo a spingere verso la mia forchetta, viene rifiutato.
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.
Cosa devo fare dopo? Tutto quello che voglio è che la richiesta pull contenga foo e bar commit, tuttavia ...
Quando I pull
, la richiesta pull contiene commit foo duplicati e unione aggiuntiva.
git pull
Merge made by the 'recursive' strategy.
git push
Sulla richiesta pull di github si presenta così.
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
Quando ho git pull --rebase
invece di pull
, nel migliore dei casi ti includere altre persone del impegna nella mia richiesta di pull (quelli da reset), e nel peggiore dei casi mi dà fondere i conflitti.
Quando ho git push --force
senza pull
o --rebase
funziona perfettamente, ma io sono molto a disagio nel dire a tutti usare la forza o rendendola parte del flusso di lavoro standard, come posso immaginare poche persone o un piccolo sottogruppo che collaborano su un singolo forchetta e pestati l'un l'altro con la spinta forzata.
Qualche idea? Cosa mi manca?