2012-03-12 14 views
8

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?

risposta

16

Quando si

git pull --rebase upstream master 

si sta riscrivendo la propria storia, dal momento che sono rebasing tuo branch master sul repository monte aggiornato. Quando si spinge il repository rebased alla tua lamentela git forchetta. Devi spingere con forza -

git push --force origin master