Rifondazione e cosa si intende ribadendo i commit spinti

Si dice spesso che non è necessario rifare i commit che hai già spinto. Cosa potrebbe significare?

Il libro ProGit ha una buona spiegazione .

La risposta specifica alla tua domanda può essere trovata nella sezione intitolata ” The Perils of Rebasing “. Una citazione da quella sezione:

Quando registri elementi, stai abbandonando i commit esistenti e ne crei di nuovi simili ma diversi. Se spingi i commit da qualche parte e gli altri li tirano giù e basano il lavoro su di loro, e poi riscrivi quelli che commettono con rebase git e li spingono di nuovo, i tuoi collaboratori dovranno ri-unire il loro lavoro e le cose diventeranno disordinate quando proverai a riporta il loro lavoro nel tuo.

Aggiornare:
In base al tuo commento di seguito, sembra che tu stia avendo difficoltà con il tuo stream di lavoro Git. Ecco alcuni riferimenti che possono aiutare:

  • La pagina man di gitworkflows : Vedi “Unione verso l’alto” e “Argomento rami”
  • ProGit: vedi ” Team gestito privato ”
  • Blog di Jarrod Spillers: vedi ” git merge vs git rebase: Avoiding Rebase Hell ”

Per capire questo, dobbiamo capire un po ‘come funziona git. Un repository git è una struttura ad albero, dove vengono commessi i nodes dell’albero. Ecco un esempio di un repository molto semplice: Quando ti forzi

ha quattro commit sul ramo master e ogni commit ha un ID (in questo caso, a, b, c, e d). Noterai che d è attualmente l’ultimo commit (o HEAD) del ramo master. inserisci la descrizione dell'immagine qui

Qui abbiamo due rami: master e my-branch. Potete vedere che master e my-branch contengono entrambi commit aeb, ma poi iniziano a divergere: master contiene c e d, mentre my-branch contiene e ed f. b si dice che sia la “base di fusione” di my-branch in confronto a master – o più comunemente, solo la “base”. Ha senso: puoi vedere che il mio ramo era basato su una versione precedente del master.

Diciamo che il mio ramo è diventato obsoleto e che vuoi aggiornarlo con l’ultima versione del master. Per dirla in un altro modo, il mio ramo deve contenere c e d. È ansible eseguire un’unione, ma ciò fa sì che il ramo contenga strane commit di unione che rendono molto più difficile la revisione della richiesta di pull. Invece, puoi fare un rebase.

inserisci la descrizione dell'immagine qui

Quando esegui il rebase, git trova la base del tuo ramo (in questo caso, b), trova tutti i commit tra quella base e HEAD (in questo caso, e e f), e riproduce quei commit sul HEAD del ramo ti stai basando su (in questo caso, master). Git crea in realtà nuovi commit che rappresentano ciò che le tue modifiche assomigliano al master: nel diagramma, questi commit sono chiamati e ‘ed f’. Git non cancella i tuoi precedenti commit: e e f rimangono intatti, e se qualcosa va storto con il rebase, puoi tornare al modo in cui erano le cose.

Quando molte persone diverse stanno lavorando a un progetto in modo simulato, le richieste di pull possono andare rapidamente in stallo. Una richiesta pull “obsoleta” è una che non è più aggiornata con la linea principale di sviluppo e deve essere aggiornata prima di poter essere unita al progetto. Il motivo più comune per cui le richieste di pull diventano obsolete a causa di conflitti: se due richieste pull modificano righe simili nello stesso file e una richiesta di pull viene unita, la richiesta pull non immersa avrà ora un conflitto. A volte, una richiesta di pull può andare in stallo senza conflitti: forse le modifiche in un file differente nella base di codice richiedono modifiche corrispondenti nella richiesta di pull per conformarsi alla nuova architettura, o forse il ramo è stato creato quando qualcuno ha accidentalmente unito i test delle unità falliti al ramo principale Indipendentemente dal motivo, se la richiesta di pull è scaduta, è necessario rebase del ramo sull’ultima versione del ramo master prima che possa essere unito.

La ridefinizione della cronologia riscrive. Se nessuno conosce questa storia, allora va benissimo. Se, tuttavia, quella storia è pubblicamente conosciuta, riscrivere la cronologia in Git funziona esattamente come nel mondo reale: hai bisogno di una cospirazione.

Le cospirazioni sono davvero difficili da tenere insieme, quindi è meglio evitare di ribaltare le filiali pubbliche in primo luogo.

Si noti che ci sono esempi di cospirazioni di successo: il ramo pu del repository git di Junio ​​C. Hamano (il repository ufficiale di Git SCM) viene ribadito frequentemente. Il modo in cui funziona è che praticamente tutti quelli che usano pu sono anche iscritti alla mailinglist degli sviluppatori di Git, e il fatto che il ramo pu sia ridefinito è ampiamente pubblicizzato sulla mailinglist e sul sito web di Git.

Un rebase altera la cronologia del tuo repository. Se spingi al di fuori del mondo, cioè, rendili disponibili agli altri, e poi cambi la tua visione della cronologia dei commit, diventa difficile lavorare con chiunque abbia la tua vecchia storia.

Rebase considerato dannoso è una buona panoramica, penso.