merge -u - git rebase e git push: non veloce avanti, perché usare?





option tag (3)


Alcune note su come funziona git (non tecnico):

Quando esegui il rebase, git prende i commit in questione e li "rimanda" in cima ad una cronologia pulita. Questo per impedire che la cronologia mostri:

Description: tree -> mywork -> merge -> mywork -> merge -> mywork -> merge
Commit SHA1: aaaa -> bbbb   -> cccc  -> dddd   -> eeee  -> ffff   -> gggg

Dopo un rebase, può apparire come questo (o simile):

Description: tree -> rebase
Commit SHA1: aaaa -> hhhh

Il problema è che il nuovo commit che stai tentando di eliminare non è un discendente del commit sulla punta del ramo a cui stai spingendo.

Ora, tu sai che le stesse informazioni sono nei commit, ma git è responsabile non solo sovrascrivendo quelle commit là fuori (bbbb-gggg nell'esempio sopra).

Modello di riporto condiviso

Se si sta utilizzando un repository condiviso, cose come questa possono diventare molto confuse. Lasciami spiegare perché. Supponiamo che un altro sviluppatore abbia abbattuto il ramo e che abbia commesso aaaa -> gggg nel proprio ramo. Quindi fanno un commit iiii

Nel frattempo, hai ridimensionato e forzato una spinta, facendo apparire l'albero in questo modo:

Description: tree -> rebase
Commit SHA1: aaaa -> hhhh

Quando l'altro sviluppatore tenta di eseguire il push, riceve un messaggio "non-fast forward". Quando si unisce, entrambe le storie vengono RILANCATE insieme, e si finisce con un casino

Qualcosa di simile (disordinato):

Description: tree -> rebase -> mywork -> merge -> mywork -> merge -> mywork -> merge -> devwork -> merge 
Commit SHA1: aaaa -> hhhh   -> bbbb   -> cccc  -> dddd   -> eeee  -> ffff   -> gggg -> iiii    -> jjjj

In altre parole, se gli altri stanno tirando E spingendo, è meglio che si attacchi con git merge, o EVITARE PUSHING fino a dopo il rebase (e solo rebase il tuo lavoro).

Modello di archivio visibile pubblicamente

Forse stai usando un modello diverso (più geniale) in cui vuoi solo che le persone siano in grado di estrarre dal tuo repository. In questo caso, git push --force non è poi così male, perché in questo caso possono occuparsi di stare al passo con esso. Possono ribattere le loro modifiche per essere in cima alle tue modifiche prima di dare loro le loro patch. Impedisce al tuo repository di essere incasinato.

Tuttavia, potrebbe esserci un modo migliore per te. git push --mirror

Da http://www.kernel.org/pub/software/scm/git/docs/git-push.html

Invece di nominare ogni ref da spingere, specifica che tutti i ref in $ GIT_DIR / refs / (che include ma non è limitato a refs / heads /, refs / remotes /, e refs / tags /) devono essere specchiati al repository remoto. I ref locali appena creati verranno inviati al terminale remoto, i ref aggiornati localmente verranno forzati all'aggiornamento sul terminale remoto e gli errori eliminati verranno rimossi dal terminale remoto. Questa è l'impostazione predefinita se è impostata l'opzione di configurazione remote..mirror.

Una delle grandi cose su git è che è molto flessibile e consente molti diversi tipi di flussi di lavoro. Ma la vera forza sta nel fatto che si tratta di un modello distribuito, quindi credo che il maggior ROI possa essere raccolto usando in questo modo.

Ho un ramo che dovrebbe essere disponibile per altri contributori e che dovrebbe rimanere costantemente aggiornato con il master.

Sfortunatamente, ogni volta che faccio 'git rebase' e poi provo a premere, il risultato è un messaggio 'non-fast forward' e l'aborto di push. L'unico modo per spingere qui è usare --force. Significa che dovrei usare 'git merge' invece di ridiscutere se il mio ramo diventasse pubblico e altri ci lavorassero?




No, rebase è perfettamente legale con i repository pubblici e potrebbe anche essere desiderabile mantenere la storia fluente. Tieni presente che non è necessario utilizzare rebase per riscrivere la cronologia dei commit pubblicati in remoto. Vale a dire che rebase può essere applicato solo ai tuoi impegni locali, che non hai mai pubblicato. Usa rebase per posizionare i tuoi commit su di essi quando li recuperi e poi, forse, li aggiusta li. Un altro motivo per cui è possibile ricevere questo messaggio è che il ramo che si sta spingendo è stato aggiornato ed è necessario effettuare la sincronizzazione: recupera e rebase il tuo commit in cima a ciò che hai recuperato.




Nel caso in cui non hai completato il rebase e nel mezzo di esso, i seguenti lavori:

git rebase --abort




git merge rebase