2013-07-28 11 views
5

Cosa posso fare per evitare il seguente messaggio quando spingo un ramo funzione una seconda volta:Impossibile spingere alcuni arbitri quando si spinge caratteristica ramo

To https://github.com/xxx/git_test.git 
! [rejected]  feature_branch -> feature_branch (non-fast-forward) 
error: failed to push some refs to 'https://github.com/xxx/git_test.git' 
hint: Updates were rejected because the tip of your current branch is behind 
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull') 
hint: before pushing again. 
hint: See the 'Note about fast-forwards' in 'git push --help' for details. 

Quello che faccio è questo:

git pull origin sprint_branch1 
git checkout -b feature_branch 

date > a.txt 
git add a.txt 
git commit -m 'added date' 

git push origin feature_branch 

qualcuno fare una revisione del codice per la mia funzione e che qualcun altro fare modifiche al sprint_branch nel frattempo:

git checkout sprint_branch1 
date > a.txt 
git add a.txt 
git commit -m 'added another date' 
git push origin sprint_branch1 

ho bisogno di migliorare la mia caratteristica così faccio

git checkout feature_branch 
git fetch origin 
git rebase origin/sprint_branch1 

ottengo unire i conflitti e fare:

nano a.txt # removing inserted merge tags 
git add a.txt 
git rebase --continue 

quindi migliorano la mia caratteristica

date >> a.txt 
git add a.txt 
git commit -m 'add another date again' 

Mi piace spingere il mio feature_branch per una seconda recensione

git push origin feature_branch 

Tuttavia ricevo il messaggio di errore menzionato in alto. Git mi consiglia di utilizzare git pull, ma altre persone mi consiglia di utilizzare il flusso di lavoro di rebase. Quindi cosa dovrei fare per spingere il feature_branch? Dovrei creare un nuovo ramo chiamato feature_branch_v2 e spingerlo? Devo manualmente ricordare quali file aggiungere git in quel caso o dovrei aggiungere tutto (creando un commit disordinato)? C'è un modo migliore per spingere senza ottenere questo messaggio di errore?

risposta

1

Git dice

hint: Updates were rejected because the tip of your current branch is behind 
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull') 
hint: before pushing again. 

si potrebbe solo bisogno di utilizzare il flusso di lavoro rebase per tirare rebase al ramo distanza dopo aver effettuato il commit, quindi spingere a distanza.

git commit -m 'add another date again' 
git pull --rebase 

Ciò potrebbe causare conflitti di rebase che è necessario risolvere e quindi continuare con rebase. Questo è principalmente causato dalla versione dell'albero di sprint_branch1 dietro a feature_branch.

Dovresti assicurarti che anche i giusti commit stiano andando. In senso generale, quando si sta fondendo con la sprint_branch1, è meglio fare un

git checkout feature_branch 
git merge sprint_branch1 

questo invece di rebase, dal momento che rebase riscrive i vostri commit che potrebbero causare problemi. Dopo l'unione, se lo si preme, dovrebbe funzionare correttamente.

EDIT 1:

Se avete bisogno di rebase e ancora evitare questo errore, è possibile utilizzare

git push --force origin feature_branch 

Tuttavia questo non è consigliato soprattutto in team distribuiti, come sarà riscrivere il ramo remoto con la tua filiale locale a prescindere da eventuali modifiche che altri potrebbero averlo fatto.

6

Questo è dove è andato storto:

git rebase origin/sprint_branch1 

Non si dovrebbe rebase rami pubblicati. Questo comando avrebbe dovuto essere un

git merge origin/sprint_branch1 

In generale si dovrebbe stare attenti con git rebase - sembra che ci sia un qualche tipo di religione intorno ad esso, anche se è uno strumento molto pericoloso.

Come procedere?

  • Se siete assolutamente sicuri nessun altro è andare a toccare di nuovo al ramo della funzione e nessuno ha fatto tutte le modifiche ad esso dal tuo ultimo tiro, si può solo fare

    git push -f 
    

    che sovrascrive l'HEAD sul server con la TESTA.

  • Se si è sicuri che non ci sono stati cambiamenti dalla tua ultima tirare, ma altre persone usano la vostra filiale, si può fare quanto sopra e dire a tutti con una copia del vostro ramo di cui hanno bisogno per eseguire

    git fetch origin 
    git checkout feature_branch 
    git reset --hard origin/feature_branch 
    

    Questo cancellerà tutte le loro modifiche locali dall'ultima spinta.

  • Il modo più sicuro sarebbe per di rinominare il vostro locale feature_branch a somethengi altro, trovare le commit aggiunti, ramo degli attuali origin/feature_branch e cherry-pick tutte le modifiche.

Eseguire gitk feature_branch origin/feature_branch per capire cosa sta succedendo.

+0

'git push -f' Lo ha fatto oggi, ho" perso "99 commit di cronologia remota. Ovviamente potrei riportarli nel telecomando, ma ci sono voluti molto tempo e tentativi. – hek2mgl