Rebasing di filiali remote in Git


135

Sto usando un repository Git intermedio per eseguire il mirroring di un repository SVN remoto, dal quale le persone possono clonare e lavorare. Il repository intermedio ha il suo ramo master reimpostato di notte dall'SVN a monte e stiamo lavorando su rami di feature. Per esempio:

remote:
  master

local:
  master
  feature

Posso inviare con successo il mio ramo di funzionalità al telecomando e finire con quello che mi aspetto:

remote:
  master
  feature

local:
  master
  feature

Ho quindi reimpostato il ramo per tenere traccia del telecomando:

remote:
  master
  feature

local:
  master
  feature -> origin/feature

E va tutto bene. Quello che vorrei fare da qui è di reimpostare il ramo della funzione sul ramo principale sul telecomando, ma vorrei farlo dal mio computer locale. Mi piacerebbe poter fare:

git checkout master
git pull
git checkout feature
git rebase master
git push origin feature

Per mantenere aggiornato il ramo della funzione remota con il master remoto. Tuttavia, questo metodo fa lamentare Git:

To <remote>
 ! [rejected]        feature -> feature (non-fast-forward)
error: failed to push some refs to '<remote>'
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.

git pullfa il trucco ma provoca un commit di unione che vorrei evitare. Sono preoccupato che il messaggio affermi feature -> featurepiuttosto che, feature -> origin/featurema questa potrebbe essere solo una cosa di presentazione.

Mi sto perdendo qualcosa o lo sto facendo in modo completamente sbagliato? Non è fondamentale evitare di effettuare il rebase sul server remoto, ma rende molto più difficile risolvere eventuali conflitti di unione dal rebase.


Ho avuto lo stesso problema. Volevo iniziare un modello di rebase di ramo ( come questo ). Poi ho notato che ho commesso un errore: Se vuoi rebase (non dovresti spingere le tue modifiche alla funzione remota prima di eseguire la rebase su master) Quindi commetti un po 'di codice sulla tua funzione. E ora vuoi spingerlo sulla tua funzione remota. Bevor fai questo: -Dovresti prendere e tirare il tuo padrone se necessario. -Si dovrebbe tornare al master se ci sono state delle modifiche sul master che non si hanno nella funzione. Ora puoi spingere la funzione e non ci saranno problemi.
Markus

Risposte:


185

Dipende dal fatto che la funzione sia utilizzata da una persona o se gli altri se ne stanno lavorando.

Puoi forzare la spinta dopo il rebase se sei solo tu:

git push origin feature -f

Tuttavia, se altri ci stanno lavorando, è necessario unire e non rifare il passo dal master.

git merge master
git push origin feature

Ciò assicurerà di avere una storia comune con le persone con cui stai collaborando.

A un livello diverso, non dovresti fare back-fusioni. Quello che stai facendo è inquinare la cronologia del ramo della tua funzione con altri commit che non appartengono alla caratteristica, rendendo più difficile il lavoro successivo con quel ramo - rifacimento o meno.

Questo è il mio articolo sull'argomento chiamato branch per feature .

Spero che questo ti aiuti.


29
+1 per if others are working on it, you should merge and not rebase off of master, rebase è meglio usarlo solo sulla filiale privata.
Hendra Uzia,

6
in alternativa alla funzione push origin di git -f potresti anche cancellare la tua funzione remota e spingerla di nuovo
Markus

2
L'unione del master nel tuo ramo creerà un commit di unione e causerà conflitti con qualsiasi altro ramo di funzionalità aperto dal master dopo che le modifiche sono state inviate.
Steven,

+1 per git push origin feature -f. In alcuni contesti potrebbe essere necessario eseguire un rebase anche con rami remoti. Il punto cruciale è sapere cosa stai facendo. E dovremmo supporre che tu possa eliminare i commit in repository remoto.
enagra,

33

Bello che hai sollevato questo argomento.

Questa è una cosa / concetto importante in Git che molti utenti Git trarrebbero beneficio dalla conoscenza. git rebase è uno strumento molto potente e ti consente di mettere insieme i commit, rimuovere i commit ecc. Ma come con qualsiasi strumento potente, in pratica devi sapere cosa stai facendo o qualcosa potrebbe andare davvero storto.

Quando lavori localmente e scherzi con le tue filiali locali, puoi fare quello che ti piace purché non abbia inviato le modifiche al repository centrale. Questo significa che puoi riscrivere la tua storia, ma non quella di altri. Solo scherzando con le tue cose locali, nulla avrà alcun impatto su altri repository.

Questo è il motivo per cui è importante ricordare che una volta che hai spinto i commit, non li dovresti rifare in seguito. Il motivo per cui questo è importante, è che altre persone potrebbero attirare i tuoi impegni e basare il loro lavoro sui tuoi contributi alla base di codice, e se in seguito decidi di spostare quel contenuto da un posto a un altro (ribadirlo) e spingerli cambia, quindi altre persone avranno problemi e dovranno rifare il loro codice. Ora immagina di avere 1000 sviluppatori :) Provoca solo molte rielaborazioni inutili.


Sottovalutato per il linguaggio volgare
Poteri

1
Aggiornato la mia lingua.
ralphtheninja,

5

Poiché ti sei rifatto featurein cima al nuovo master, il tuo locale featurenon è più un avanzamento veloce origin/feature. Quindi, penso, è perfettamente bene in questo caso scavalcare il controllo di avanzamento rapido facendo git push origin +feature. Puoi anche specificare questo nella tua configurazione

git config remote.origin.push +refs/heads/feature:refs/heads/feature

Se altre persone lavorano sopra origin/feature, saranno disturbate da questo aggiornamento forzato. Puoi evitarlo unendo il nuovo masteral featureposto del rebasing. Il risultato sarà davvero un avanzamento veloce.


1

Puoi disabilitare il segno di spunta (se sei davvero sicuro di sapere cosa stai facendo) usando l' --forceopzione per git push.


15
Il problema è che non sono sicuro di sapere davvero cosa sto facendo :)
kfb

@r_: leggi la mia risposta. Potrebbe aiutarti a capire cosa stai facendo :)
ralphtheninja,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.