Risposte:
In primo luogo, se stai lavorando con altre persone sullo stesso repository di codice, non dovresti eliminare un commit poiché quando forzi l'aggiornamento sul repository lascerà i repository locali dei tuoi colleghi in uno stato illegale (ad esempio se loro commit effettuati dopo quello che hai eliminato, quei commit non saranno validi poiché erano basati su un commit ora inesistente).
Detto questo, quello che puoi fare è annullare il commit. Questa procedura viene eseguita in modo diverso (comandi diversi) a seconda del CVS che stai utilizzando:
Su git :
git revert <commit>
Su mercurial :
hg backout <REV>
EDIT: L'operazione di ripristino crea un nuovo commit che fa l'opposto del commit ripristinato (ad esempio, se il commit originale ha aggiunto una riga, il commit di ripristino elimina quella riga), rimuovendo efficacemente le modifiche del commit indesiderato senza riscrivere la cronologia del repository.
git backout <REV>
? Oppure hg backout <REV>
:?
Se si non lavorare con gli altri (o sei felice di causare loro significativa fastidio) , allora è possibile rimuovere impegna dai rami bitbucket.
git reset HEAD^ # remove the last commit from the branch history
git push origin :branch_name # delete the branch from bitbucket
git push origin branch_name # push the branch back up again, without the last commit
In git generalmente, il ramo master non è speciale, è solo una convenzione. Tuttavia, bitbucket e github e siti simili di solito richiedono che ci sia un ramo principale (presumibilmente perché è più facile che scrivere più codice per gestire l'evento che un repository non ha rami - non sono sicuro). Quindi è necessario creare un nuovo ramo e renderlo il ramo principale:
# on master:
git checkout -b master_temp
git reset HEAD^ # undo the bad commit on master_temp
git push origin master_temp # push the new master to Bitbucket
Su Bitbucket, vai alle impostazioni del repository e modifica il "ramo principale" in master_temp
(su Github, cambia il "ramo predefinito").
git push origin :master # delete the original master branch from Bitbucket
git checkout master
git reset master_temp # reset master to master_temp (removing the bad commit)
git push origin master # re-upload master to bitbucket
Ora vai su Bitbucket e dovresti vedere la cronologia che desideri. Ora puoi andare alla pagina delle impostazioni e cambiare il ramo principale in master
.
Questo processo funzionerà anche con qualsiasi altra modifica della cronologia (ad esempio git filter-branch
). Devi solo assicurarti di ripristinare i commit appropriati, prima che la nuova cronologia si separi da quella vecchia.
modifica : a quanto pare non hai bisogno di fare tutte queste seccature su GitHub, poiché puoi forzare il push di un ramo di ripristino .
La prossima volta che qualcuno proverà a eseguire il pull dal tuo repository (se hanno già eseguito il bad commit), il pull fallirà. Dovranno ripristinare manualmente un commit prima della cronologia modificata, quindi eseguire nuovamente il pull.
git reset HEAD^
git pull
Se hanno eseguito il commit errato e si sono impegnati su di esso , dovranno reimpostare, quindi git cherry-pick
i commit buoni che vogliono creare, ricreando efficacemente l'intero ramo senza il commit cattivo.
Se non hanno mai eseguito il bad commit, l'intero processo non li influenzerà e potranno tirare normalmente.
puoi resettare per HEAD^
poi forzare la spinta.
git reset HEAD^
git push -u origin master --force
Cancellerà il tuo ultimo commit e si rifletterà su bitbucket come commit cancellato, ma rimarrà comunque sul loro server.
Ho avuto problemi con git revert in passato (principalmente perché non sono abbastanza sicuro di come funzioni). Ho avuto problemi con il ripristino a causa di problemi di unione ..
La mia semplice soluzione è questa.
Passo 1.
git clone <your repos URL> .
il tuo progetto in un'altra cartella, quindi:
Passo 2.
git reset --hard <the commit you wanna go to>
quindi Passaggio 3.
nella tua ultima (e principale) directory del progetto (quella che ha l'ultimo commit problematico) incolla i file del passaggio 2
Passaggio 4.
git commit -m "Fixing the previous messy commit"
Passaggio 5.
Godere
git revert
è semplice: crea un nuovo commit che fa il contrario delle modifiche in un commit precedente (o più commit). Non elimina i commit, quindi non è rilevante per questa domanda. Inoltre, il passaggio di clonazione qui non è realmente necessario.
Ecco un semplice approccio in un massimo di 4 passaggi:
0 - Avvisa il team che aggiusterai il repository
Connettiti con il team e informalo dei cambiamenti imminenti.
1 - Rimuovi l'ultimo commit
Supponendo che il tuo ramo di destinazione sia master
:
$ git checkout master # move to the target branch
$ git reset --hard HEAD^ # remove the last commit
$ git push -f # push to fix the remote
A questo punto hai finito se lavori da solo.
2 - Correggi i repository locali del tuo compagno di squadra
Sul tuo compagno di squadra:
$ git checkout master # move to the target branch
$ git fetch # update the local references but do not merge
$ git reset --hard origin/master # match the newly fetched remote state
Se il tuo compagno di squadra non ha avuto nuovi commit, a questo punto hai finito e dovresti essere sincronizzato.
3 - Riportare i commit persi
Supponiamo che un compagno di squadra avesse un commit nuovo e non pubblicato che è andato perso in questo processo.
$ git reflog # find the new commit hash
$ git cherry-pick <commit_hash>
Fallo per tutti i commit necessari.
Ho usato con successo questo approccio molte volte. È necessario uno sforzo di squadra per assicurarsi che tutto sia sincronizzato.
Come altri hanno già detto, di solito si desidera utilizzare hg backout
o git revert
. Tuttavia, a volte vuoi davvero sbarazzarti di un commit.
Innanzitutto, ti consigliamo di accedere alle impostazioni del tuo repository. Fare clic sul Strip commits
collegamento.
Immettere l'ID del changeset per il changeset che desiderate distruggere e fare clic Preview strip
. Questo ti permetterà di vedere che tipo di danno stai per fare prima di farlo. Quindi fai clic Confirm
e il tuo commit non è più cronologico. Assicurati di dire a tutti i tuoi collaboratori cosa hai fatto, in modo che non respingano accidentalmente il commit offensivo.
Una volta che le modifiche sono state confermate, non sarà possibile eliminarle. perché la natura di base del commit non è eliminare.
Cosa puoi fare (metodo facile e sicuro),
Rebase interattivo:
1) git rebase -i HEAD~2
#mostrerà i tuoi ultimi 2 commit
2) Il tuo commit elencherà come, Recent apparirà in fondo alla pagina LILO (last in Last Out)
Elimina completamente l'ultima riga di commit
3) salvalo con ctrl+X
oESC:wq
ora il tuo ramo verrà aggiornato senza il tuo ultimo commit ..
Puoi scrivere il comando anche per Bitbucket come menzionato da Dustin :
git push -f origin HEAD^:master
Nota: al posto del master puoi usare qualsiasi branch. E cancella basta premere su Bitbucket.
Per rimuovere l'ultimo commit localmente in git usa:
git reset --hard HEAD~1
Ormai cloud bitbucket (non sono sicuro di quale versione) consente di ripristinare un commit dal file system come segue (non vedo come tornare dall'interfaccia di Bitbucket nel browser Chrome).
-segui il backup dell'intera directory per proteggere le modifiche che hai inavvertitamente commesso
-seleziona la directory estratta
-pulsante destro del mouse: menu git tartaruga
-repo-browser (l'opzione di menu "ripristina" annulla solo le modifiche non autorizzate)
-premere il pulsante HEAD
-seleziona la riga più in alto (l'ultimo commit)
-Pulsante destro del mouse: annulla le modifiche apportate da questo commit
-Dopo aver annullato le modifiche sul file system, premere commit
-questo aggiorna GIT con un messaggio 'Ripristina (il tuo messaggio precedente). Questo ripristina il commit così e così '
-seleziona "commit e push".