Ho parlato prima di come la storia di una base di codice sia importante quanto la base di codice stessa. Rebase è lo strumento che può rendere il singolo più grande impatto per raggiungere questo obiettivo. La conoscenza preliminare dei concetti fondamentali del controllo del codice sorgente è fondamentale per comprendere questo post.,

Ricordate, anche se si può utilizzare il Valore per il seguente (e forse più) dei casi, rimane la migliore pratica per commettere presto e spesso:

  • Modifica/rielaborare un commit nella storia
  • Aggiungere un commit nella storia di un insieme di modifiche (o ramo)
  • Rimuovere un commit, dalla storia di una serie di modifiche (o ramo)
  • Split a impegnarsi in diversi commit
  • Combinare una serie di commit in un commit
  • Re-ordine commit

che Cosa Rebase dire?,

git rebase – Riapplicare si impegna sulla cima di un’altra punta

git rebase

Se si sostituisce la parola ‘base’ con ‘antenato’ che significa la stessa cosa, in altre parole:

Dare un nuovo antenato di un impegno o di una sequenza di commit.

‘base’ è usato nella documentazione per consentire alla base di indicare un ramo, un commit, un tag o qualsiasi altra cosa a cui si possa fare riferimento all’interno di git.,

Come discusso prima, un commit contiene – tra le altre cose – l’id del suo commit padre. Come tale Rebase sta effettivamente aggiornando il commit genitore per il set di commit forniti.

È anche importante ricordare che ogni commit in Git è immutabile, anche per Rebase. Come tale Rebase ricreerà ogni commit, concatenandoli tutti insieme ma con il nuovo antenato.

Rebase è un po ‘ come l’Almanacco sportivo Grays: può cambiare tutto!
Da tenor.com

Le regole!,

Quando si utilizza Rebase ci sono alcune regole che è necessario rispettare – altrimenti un mondo di dolore può derivare.

  1. Non Rebase mai un ramo pubblico – uno che altre persone stanno usando

Ricorda che Rebase deve seguire le regole di un commit – che è immutabile. Come tale verrà creato un nuovo commit per ogni fase del processo. Ciò significa che “tirerai il tappeto da sotto i piedi” di chiunque usi il “vecchio” commit.,

Git vedrà che il commit esiste due volte – la prima versione e la versione Rebased – e potenzialmente si confondono quando si tenta di unire le modifiche insieme. Inoltre la cronologia mostrerà il commit due volte, anche se con ID diversi. Un po ‘ come avere due Marty nella stessa linea temporale-confusione!

Ulteriori letture:

  • Regole di rebasing

Cosa succede se va storto

Come con Ritorno al Futuro, c’è sempre una via d’uscita da qualsiasi problema che potrebbe emergere., Mentre Rebase crea nuovi commit, il ramo può essere ripristinato al vecchio commit e sei tornato dove eri prima. Suggerirei di spingere sempre il tuo ramo su remote prima di usare Rebase, specialmente se ne hai meno familiarità. Si aggiunge solo un altro livello di sicurezza nel caso in cui ne avete bisogno.

Prima di usare Rebase, prendi nota di dove eri – qual è l’id di commit o il nome del ramo se non è cambiato da remoto.,

Se il Rebase non riesce a metà e si desidera annullare l’/interrompere e tornare a dove eravate prima, si possono eseguire: git rebase --abort

Se il ramo è stato spinto prima a mano e si desidera ripristinare ciò che il ramo sembra in remoto: git reset --hard origin/<branch name>

Se si dispone solo di commit precedente id: git reset --hard <commit SHA>

Ciascuno dei comandi di cui sopra dovrà reimpostare la corrente del ramo di nuovo a dove erano prima di iniziare il Rebase attività.,

Lettura ulteriore:

  • git-rebase

Rebase interattivo

Rebase può essere utilizzato in una delle due diverse modalità, interattiva e non interattiva. Entrambi fanno la stessa cosa, ma l’edizione interattiva consente la manipolazione del processo.

Quindi abbiamo descritto Rebase come uno strumento in grado di fornire un nuovo antenato a un set di commit. Rebase creerà uno ‘script’ (un po ‘ come una lista di cose da fare) di cui i commit saranno interessati. La versione non interattiva di Rebase produce questo script quindi lo esegue immediatamente.,

La versione interattiva consente di modificare questo script prima che venga eseguito.

Lo script è semplicemente un insieme ordinato di comandi da eseguire. È un file di testo che contiene ogni ID di commit e cosa dovrebbe essere fatto con esso. Il messaggio per ogni commit è incluso per chiarezza.

Un esempio di script Rebase interattivo è simile a:

