Elimina l'ultimo commit in bitbucket


103

Ho commesso un errore e non so come eliminare il mio ultimo push nel repository. Prendo gli ultimi aggiornamenti dell'app ma ha dei conflitti e lo invio al repository.

Come eliminare il mio ultimo commit? O come risolverlo?

Risposte:


102

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.


Grazie per l'informazione. E conosco le conseguenze se elimino il commit, semplicemente non so come annullare la mia azione perché è la prima volta che ricevo un errore. Devo annullare il mio commit perché il sistema è già attivo. Siamo solo in due a lavorare con quel repository.
catherine

git backout <REV>? Oppure hg backout <REV>:?
Armando Pérez Marqués

Ma cosa succederebbe se i commit aggiunti dopo quello da ripristinare avessero apportato modifiche alla riga da eliminare?
rahs

@RahulSaha poiché quello che stai facendo è fondamentalmente provare a unire un commit nel ramo, sono abbastanza sicuro che ti darà un conflitto di unione che dovrai risolvere.
asermax

98

Se si non lavorare con gli altri (o sei felice di causare loro significativa fastidio) , allora è possibile rimuovere impegna dai rami bitbucket.

Se stai cercando di modificare un ramo non principale:

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

se stai cercando di cambiare il ramo principale

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 .

Trattare con collaboratori infastiditi

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-picki 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.


1
Per chi è più a suo agio nell'usare SourceTree: 1) Per cambiare il ramo principale nell'interfaccia utente web per BitBucket, guarda le Impostazioni Repo. 2) Per eliminare un ramo nell'interfaccia utente web, guarda nella pagina Rami. 3) Ripristina il repo locale come sopra. 4) Spingi le modifiche locali verso l'alto per ricreare quei rami.
Richard Le Mesurier

2
Come qualcuno che ha accidentalmente spinto un segreto, ho apprezzato molto la completezza di questa risposta. Grazie!
Torque

48

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.


Github lo consentirà, ma al momento della stesura di questo articolo, Bitbucket non consente le forzature.
JamesQMurphy

4
in realtà bitbucket supporta force pushs solo il diff invece di rimuovere completamente i commit non tracciati li contrassegna come cancellati.
Shubanker

Il modo consigliato da bitbucket è usare revert. Ma penso che nel mio caso sia più appropriato. Dal momento che sono l'unico ad usarlo e sembra più pulito rispetto all'uso di ripristino. Grazie.
nafsaka

1
Sì, funziona ancora su Bitbucket. Mi hai appena risparmiato molto tempo! Ho fatto un commit / push dal mio Eclipse e mi sono confuso con altri progetti che avevo. In parte a causa di una cattiva pratica da parte mia utilizzando sia la riga di comando che l'eclissi integrata per lavorare su git.
DarkCygnus

brillante, o più semplice: reimposta il ramo corrente su questo commit, quindi usando quel push forzato al server risolvi il mio problema
Anthony Kal

3

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


1
Tagliare e incollare è davvero complicato. Inoltre, questo non risolverebbe il problema della domanda.
Daniel Lee,

1
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.
nought101

1
Git revert è il meccanismo uguale come sopra.
nafsaka

3

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.


2

Come altri hanno già detto, di solito si desidera utilizzare hg backouto 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 commitscollegamento.

Strip commit link nelle impostazioni di bitbucket

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 Confirme 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.


Di quale versione si tratta e quali autorizzazioni sono necessarie? Ha un aspetto diverso sulla v6.4.3 che sto guardando e questo elemento non è presente. Io sono amministratore repository.
Raphael

1

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)

inserisci qui la descrizione dell'immagine

Elimina completamente l'ultima riga di commit

3) salvalo con ctrl+XoESC:wq

ora il tuo ramo verrà aggiornato senza il tuo ultimo commit ..


1

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

0

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".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.