Innanzitutto, ho ottenuto "la tua filiale è in anticipo rispetto a origin / master di 3 commit", quindi la mia app è tornata a un tempo precedente con modifiche precedenti.
Come posso ottenere ciò che ho trascorso nelle ultime 11 ore facendo?
Innanzitutto, ho ottenuto "la tua filiale è in anticipo rispetto a origin / master di 3 commit", quindi la mia app è tornata a un tempo precedente con modifiche precedenti.
Come posso ottenere ciò che ho trascorso nelle ultime 11 ore facendo?
Risposte:
git reflog
È tuo amico. Trova il commit in cui desideri essere presente in quell'elenco e puoi ripristinarlo (ad esempio:) git reset --hard e870e41
.
(Se non hai eseguito il commit delle modifiche ... potresti essere nei guai: commetti in anticipo e commetti spesso!)
git log HEAD@{1}
. Se sembra la giusta serie di commit, allora puoi farlo git reset HEAD@{1}
.
git fsck --lost-found
.
Prima di rispondere, aggiungiamo alcuni retroscena, spiegando di cosa si HEAD
tratta.
First of all what is HEAD?
HEAD
è semplicemente un riferimento al commit corrente (più recente) sul ramo corrente.
Può essercene solo uno HEAD
in qualsiasi momento (escluso git worktree
).
Il contenuto di HEAD
è memorizzato all'interno .git/HEAD
e contiene i 40 byte SHA-1 del commit corrente.
detached HEAD
Se non si esegue l'ultimo commit, ovvero HEAD
viene chiamato un commit precedente nella cronologia detached HEAD
.
Sulla riga di comando, sarà simile al seguente: SHA-1 invece del nome del ramo poiché HEAD
non punta alla punta del ramo corrente:
git checkout
git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back
Questo verificherà il nuovo ramo che punta al commit desiderato.
Questo comando eseguirà il checkout per un determinato 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 <commit-id>
# Create a new branch forked to the given commit
git checkout -b <branch name>
git reflog
Puoi sempre usare reflog
anche quello.
git reflog
visualizzerà qualsiasi modifica che ha aggiornato il HEAD
e il checkout della voce di reflog desiderata HEAD
riporterà questo commit.
Ogni volta che HEAD viene modificato, ci sarà una nuova voce in reflog
git reflog
git checkout HEAD@{...}
Questo ti riporterà al commit desiderato
git reset --hard <commit_id>
"Sposta" HEAD 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.
git rebase --no-autostash
anche questo.git revert <sha-1>
"Annulla" l'intervallo di commit o commit specificato.
Il comando reset "annulla" tutte le modifiche apportate nel commit dato.
Verrà eseguito il commit di un nuovo commit con la patch di annullamento mentre il commit originale rimarrà anche nella cronologia.
# Add a new commit with the undo of the original one.
# The <sha-1> can be any commit(s) or commit range
git revert <sha-1>
Questo schema illustra quale comando fa cosa.
Come puoi vedere lì, reset && checkout
modifica il HEAD
.
git reset --hard <commit_id>
, rimozione ha HEAD
funzionato! +1 per la rappresentazione grafica !!.
git reflog <branchname>
può essere molto utile, poiché vedi i cambiamenti di un solo ramo.
Un altro modo per arrivare al commit cancellato è con il git fsck
comando.
git fsck --lost-found
Questo produrrà qualcosa di simile all'ultima riga:
dangling commit xyz
Possiamo verificare che sia lo stesso commit usando reflog
come suggerito in altre risposte. Ora possiamo fare ungit merge
git merge xyz
Nota:
non è possibile recuperare il commit con fsck
se abbiamo già eseguito un git gc
comando che rimuoverà il riferimento al commit dangling.