Voglio scartare tutte le modifiche fatte dopo il commit <commit-hash>
.
Così ho fatto:
git reset --hard <commit-hash>
Ora voglio fare lo stesso con il mio remoto. Come posso farlo? Ho fatto alcuni commit (e push) dopo <commit-hash>
e voglio solo scartarli tutti. È solo che qualcosa è andato terribilmente storto nel modo e non voglio peggiorare la situazione rispetto a come è già. ;(
In pratica voglio riavvolgere il mio origin/master
a <commit-hash>
Assumendo che il tuo ramo si chiami master
sia qui che in remoto, e che il tuo remoto si chiami origin
potresti fare:
git reset --hard <commit-hash>
git push -f origin master
Tuttavia, dovresti evitare di farlo se qualcun altro sta lavorando con il tuo repository remoto e ha estratto le tue modifiche. In questo caso, sarebbe meglio revert i commit che non vuoi, poi fai il push normalmente.
Aggiornamento: hai spiegato di seguito che altre persone hanno tirato le modifiche che tu hai spinto, quindi è meglio creare un nuovo commit che revoca tutte quelle modifiche. C'è una bella spiegazione delle opzioni per fare questo in questa risposta di Jakub Narębski. Quale sia il più conveniente dipende da quanti commit vuoi ripristinare, e quale metodo ha più senso per te.
Poiché dalla tua domanda è chiaro che hai già usato git reset --hard
per resettare il tuo ramo master
, potresti aver bisogno di iniziare a usare git reset --hard ORIG_HEAD
per spostare il tuo ramo dove era prima. (Come sempre con git reset --hard
, assicurati che git status
sia pulito, che sei sul ramo giusto e che sei a conoscenza di git reflog
come strumento per recuperare i commit apparentemente persi). Dovresti anche controllare che ORIG_HEAD
punti al commit giusto, con git show ORIG_HEAD
.
Risoluzione dei problemi:
Se ottieni un messaggio come "! [remote rejected] a60f7d85 -> master (pre-receive hook declined)"
allora devi permettere la riscrittura della cronologia del ramo per il ramo specifico. In BitBucket per esempio dice "Riscrivere la storia del ramo non è permesso". C'è una casella di controllo chiamata Allow rewriting branch history
che devi selezionare.
**Usa le altre risposte se non ti importa di perdere le modifiche locali. Questo metodo può ancora distruggere il tuo remoto se scegli l'hash di commit sbagliato a cui tornare.
Se vuoi solo che il remoto corrisponda ad un commit che è già nel tuo ramo locale:
Non fare non alcun reset.
Usa git log
per trovare l'hash del commit che vuoi far corrispondere al remoto. git log -p
per vedere i cambiamenti, o git log --graph --all --oneline --decorate
per vedere un albero compatto. (Avere quest'ultimo come alias nella tua shell è molto comodo).
Copia l'hash.
Esegui un comando come:
git push --force <remote> <the-hash>:<il ramo remoto>
ad es.
git push --force origin 606fdfaa33af1844c86f4267a136d4666e576cdc:master