Come posso rimuovere un commit su GitHub?
-
19-08-2019 - |
Domanda
I " accidentalmente " ha inviato un commit a GitHub.
È possibile rimuovere questo commit?
Voglio ripristinare il mio repository GitHub com'era prima di questo commit.
Soluzione
Nota: vedi alternativa a
git rebase -i
nei commenti qui sotto & # 8212;
git reset --soft HEAD^
Innanzitutto, rimuovi il commit dal tuo repository locale. Puoi farlo usando git rebase -i HEAD~2
. Ad esempio, se è il tuo ultimo commit, puoi fare git push origin +branchName --force
ed eliminare la seconda riga nella finestra dell'editor che si apre.
Quindi, forza il push su GitHub usando git stash
Vedi Git Magic Capitolo 5: Lessons of History - E Quindi alcuni per ulteriori informazioni (ad esempio se si desidera rimuovere i commit precedenti).
Oh, e se il tuo albero di lavoro è sporco, devi prima fare un git stash apply
e poi un <=> dopo.
Altri suggerimenti
git push -f origin HEAD^:master
Questo dovrebbe " annullare " la spinta.
Per un facile ripristino se si tratta solo di un errore (forse hai biforcuto un repository, quindi hai finito per spingere verso l'originale anziché verso uno nuovo) ecco un'altra possibilità:
git reset --hard 71c27777543ccfcb0376dcdd8f6777df055ef479
Ovviamente scambia quel numero con il numero del commit a cui vuoi tornare.
Tutto da allora verrà cancellato una volta premuto di nuovo. Per fare ciò, il prossimo passo sarebbe:
git push --force
-
git log
per scoprire il commit che desideri ripristinare -
git push origin +7f6d03:master
mentre 7f6d03 è il commit prima del commit erroneamente spinto.+
era perforce push
E questo è tutto.
Qui è un'ottima guida che risolve il tuo problema, facile e semplice!
Nel caso in cui desideri mantenere le modifiche di commit dopo l'eliminazione:
Nota che questa soluzione funziona se il commit da rimuovere è l'ultimo impegnato.
1 - Copia il riferimento di commit a cui desideri tornare dal registro:
git log
2 - Reimposta git sul riferimento di commit:
git reset <commit_ref>
3 - Blocca / archivia le modifiche locali dal commit errato da utilizzare in seguito dopo averle inviate al telecomando:
git stash
4 - Invia le modifiche al repository remoto, (-f o --force):
git push -f
5 - Ripristina le modifiche memorizzate nel repository locale:
git stash apply
7 - Nel caso in cui siano presenti file non tracciati / nuovi nelle modifiche, è necessario aggiungerli a git prima di eseguire il commit:
git add .
6 - Aggiungi tutte le modifiche extra necessarie, quindi esegui il commit dei file necessari (o usa un punto '.' invece di indicare ogni nome di file, per eseguire il commit di tutti i file nel repository locale:
git commit -m "<new_commit_message>" <file1> <file2> ...
o
git commit -m "<new_commit_message>" .
Dovrai svuotare la cache per cancellarla completamente. questa pagina di aiuto di git ti aiuterà. (mi ha aiutato) http://help.github.com/remove-sensitive-data/
Usa git revert
per ripristinare la tua spinta.
git-revert - Ripristina alcuni commit esistenti
git revert [--edit | --no-edit] [-n] [-m parent-number] [-s] <commit>... git revert --continue git revert --quit git revert --abort
Annulla le modifiche introdotte dalle patch correlate e registra alcuni nuovi commit che le registrano. Ciò richiede che l'albero di lavoro sia pulito (nessuna modifica dal commit HEAD).
1. git reset HEAD^ --hard
2. git push origin -f
Questo lavoro per me.
Per eliminare il commit dal repository remoto:
git push -f origin last_known_good_commit:branch_name
Per eliminare il commit dal tuo repository locale:
git reset --hard HEAD~1
Elimina il commit più recente, mantenendo il lavoro svolto:
git reset --soft HEAD~1
Elimina il commit più recente, distruggendo il lavoro svolto:
git reset --hard HEAD~1
Trova le specifiche di riferimento del commit che vuoi essere il capo del tuo ramo su Github e usa il seguente comando:
git push origin +[ref]:[branchName]
Nel tuo caso, se vuoi solo tornare indietro di un commit, trova l'inizio del ref per quel commit, ad esempio è 7f6d03 e il nome del ramo che vuoi cambiare, ad esempio è master e procedi come segue:
git push origin +7f6d03:master
Il carattere più viene interpretato come --force
, che sarà necessario poiché stai riscrivendo la cronologia.
Nota che ogni volta che <=> un impegno potresti potenzialmente riscrivere la storia di altre persone che uniscono il tuo ramo. Tuttavia, se riscontri il problema rapidamente (prima che qualcun altro unisca la tua filiale), non avrai problemi.
Devi conoscere il tuo hash di commit dal commit che vuoi ripristinare. Puoi ottenerlo da un URL GitHub come: https://github.com/your -organizzazione / il-tuo-progetto / impegna / master
Supponiamo che l'hash del commit (dove vuoi tornare a) sia " 99fb454 " (versione lunga " 99fb45413eb9ca4b3063e07b40402b136a8cf264 "), quindi tutto ciò che devi fare è:
git reset --hard 99fb45413eb9ca4b3063e07b40402b136a8cf264
git push --force
Se lo stai facendo perché hai dati sensibili in un commit, usare le altre risposte qui non è sicuro (eccetto quelli di subutux, che espanderò).
La guida github su questo consiglia di utilizzare uno strumento esterno, ma io preferisco usare quello incorporato.
Innanzitutto, esegui un backup del tuo repository . Poi:
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA' \
--prune-empty --tag-name-filter cat -- --all
Successivamente, assicurati che il repository sia nello stato desiderato . Potresti voler diff contro il backup.
Se sei sicuro che sia corretto, allora:
#get rid of old unreferenced commits (including the data you want to remove)
git gc --prune=now
git push origin --force --all
Potresti voler conservare il backup locale per un po ', per ogni evenienza.
Esegui questo comando sul tuo terminale.
git reset HEAD~n
Puoi rimuovere gli ultimi n commit dal repository locale, ad es. HEAD ~ 2. Procedi con force git push sul tuo repository.
git push -f origin <branch>
Spero che questo aiuti!
Per preservare la struttura delle ramificazioni e delle fusioni è importante utilizzare l'opzione --preserve-merges
quando si effettua il rebase:
git rebase --preserve-merges -i HEAD^^
Salva prima le modifiche locali da qualche parte sul lato (backup)
Puoi sfogliare i tuoi commit recenti, quindi selezionare un hash di commit facendo clic su " Copia l'intero SHA " per inviarlo negli Appunti.
Se il tuo ultimo hash di commit è, diciamo g0834hg304gh3084gh (per esempio)
Devi eseguire:
git push origin +g0834hg304gh3084gh:master
Usando l'hash che hai copiato in precedenza per renderlo " HEAD " revisione.
Aggiungi le modifiche locali desiderate. Fatto;)
Per GitHub
- Ripristina i tuoi commit (HARD) nel tuo repository locale
- Crea un nuovo ramo
- Invia il nuovo ramo
- Elimina ramo OLD (creane uno nuovo come ramo predefinito se stai eliminando il ramo principale)
se vuoi rimuovere do rebase interattivo,
git rebase -i HEAD~4
4 represents total number of commits to display count your commit and
modificalo di conseguenza
ed elimina il commit desiderato dall'elenco ...
salva le modifiche con Ctrl + X (ubuntu) o :wq(centos)
2o metodo, ripristina
git revert 29f4a2 #your commit ID
questo ripristinerà il commit specifico
Non è molto bello riscrivere la storia. Se utilizziamo git revert <commit_id>
, viene creato un commit inverso pulito di detto ID commit.
In questo modo, la storia non viene riscritta, invece, tutti sanno che c'è stato un ritorno.
Aggiungi / rimuovi file per ottenere le cose come vuoi:
git rm classdir
git add sourcedir
Quindi modificare il commit:
git commit --amend
Il precedente, errato commit verrà modificato per riflettere il nuovo stato dell'indice - in altre parole, sarà come se non avessi mai commesso l'errore in primo luogo
Nota che dovresti farlo solo se non l'hai ancora fatto. Se hai spinto, dovrai solo eseguire una correzione normalmente.
In GitHub Desktop puoi semplicemente fare clic con il pulsante destro del mouse sul commit e ripristinarlo, creando così un nuovo commit che annulla le modifiche.
Il commit accidentale rimarrà comunque nella tua cronologia (che potrebbe essere un problema se, ad esempio, hai commesso accidentalmente una chiave API o una password) ma il codice verrà ripristinato.
Questa è l'opzione più semplice e facile, la risposta accettata è più completa.