È possibile riscrivere la cronologia se lo si desidera, ma è una cattiva idea se qualcun altro ha copie della cronologia. In questo caso, probabilmente utilizzerai il rebase interattivo: git rebase -i master topic
. Questo ti darà una lista di commit da un master all'altro, con suggerimenti su come giocare con loro. Dovresti solo rimuovere la riga contenente il commit che vuoi rimuovere.
Detto questo, devo sottolineare che è irresponsabile farlo se qualcun altro ha questa storia. Dovresti forzare-spingerlo al tuo repository centrale, e tutti gli altri dovrebbero risolvere i loro repository in modo che corrispondano, possono essere relativamente semplici o complessi a seconda delle circostanze.
C'è una bella sezione chiamata "recupero da rebase upstream" nel git-rebase man page discutendo su come affrontare questo, se davvero si decide di.
Edit:
Per la storia semplice, uno scenario comune sarebbe, dopo aver costretto una spinta non fastforward al repo centrale (push -f
), altri sviluppatori:
- indietro il loro vecchio maestro:
git branch -m master master_old
- ottenere aggiornamenti e ricreare maestro di origine:
git remote update origin; git branch master origin/master
- rebase tutti i rami argomento su nuovi padrone:
git rebase --onto master master_old topic
Se hanno il lavoro in loro ramo padrone, che non è di origine ancora, dovrete ottenere più elaborato, rebasing questo lavoro e tutte le filiali argomento sulla nuova posizione del maestro ... questo dovrebbe darvi un'idea del perché sia così orribile riscrivere la storia che hanno gli altri. In realtà, una volta che qualcosa è passato nel repository pubblico, dovresti considerarlo una storia registrata dura e veloce, non un work in progress.
Grazie, questo è esattamente quello che ho fatto ora (anche quello che ho suggerito in alcuni dei commenti a Jefromi). La storia è un po 'brutta ora a causa di questo annullamento commit, ma non posso farci niente. – Albert
2 settimane git utente qui. Non sarebbe più semplice dapprima diramare G a G ', e quindi 'git revert' G a D, risultando in D'? In questo modo non devi annullare/ripetere nulla, il che mi sembra molto più sicuro. (Ho già perso incessantemente delle modifiche a causa di problemi con 'git reset'.) – bart
@bart, dai un'occhiata a' git reflog'. Cose che sono state fatte e successivamente rovinate dovrebbero sempre essere recuperabili attraverso il reflog, almeno per alcuni giorni. Tuttavia, è possibile che inavvertitamente perdano le modifiche che non è stato possibile commettere. – dubiousjim