2012-01-20 13 views
7

Sto provando a lavorare sul mio ramo featureA mantenendolo aggiornato con il ramo master.git rebase master, quindi spingere i risultati del ramo d'origine nell'errore non fast-forward

Ecco lo scenario

git clone ssh://xxx/repo 

git checkout -b featureA 

$ git add file.txt 

$ git commit -m 'adding file' 

$ git push origin featureA 

nel frattempo un paio di nuovi impegna in cui spinto da padroneggiare origine

git checkout master 

git pull origin master 

git checkout featureA 

git rebase master 

git push origin feature A 
To ssh://xxx/repo 
! [rejected]  featureA -> featureA (non-fast-forward) 
error: failed to push some refs to 'ssh://xxx/repo' 
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. 

Come posso rebase senza forzare il server ad accettarlo?

+0

Non è possibile rebase ... rebase cronologia degli alters e devi forzare un push – knittl

risposta

9

Non è possibile eseguire il push dopo il ribasamento. I commit ora hanno SHA1 diversi poiché la loro cronologia è diversa. Se il ref aggiornato non contiene il vecchio ref in suo antenato, è un'operazione potenzialmente dannosa e git non lo permetterà.

L'unica alternativa è unire se non si desidera forzare.

Forzare non è così male se si lavora da soli e non è necessario che altri si impegnino in questo ramo.

+0

Thx @Adam! quindi nel mio caso, continuo a unirmi con il master per mantenere aggiornata la mia funzioneA con il master, quindi spingere le modifiche al mio ramo featureA remoto per tenerle al sicuro sul nostro server? quindi quando sono pronto per unire featureA in master in futuro, passerò al master e git merge featureA? – ben39

+0

si. Dovresti solo unire la tua funzione in master con 'git checkout master && git merge feature '. Per un giorno all'altro, unisci tutte le volte che vuoi il contrario. –

+0

Ok. Non è giusto che, per il mio giorno per giorno dev, quando fonderò il master in featureA come segue 'git checkout featureA && git merge master && git push origin feature 'per tenere il passo con il master, creerò i commit duplicati che maestro ha già. Questo duplice problema si presenterà in particolare quando un giorno unirò il master con featureA come segue 'git checkout master && git merge featureA' giusto? – ben39

5

Una breve risposta alla tua domanda: puoi fare il contrario basando il master su featureA (ma non spingi ancora), e resetta la caratteristica A a quel punto.

Questa è in realtà la scelta della ciliegina dal master su featureA, il lato negativo è che si finirà con commit duplicati su due rami. Risolverà il tuo problema immediato (se è questa la tua intenzione), ma a lungo andare non dovresti ricomporre i commit che sono già stati spinti in una filiale remota. La soluzione migliore nel tuo scenario è in realtà unire.