Come spostare HEAD in una posizione precedente? (Testa staccata)

In git, stavo cercando di fare un commit di squash fondendomi in un altro ramo e poi reimpostando HEAD nel posto precedente tramite:

 git reset origin/master 

Ma ho bisogno di uscire da questo. Come posso spostare HEAD nella posizione precedente?

Ho il SHA1 frag ( 23b6772 ) del commit di cui ho bisogno per spostarlo.
Come posso tornare a questo commit?

Prima di rispondere aggiungiamo un po ‘di background, spiegando cos’è questo HEAD .

First of all what is HEAD?

HEAD è semplicemente un riferimento al commit corrente (più recente) sul ramo corrente.
Può esserci un solo HEAD in qualsiasi momento. (escluso git worktree )

Il contenuto di HEAD è memorizzato all’interno di .git/HEAD e contiene i 40 byte SHA-1 del commit corrente.


detached HEAD

Se non si è sul commit più recente – significa che HEAD punta a un commit precedente nella cronologia chiamato detached HEAD .

inserisci la descrizione dell'immagine qui

Sulla riga di comando sarà simile a questo: SHA-1 invece del nome del ramo poiché l’ HEAD non punta alla punta del ramo corrente

inserisci la descrizione dell'immagine qui


Alcune opzioni su come recuperare da un HEAD distaccato:


git checkout

 git checkout  git checkout -b   git checkout HEAD~X // x is the number of commits t go back 

Questo controllerà il nuovo ramo che punta al commit desiderato.
Questo comando eseguirà il checkout su un dato commit.
A questo punto puoi creare un ramo e iniziare a lavorare da questo punto in poi.

 # Checkout a given commit. # Doing so will result in a `detached HEAD` which mean that the `HEAD` # is not pointing to the latest so you will need to checkout branch # in order to be able to update the code. git checkout  # create a new branch forked to the given commit git checkout -b  

git reflog

Puoi sempre usare anche il reflog .
git reflog visualizzerà tutte le modifiche che hanno aggiornato l’ HEAD e verificando la voce di reflog desiderata imposterà il HEAD su questo commit.

Ogni volta che l’HEAD viene modificato ci sarà una nuova voce nel reflog

 git reflog git checkout [email protected]{...} 

Questo ti riporterà al commit desiderato

inserisci la descrizione dell'immagine qui


git reset --hard

“Sposta” il TESTO indietro al commit desiderato.

 # This will destroy any local modifications. # Don't do it if you have uncommitted work you want to keep. git reset --hard 0d1d7fc32 # Alternatively, if there's work to keep: git stash git reset --hard 0d1d7fc32 git stash pop # This saves the modifications, then reapplies that patch after resetting. # You could get merge conflicts, if you've modified things which were # changed since the commit you reset to. 
  • Nota: ( dal momento che Git 2.7 )
    puoi anche usare anche git rebase --no-autostash .


git revert

“Annulla” l’intervallo di commit o commit specificato.
Il comando reset “annulla” tutte le modifiche apportate al commit specificato.
Un nuovo commit con la patch di annullamento verrà eseguito mentre il commit originale rimarrà nella cronologia.

 # add new commit with the undo of the original one. # the  can be any commit(s) or commit range git revert  

Questo schema illustra quale comando fa cosa.
Come puoi vedere, il reset && checkout modificano l’ HEAD .

inserisci la descrizione dell'immagine qui

Ecco un approccio che può essere molto semplice e facile da ricordare. Controlla 2 condizioni e finisci con 1 comando. Quindi sei di nuovo in pista.

Se

sei nella ‘testa distaccata’
(es. digita git status ; vedi HEAD detached at )

E

una filiale esistente si adatta alle tue esigenze
(es. scrivi git branch -v , vedi un nome di ramo con un messaggio di commit relativo che rappresenta il lavoro che vuoi continuare)

Poi

semplicemente controlla quel ramo (es. digita git checkout ; vedi Switched to branch ).

risultati

Ora puoi continuare ad aggiungere e impegnare il tuo lavoro come prima; le modifiche verranno tracciate su .

Tieni presente che se hai salvato il lavoro mentre HEAD è stato rimosso, nella maggior parte dei casi il lavoro verrà unito automaticamente nel processo sopra riportato. Se vedi un messaggio relativo a un conflitto di unione, non lasciarti prendere dal panico. Esistono diversi tutorial eccellenti con semplici passaggi per risolvere il conflitto e completare l’unione.

La domanda può essere letta come:

Ero in stato indipendente con HEAD al 23b6772 e 23b6772 digitato git reset origin/master (perché volevo schiacciare). Ora ho cambiato idea, come posso tornare a HEAD essere al 23b6772 ?

La risposta diretta è: git reset 23b6772

Ma ho risposto a questa domanda perché mi sono stancato di digitare (copiare e incollare) gli hash di commit o la sua abbreviazione ogni volta che volevo fare riferimento al precedente HEAD e cercavo su Google se c’era qualche tipo di stenografia.

Si scopre che c’è!

git reset - (o nel mio caso git cherry-pick - )

Che incidentalmente era lo stesso di cd - per tornare alla precedente directory corrente in * nix! Quindi evviva, hai imparato due cose con una fava.