pick 509de5ac New post - Building performant large scale web applications (#1344)pick 449486aa Source control - when blog post (#1345)pick 3d4e82be Add fundamentals blog post

In quanto sopra, pick significa aggiungere il commit dato come figlio sul commit precedente. Quindi la storia, dalla base data, sarà esattamente come quella fornita sopra., Lo script funziona dall’alto verso il basso, quindi il commit in basso sarà l’ultimo commit aggiunto al ramo.

Puoi scegliere diversi comandi invece di pick, sono:

In molti casi puoi causare conflitti di unione mentre la Rebase progredisce attraverso il suo script. Questo è normale e niente di cui preoccuparsi. Dovrai solo risolvere i conflitti prima di poter procedere. In questo caso, utilizzare git mergetool per risolvere i conflitti. Una volta risolti, utilizzare git rebase --continue per continuare il processo., Naturalmente, se si desidera interrompere il processo di Rebase, utilizzare git rebase --abort.

Vale la pena notare che Rebase è abbastanza intelligente da creare solo nuovi commit dove sa che qualcosa è cambiato. Se il genitore di un commit è lo stesso di prima, manterrà il commit così com’è e andrà avanti finché non avrà del lavoro da fare. Di seguito sono riportati alcuni esempi per dimostrare gli usi di Rebase a vari fini. Tutti presumono che la “base” sia cambiata e come tale Rebase ha del lavoro da fare in ogni fase del processo.,

Modifica/rielaborare un commit nella cronologia

Considera lo scenario in cui è necessario correggere un errore di battitura in un file. Vuoi modificare il commit in modo che il commit sia pulito e appropriato – non vuoi avere un altro commit che corregge l’errore di battitura in seguito.,=”5779374de0″>

  • Attendere per la modifica/modifica commit 449486aa
  • Aggiungere commit 3d4e82be impostazione di suo padre per il nuovo id per 449486aa
  • Al passaggio 4, è possibile apportare le modifiche necessarie e modificare il commit, per esempio:

    1. Modificare il file
    2. Fase il file (git add <file>)
    3. Commit del file, che modifica il commit (git commit --amend)

    Quando hai finito la modifica è necessario eseguire git rebase --continue per procedere con il passaggio 5 per completare il processo.,

    la Correzione di un errore di battitura in un messaggio di commit

    reword il comando è lo stesso come il edit comando – tranne che richiede solo il messaggio che deve essere modificato, piuttosto che il commit di contenuti, per esempio:

    pick 509de5ac New post - Building performant large scale web applications (#1344)reword 449486aa Source control - when blog post (#1345)pick 3d4e82be Add fundamentals blog post

    Non dimenticare, cambiare il messaggio nel copione NON cambia il contenuto del messaggio di commit. Salvare e chiudere lo script e attendere che Rebase riapra l’editor dei messaggi per il commit / i scelto / i.,

    Aggiungi un commit nella cronologia di un set di modifiche (o ramo)

    Considera lo scenario in cui devi apportare una modifica aggiuntiva alla base di codice dopo un commit. Hai dimenticato di farlo e vuoi assicurarti che sia nel posto giusto nella storia, subito dopo il commit appropriato., 509de5ac

  • Attendere per apportare le modifiche necessarie
  • Aggiungere commit 3d4e82be, l’impostazione di suo padre per il nuovo id per il nuovo commit hai creato
  • Invece di modificare 449486aa questa volta, è possibile aggiungere un nuovo commit invece, per esempio:

    1. Effettuare la modifica/s
    2. Fase i file/s (git add <file>)
    3. eseguire il Commit della modifica/s (git commit)

    Quando hai finito la modifica è necessario eseguire git rebase --continue per procedere con il passaggio 5 per completare il processo., Alla fine del processo avrai 4 commit nella cronologia piuttosto che 3.

    Rimuovi un commit dalla cronologia di un set di modifiche (o ramo)

    Considera lo scenario in cui hai commesso una modifica che non vuoi mantenere e vuoi rimuoverla dalla cronologia. Forse hai commesso una modifica temporanea che vuoi espellere dal ramo prima che venga unito.,

    Puoi modificare lo script in modo che mostri qualcosa di simile al seguente:

    pick 509de5ac New post - Building performant large scale web applications (#1344)pick 3d4e82be Add fundamentals blog post

    Nota che la riga 2 (449486aa) è stata rimossa, quindi non sarà inclusa nel processo.,

    Quando si salva quindi chiudere il file, il Valore sarà:

    1. Ripristina il ramo alla base
    2. Aggiungere commit 509de5ac, l’impostazione di suo padre con il dato di base
    3. Aggiungere commit 3d4e82be impostazione di suo padre per il nuovo id per 509de5ac

    Alla fine del processo avrete 2 si impegna nella storia anziché 3.

    Dividi un commit in più commit

    Considera lo scenario in cui hai accidentalmente commesso due modifiche nello stesso commit., Vuoi dividerli in modo che la cronologia sia pulita; in modo che, se necessario in futuro, una parte del commit possa essere ripristinata senza ripristinarla tutta.,”>

    Quando si salva quindi chiudere il file, il Valore sarà:

    1. Ripristina il ramo alla base
    2. Aggiungere commit 509de5ac, l’impostazione di suo padre con il dato di base
    3. Aggiungere commit 449486aa impostazione di suo padre per il nuovo id per 509de5ac
    4. Attendere che consente di modificare questo commit
    5. Aggiungere commit 3d4e82be, l’impostazione di suo padre per il nuovo id per l’ultimo commit aggiunta durante la fase 4

    Invece di modificare il commit, ripristino di fuori, l’annullamento di fase 2, ma mantenendo le modifiche sul disco.,

    In modo da poter eseguire git reset HEAD~1. Questo rimuoverà il commit e inserirà tutte le modifiche nella copia di lavoro. Da lì si può scegliere di aggiungere i file in singole impegna, ossia

    1. git add <file1> allora git commit -m <message 1>
    2. git add <file2> allora git commit -m <message 2>

    Quando hai finito la modifica di cui hai bisogno, eseguire git rebase --continue per procedere con il passaggio 5 per completare il processo. Alla fine del processo avrai 5 (o più) commit nella cronologia piuttosto che 3.,

    Combina una serie di commit in un commit

    Considera lo scenario, hai fatto alcuni commit e devono essere uniti insieme: non hanno senso da soli o per qualche altro motivo.,p>È possibile modificare lo script in modo che mostra qualcosa di simile al seguente:

    pick 509de5ac New post - Building performant large scale web applications (#1344)pick 449486aa Source control - when blog post (#1345)squash 3d4e82be Add fundamentals blog post

    Quando si salva quindi chiudere il file, il Valore sarà:

    1. Ripristina il ramo alla base
    2. Aggiungere commit 509de5ac impostazione di suo padre con il dato di base
    3. Aggiungere commit commit contiene le modifiche da 449486aa e 3d4e82be, l’impostazione di suo padre per il nuovo id per 509de5ac
      1. Rebase per mettere in pausa e richiedi un messaggio, che viene preparata come una combinazione di entrambi i messaggi di commit, io.,e. “Controllo del codice sorgente-quando il post del blog (#1345) Aggiunge i fondamentali post del blog”
      2. Se vuoi prendere il messaggio dal primo commit così com’è, usa il comandofixup invece disquash.

    Puoisquashofixup quanti commit vuoi – non è limitato a 2 commit alla volta. Quando l’editor dei messaggi viene salvato e chiuso (se stai usando squash) Rebase continuerà fino alla fine dello script., Alla fine del processo avrai 2 commit nella cronologia piuttosto che 3. L’ultimo commit avrà il messaggio immesso nell’editor dei messaggi durante il passaggio 3. Git sarà predefinito concatenare i messaggi insieme, quando si utilizzasquash e utilizzare il primo messaggio quando si utilizzafixup.

    Riordina i commit

    Considera lo scenario, hai apportato alcune modifiche ma hanno più senso se sono in un ordine diverso.,

    Puoi modificare lo script in modo che mostri qualcosa di simile al seguente:

    pick 449486aa Source control - when blog post (#1345)pick 3d4e82be Add fundamentals blog postpick 509de5ac New post - Building performant large scale web applications (#1344)

    Nota che la riga 1 è stata spostata alla riga 3., Quando si salva quindi chiudere il file, il Valore sarà:

    1. Ripristina il ramo alla base
    2. Aggiungere commit 449486aa, l’impostazione di suo padre con il dato di base
    3. Aggiungere commit 3d4e82be impostazione di suo padre per il nuovo id per 449486aa
    4. Aggiungere commit 509de5ac, l’impostazione di suo padre per il nuovo id per 3d4e82be

    Alla fine del processo avrai la stessa si impegna, solo in un ordine diverso.,

    Nessun lavoro da fare

    Ho detto sopra che Rebase è abbastanza intelligente da non creare nuovi commit dove non è necessario – cioè quando la base/genitore è la stessa di prima., Questo è ciò che accade se non si modifica lo script iniziale, dunque, sembra ancora come questo quando si chiude l’editor:

    pick 509de5ac New post - Building performant large scale web applications (#1344)pick 449486aa Source control - when blog post (#1345)pick 3d4e82be Add fundamentals blog post
    1. Ripristina il ramo alla base, che è lo stesso come il padre di 509de5ac
    2. Aggiungere commit 509de5ac, il genitore è la stessa, Non sono necessarie altre modifiche in modo che il commit può essere utilizzato così com’è
    3. Aggiungere commit 449486aa, il padre è lo stesso: 509de5ac., Non sono necessarie altre modifiche quindi il commit può essere usato così com’è
    4. Aggiungi commit 3d4e82be, il genitore è lo stesso: 449486aa. Non sono necessarie altre modifiche, quindi il commit può essere usato così com’è

    Alla fine del processo non sarà cambiato nulla sul ramo – tutti i commit esisteranno ancora e nello stesso ordine. In verità Rebase è ancora più intelligente di questo, ma sto usando questa semplificazione per dimostrare che Rebase ricreerà i commit solo quando è necessario.,

    Ulteriori letture

    • Git rebase
    • Regole di rebasing