'Hai mai perso un ramo, il cui codice sorgente non è stato ancora unito al ramo' release 'o al ramo' main '? E se volessi rigenerare un ramo eliminato sebbene il suo lavoro sia già stato unito al ramo principale? ' . Ebbene, l'unica soluzione a tali scenari è Vai a Reflog .
Attraverso questo articolo su Git Reflog, ti aiuteròcomprendere gli scenari in cui si potrebbe perdere il lavoro su un ramo e come recuperare il ramo.Inoltre, questo articolo evidenzierà l'approccio che potresti adottare per prevenire la perdita involontaria di un ramo mentre lavori in un progetto di grandi dimensioni.
Quindi, iniziamo con questo articolo.
Considera uno scenario, un maintainer deve unire molti rami di funzionalità di diversi collaboratori e quindi eliminarli eventualmente, ma il ramo viene eliminato accidentalmente prima che il lavoro possa essere unito?
Bene, prima di passare a questo articolo, lascia che ti dica che non è possibile in Git. sono sicuri e agire come un posto di controllo non ti permetterebbe di farlo. Quindi, è qui che entra in gioco Git Reflog.
Cos'è Git Reflog?
IlIl comando 'reflog' mantiene un file traccia di ogni singola modifica apportata alle referenze (rami o tag) di un repository e mantiene una cronologia del registro dei rami e dei tag che sono stati creati localmente o estratti. I log di riferimento come l'istantanea del commit di quando il ramo è stato creato o clonato, estratto, rinominato o qualsiasi commit effettuato sul ramo viene mantenuto da ed elencati dal comando 'reflog'.
Nota: Il ramo sarà recuperabile dalla tua directory di lavoro solo se il ramo è mai esistito nel tuo repository locale, ad es. il ramo è stato creato localmente o estratto da un repository remoto nel tuo repository locale per Git per memorizzare i log della cronologia di riferimento.
Questo comando deve essere eseguito nel repository che aveva il ramo perso. Se consideri ilsituazione del repository remoto, quindi devi eseguire il comando reflog sulla macchina dello sviluppatore che aveva il ramo.
comando: vai a reflog
Ora che sai cos'è Git Reflog, faccelo sapereprovare a eliminare sia un ramo unito che uno non unito e vedere come Git lo gestisce?
Passaggio 1: elenca i rami che vengono uniti nel master
Per prima cosa, controlla in ' maestro 'Ramo se ti trovi su un altro ramo utilizzando il comando:
$ git checkout master
Produzione
Ora, per ottenere un elenco di rami uniti, menziona il seguente comando:
$ git branch --merged
Produzione:
differenza tra tabella hash e mappa hash
Passaggio 1.1: quindi, elimina il ramo unito:
$ git branch -d problema # 902
Produzione:
Il ramo 'problema n. 902' è stato eliminato con successo perché è già unito al ramo 'principale'.
Passaggio 2: ora, elenchiamo i rami che non sono stati uniti nel master.
$ git branch --no-merged
Produzione
Passaggio 2.2: Infine, eliminiamo un ramo non unito con il seguente comando:
$ git branch -d prepod
Se provi a eliminare uno dei rami con un lavoro non finito, dì ramo 'preprod', git visualizza un messaggio di avviso.
Produzione
Ora, prima di dirti come recuperare i dati in questo articolo su Git Reflog, lascia che ti dica cosa succede esattamente quando un ramo viene eliminato e in quali circostanze può essere ripristinato.
Come e quando viene eliminata una filiale?
Come sappiamo che Git è un file Sistema di controllo della versione distribuito (DVCS), ogni macchina con il clone o una copia del repository agisce come entrambi nodo e a centro . Questoimplica che ogni macchina avrà la propria copia dell'intero codice e della cronologia del repository.Inutile dire che lo sarai condivisione il tuo lavoro con gli altri e pubblicazione lo stesso.
Pertanto, in tali scenari, potrebbero esserci 3 casi in cui un ramo viene eliminato in uno scenario reale con molti collaboratori che lavorano su un progetto di grandi dimensioni. I seguenti potrebbero essere i casi:
Caso 1: uno sviluppatore può unire o eliminare il ramo
Si consideri uno scenario in cui uno sviluppatore unisce localmente il ramo della funzionalità al ramo principale e quindi elimina il ramo della funzionalità utilizzando il ' git branch 'Comando con il '- d 'Come mostrato negli screenshot precedenti.
Comando: 'Git branch -d branch_name'
Potrebbe anche accadere che lo sviluppatore decida di cestinare le modifiche sul ramo e decida di eliminare il ramo senza unirlo a nessun altro ramo utilizzando il seguente comando:
Comando: 'Git branch -D branch_name'
Con il comando precedente, lo sviluppatore èeliminare forzatamente il ramo sovrascrivendo l'avviso git
$ git branch -D preprod
Produzione
Nota : Il ramo 'preprod' non sarà più elencato quando esegui il comando 'git branch'. Soiail nostro lavoro salvato su questo ramo andrà perso.
Caso 2: uno sviluppatore elimina un ramo in un repository condiviso
Si consideri uno scenario in cui uno sviluppatore con accesso in lettura / scrittura tenta di eliminare forzatamente il ramo remoto tramiteutilizzando il comando 'git push' con il flag '–delete'.
$ git push origin --delete quickfix
Produzione
Oltre a questo, potrebbe anche verificarsi un caso in cui un utente non autorizzato o malintenzionato forza un push per eliminare il ramo remoto.In tal caso, il manutentore sarà in grado di recuperare il ramo 'quickfix' cancellato solo se lo sviluppatoreaveva precedentemente verificato questo ramo. In questo scenario, il suo repository locale ne avrà ancora i log di riferimento.
Se il manutentore non può recuperare il ramo, allora il proprietario del ramo che lo ha cancellato deve ripristinarlo dai suoi reflog locali.
Caso 3 - Uno script hook con super privilegi elimina il ramo
Questo potrebbe essere uno scenario raro ma possibile in cui uno script hook viene attivato in un determinato evento di operazione git e forza l'eliminazione dei rami che non sono ancora stati uniti. Puoiconsidera che uno dei comandi sopra menzionati sia stato scritto in uno script hook con privilegi sudo.
Ora che sai cosa succede, quando elimini il ramo, passiamo a questo articolo su Git Reflog e vediamo come recuperare un ramo perso.
Recupera un ramo cancellato usando Git Reflog
Passo 1 : Registri storici di tutti i riferimenti
Ottieni un elenco di tutti i log della cronologia locale registrata per tutti i riferimenti ('master', 'uat' e 'prepod') in questo repository.
vai a reflog
Passo 2 : Identifica il timbro della storia
Come puoi fare riferimento dall'istantanea sopra, il file ID commit evidenziato: e2225bb insieme all'indice del puntatore HEAD: 4 è quello in cui ' rivendita 'Ramo è stato creato dal puntatore HEAD corrente che punta al tuo ultimo lavoro.
Passaggio 3 : Recuperare
Per recuperare indietro il file 'Rivendita 'Branch usa il comando'Git checkout' passando il riferimento al puntatore HEAD con l'indice id - 4.Questo è il riferimento del puntatore quando il ramo 'preprod' è stato creato con un lungo commit id evidenziato nello screenshot di output.
git checkout -b preprod HEAD @ {4}
Produzione
E voilà! ' rivendita 'Branch viene ripristinato con tutto il codice sorgente.
NOTA : Fammi besegui il comando 'git checkout' utilizzato sopra e ti aiuta a capire meglio:
trova il numero massimo nell'array java
Il comando 'git checkout' è un comando sovraccarico (proprio come qualsiasi funzione di sovraccarico di Java). Questa è la parte in cui viene ripristinato il ramo effettivo.
Questo singolo comando controlla prima il timestamp della cronologia precedente indicato da Puntatore HEAD @ {4} e quindi crea un ramo con il nome 'preprod' utilizzando l'opzione '-b' e passa la directory di lavoro al ramo appena creato.
Ciò implica che il ramo commutato sarà da 'master' a 'preprod' come indicato nella schermata di output.Ora puoi unirlo con 'master' o il ramo 'release' secondo il tuo modello di ramificazione.
Ora che sai come ripristinare un ramo, lascia che ti dica quale lavoro viene ripristinato quando viene ripristinato un ramo eliminato.
Quale lavoro viene ripristinato quando viene ripristinato il ramo eliminato?
I file che erano stati nascosti e salvati nell'elenco dell'indice di stash verranno ripristinati. Tutti i file non tracciati andranno persi. Anche ioÈ una buona idea mettere sempre in scena e impegnare il proprio lavoro o metterlo da parte.
Per recuperare i riferimenti del registro di un particolare ramo o tag, eseguire il comando 'git reflog'.
Esempio: per controllare i riferimenti di registro del solo ramo 'uat', utilizzare il comando 'git reflog uat'.
Sottocomandi Git Reflog
vai a reflog
Comando per aprire la pagina di manuale
$ git reflog --help
Produzione
vai a reflog spettacolo
Mostra i log del riferimento fornito nella riga di comando.
git reflog show master @ {0}
vai a reflog scadere
Questo comando viene utilizzato per eliminare le vecchie voci di reflog.
git reflog scadere
vai a reflog Elimina
Questo comando elimina singole voci dalla cronologia reflog.
git reflog elimina
vai a reflog esiste
Questo comando controlla se un ref (ramo o tag) ha un reflog - voci della cronologia del log.
git reflog esiste
Oltre ai comandi sopra menzionati, il comando 'Git Reflog' accetta vari sottocomandi e diverse opzioni a seconda dei sottocomandi menzionati sopra. Per ulteriori letture corri ' git reflog –help 'Dalla finestra del terminale.
Con questo, arriviamo alla fine di questo articolo su Git Reflog.L'intenzione di DevOps è creare software di migliore qualità più rapidamente e con maggiore affidabilità, invitando al contempo una maggiore comunicazione e collaborazione tra i team. Se sei incuriosito da questo articolo, c diamine il da Edureka, una società di formazione online affidabile con una rete di oltre 250.000 studenti soddisfatti sparsi in tutto il mondo. Il corso di formazione sulla certificazione DevOps Edureka aiuta gli studenti a capire cos'è DevOps e acquisire esperienza in vari processi e strumenti DevOps come Puppet, Jenkins, Nagios, Ansible, Chef, Saltstack e GIT per l'automazione di più passaggi in SDLC.
Hai domande per noi? Per favore, menzionalo nella sezione commenti dell'articolo 'Git Reflog' e ti risponderemo al più presto.