2013-05-14 13 views
15

Per rintracciare a che punto ho rotto una funzionalità nel mio software, ho bisogno di rivedere le versioni precedenti del mio repository. Voglio solo impostare la directory di lavoro su un commit più vecchio, giocare con il codice, poi scartare le modifiche e quindi provare un altro commit.Come impostare la directory di lavoro su un commit precedente?

Non voglio modificare nulla sui commit, né rimuovere né crearne uno. Ho provato a utilizzare git reset ma dopo che il commit più recente non è stato più mostrato. Quindi ho scaricato di nuovo il repository, perché non sapevo come ripristinarlo.

+0

Sono arrivato a questo dopo aver cercato su google "[scambia la directory di lavoro con un commit precedente ma lascia la testa invariata] (https://www.google.co.uk/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF- 8 # safe = active & q = di swap + lavoro + directory + per + un + precedente + commettere + ma + lasciare + testa + invariato)". Ho finito per usare 'git checkout - ' per ciascuno dei file che volevo ripristinare il commit precedente – dumbledad

risposta

13

Un semplice git checkout old-sha1 può essere un inizio, ma il comando vero e proprio per quel tipo di compito è:

git bisect.

Trova per ricerca binaria il cambiamento che ha introdotto un bug

Se si dispone di uno script in grado di verificare se il vostro albero di lavoro "funziona" o no, è possibile eseguire lo script sul precedente commette attraverso git bisect , individuando il primo commit che interrompe il test.

Si noti che questo comando non è ancora supportato direttamente da GitHub per Windows: sarà necessario aprire una shell.


Un git checkout si lascerebbe in una testa indipendente, che non importa dal momento che non farà alcuna modifica.
Per tornare a erano eri, Bancone un ramo:

git checkout master 

Vedere "Why did git detach my head?".

+0

Grazie, ho pensato che 'checkout' è solo per le filiali prima. Quale tipo di script posso usare per 'bisect'? La mia applicazione è scritta in C++ nativo. A proposito, sono impressionato da Git per includere un tale comando. – danijar

+0

@danijar no, è possibile verificare qualsiasi albero. Ad esempio, 'git checkout" @ {10 minuti fa} "' ti darebbe il commit da 10 minuti fa. – VonC

+0

@danijar per git bisect, qualsiasi script tu desideri finché termina con lo stato 0 (funziona) o 1 (non riesce). – VonC

1

Utilizzando git checkout <branch_name> è possibile passare all'altro ramo disponibile. Se si desidera reimpostare la HEAD al più vecchio commit, si può provare il seguente comando:

  • git ripristinare TESTA --hard ~ 1 per ripristinare alla testa da un singolo commit
  • ripristino git - difficile HEAD ~ 2 per reimpostare alla testa da 2 commit e così via

anche se è stato il commit, allora si può provare questo comando: git reset --hard <commit> In questo modo è possibile impostare la directory di lavoro a un vecchio commettere.

Per eliminare completamente le modifiche, provare: git reset --hard che pulirà la directory sul commit precedente.

5

è possibile verifica il codice in un altro ramo all'indice utilizzando la seguente:

git checkout my-other-branch . 

Il punto è un identificatore che indica il percorso che si vuole fare questo per l'intero repository. Si potrebbe anche specificare solo una cartella specifica. Tecnicamente, puoi specificare qualsiasi identificatore 'tree-ish' per il parametro my-other-branch, come un tag, un hash di commit, qualcosa come HEAD~1, ecc ...Se si desidera che queste modifiche siano Unstaged, si potrebbe poi fare:

git reset HEAD 

Supponendo che si è iniziato in uno stato pulito, ora avrete la directory di lavoro sia nello stesso stato in cui my-other-branch.

Problemi correlati