Git Reflog - Come recuperare un ramo eliminato che non è stato unito



Questo articolo su Git Reflog è una guida completa su come ripristinare i branch eliminati in Git con l'aiuto di Git Reflog.

'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.





    1. Cos'è Git Reflog?
    2. Come e quando viene eliminata una filiale?
    3. Recupera un ramo eliminato
    4. Quale lavoro viene ripristinato quando viene ripristinato il ramo eliminato?
    5. Sottocomandi Git Reflog

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

Git Checkout Master - Git Reflog - Edureka

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.