Come ripristinare una funzionalità usando Git?

3

Supponiamo il seguente scenario:

  1. È richiesto un nuovo design per una pagina specifica.
  2. Creo un nuovo ramo per questo progetto.
  3. Implemento la progettazione e mi unisco al ramo principale.
  4. Il tempo passa e vengono aggiunte nuove funzionalità e così via ...
  5. La gestione vuole ripristinare quella pagina al vecchio design -_-

In base alla mia comprensione di Git. La vecchia funzione è ora cronologica. Non posso ripristinare l'intero progetto sul commit in cui era presente la vecchia funzione.

Come posso ripristinare la vecchia funzione? Posso derivare da un vecchio commit, quindi unire solo file specifici? Come farlo usando Git, invece di considerare il vecchio design uno nuovo?

Modifica : Ah, ho incasinato il mio fraseggio qui su "la vecchia funzionalità ora è storia, non posso ripristinare l'intero progetto ..." . Certo che posso ripristinare (questo è il punto di un SCM comunque); Intendevo dire che non posso fare questo business-saggio; come le nuove funzionalità andrebbero perse.

    
posta Ahmed Khalaf 01.03.2017 - 09:47
fonte

3 risposte

0

The old feature is now history

L'intero punto di git è tracciare la storia del progetto. Qual è il punto se non puoi approfittarne? git si oppone solo a modificare la storia.

Esistono diversi modi per raggiungere il tuo obiettivo:

  • git reset --hard : cancella tutti i commit da nuovo ad un commit specificato. È brutto, poiché è in conflitto con la visione git di "non riscrivere mai la storia". Inoltre, facendo questo su un ramo pubblico richiederebbe a tutti coloro che lavorano su quel ramo di clonare nuovamente il repo. Non consigliato su un ramo principale.
  • git revert : il mio preferito per questo genere di cose. Fondamentalmente crea un "ripristino commit" - un commit che annulla il lavoro svolto in un commit precedente (non necessariamente l'ultimo commit). Per il tuo compito, puoi semplicemente annullare il commit di unione (anche se le cose non sono così semplici nella pratica, poiché potrebbero verificarsi conflitti).
  • git cherrypick : non molto utile da quando sei stato unito al master, ma buono a sapersi. Ti consente di scegliere quali commit si uniscono (in modo da non unire l'intero ramo).
  • sostituire completamente il ramo master creando un altro ramo dal commit desiderato, eliminare il vecchio master, rendere il nuovo ramo il nuovo "ramo master".
risposta data 01.03.2017 - 11:30
fonte
6

As per my understanding of Git. The old feature is now history. I cannot revert the whole project to the commit where the old feature was there.

Certo che puoi. Utilizza git checkout <commit> per tornare indietro nel tempo a uno stato precedente del repository. Puoi quindi creare un nuovo ramo che proviene da quel commit.

Ma consiglierei di provare qualcosa di diverso. Usa git revert <commit> dove <commit> è l'id-commit che ha unito il nuovo design al ramo principale.

Questo creerà un nuovo commit sopra l'attuale HEAD che semplicemente ripristina le modifiche introdotte con quell'unico commit ma lascia intatte tutte le altre modifiche (per quanto Git possa farlo da solo.) Qualsiasi caso che sia ambiguo sarà contrassegnato come conflitti). Come con il normale flusso di lavoro Git, potresti voler farlo su un nuovo ramo. Dopo tanto tempo ci saranno probabilmente molti conflitti. Non solo del tipo sintetico che Git si accorge da solo, ma anche del tipo logico che si vede solo quando si prova il codice (come il vecchio design che non funziona bene con le nuove funzionalità aggiunte negli ultimi mesi). Probabilmente avrai bisogno di un altro paio di commit finché tutti questi problemi non saranno risolti e le modifiche saranno pronte per essere unite nel ramo principale.

    
risposta data 01.03.2017 - 12:37
fonte
0

È possibile estrarre un file specifico come era in un commit specifico se il ripristino non è un'opzione:

git checkout <commit> -- <file path>

Il contenuto del file verrà aggiornato a quello che erano al commit dato e (IIRC) il file verrà messo in scena. È quindi possibile diff contro HEAD e ripristinare manualmente le nuove funzionalità. Questo può essere noioso, anche se meno se il design e le funzionalità sono ben separati.

    
risposta data 01.03.2017 - 13:24
fonte

Leggi altre domande sui tag