2013-12-16 14 views
7

Questo deve essere semplice, ma non riesco a trovarlo in git-scm.come terminare il ripristino di un commit e come ripristinare un sacco di commit

Ho fatto un sacco di piccoli commit a un progetto pubblico, e tutto il mio lavoro è cattivo. Voglio rimuovere tutto ciò che ho fatto. Alcuni che ho appena eseguito in locale, alcuni che ho spinto a 'master di origine'.

Il primo commit (una settimana fa) è bdbad86 ... con la più recente è e82401b ...

voglio fare solo tutti questi andare via. Ho provato a ripristinarne uno.

git status 
# On branch master 
# You are currently reverting commit e82401b. 
# (all conflicts fixed: run "git revert --continue") 
# (use "git revert --abort" to cancel the revert operation) 
  1. io non riesco a capire come finire questo al ripristino.
  2. Non voglio dover eseguire ogni commit separatamente, voglio soffiarli tutti via.

risposta

4

Sto assumendo qui che nessun altro intervenne impegna in mezzo il tuo lavoro, e il fatto che tu commetta male formano una gamma continua nella storia del repository. Altrimenti dovrai diventare più complicato. Supponiamo che la vostra storia è simile al seguente:

e82401b - (master, HEAD) My most recent private commit 
... 
bc2da37 - My first private commit 
cf3a183 - (origin/master) My most recent bad public commit 
... 
292acf1 - My first bad public commit 
82edb2a - The last good public commit 

La prima cosa che vogliamo fare è soffiare via i commit che non si è ancora reso pubblico. È possibile farlo con il seguente comando (notare che le modifiche saranno andati e devono essere considerati irrecuperabili):

git reset --hard cf3a183 

modo equivalente (e più leggibile):

git reset--hard origin/master 

Ora la tua visione del il repository concorda con la vista in origin/master. Ora vuoi ripristinare le tue cattive modifiche pubbliche e pubblicarle come annullamento del commit. Queste istruzioni servono per creare un singolo commit di ripristino.

È possibile utilizzare git revert --no-commit a..b per ripristinare tutti i commit a partire da commit dopoa (si noti che!) E termina a, e compreso, impegnarsi b. La retromarcia verrà allestita per il tuo impegno. Così, qui, faremmo:

git revert --no-commit 82edb2a..HEAD 

o, equivalentemente:

git revert --no-commit 292acf1^..HEAD 

Ricordando che HEAD ora punta allo stesso posto come origin/master.

Dopo aver eseguito il comando revert, ora le modifiche sono state organizzate e pronte per il commit, quindi è sufficiente eseguire un semplice git commit -m "Reverting those bad changes I accidentally pushed and made public".

+0

Grazie, questo è il tipo di informazioni di cui avevo bisogno. Un'ulteriore domanda: come ottengo le informazioni (master, HEAD) o (origine/master) in modo da poter dire quando eseguire i due gruppi di comandi? –

+1

@Pat Il modo più semplice è impostare una forma alternativa di 'git log' per ottenere queste informazioni a colpo d'occhio. Puoi leggere [qui] (https://www.kernel.org/pub/software/scm/git/docs/git-log.html) sul formato da utilizzare. Una buona base di partenza è qualcosa del tipo: 'git log --pretty ="% h% Cgreen% d% Creset% s% an% Cblue (% cr) "' –

0

È possibile impostare il repository su qualsiasi commit precedente e tutte le modifiche successive verranno rimosse.

git ripristinare --hard

dopo che per spingerlo a uso github git push --force origine

visita How do you roll back (reset) a Git repository to a particular commit?

+2

Per i futuri googler che si imbattono in questa risposta: NON FARE MAI QUESTA DOPO AVER FATTO L'ORIGINE. (http://git-scm.com/docs/git-rebase/#_recovering_from_upstream_rebase) Può rendere la vita di tutti gli altri molto impegnativa. – zmccord

Problemi correlati