2010-07-20 11 views
14

Diciamo che ho una revisione A da molto tempo fa e ho apportato un cambiamento desiderabile.Con Git, è possibile riapplicare una revisione di antenato?

Poi, più tardi, ho avuto la revisione B che ha fatto un sacco di modifiche a un sacco di file, tra cui spazzando via il cambiamento A.

Ora, molto più tardi, voglio riapplicare revisione A. Esiste un buon modo per farlo? I comandi di unione e selettore di caratteri sembrano ignorare le revisioni che sono antenati e non vedo alcun flag per ignorare l'ascendenza.

C'è sempre diff/apply, ma quelli sono davvero il modo migliore? Sembra che questo potrebbe essere "lossy" (passando attraverso il formato di patch intermedio) e potrebbe non permettere a git di usare tutti gli strumenti normalmente a sua disposizione ... ma questa è una mia impressione non informata da parte mia.

+2

'git | git | sostantivo Brit., Informale una persona sgradevole o spregevole. Questo significa: tutto è possibile con git. –

risposta

-2

È possibile utilizzare git checkout $ REVISION per tornare alla propria Revisione (Commit). Quindi dovresti creare una nuova filiale da lì.

git.cmd branch YOURCOMMIT 

È possibile utilizzare il piccone per ottenere i commit necessari per il nuovo ramo.

+0

Non capisco. Non voglio un nuovo ramo; Voglio riapplicare una revisione del passato, all'interno dello stesso ramo. – mackstann

+0

Ho capito. Ma è più facile farlo con una nuova filiale. Puoi tranquillamente cancellarlo - una volta che il tuo processo con il piccone è terminato e l'hai unificato. Branching è economico e facile da usare. –

+0

Ma come posso ottenere la revisione in master in futuro quando sono nel mio back-to-the-past branch? – mackstann

23

git cherry-pick A farà esattamente quello che desideri. Non guarda l'ascendenza: sembra solo vedere quali cambiamenti sono già stati applicati.

Ecco un esempio:

git cherry-pick A 
git cherry-pick A 
git cherry-pick A 

creerà solo nuovo commit (al massimo). Il secondo e il terzo comando sono no-op, poiché le modifiche di A sono già state applicate. Tuttavia,

git cherry-pick A 
git cherry-pick B 
git cherry-pick A 
git cherry-pick B 

creerà quattro nuovi commit. Il primo e il terzo commit saranno entrambi fare la stessa cosa, mentre la seconda e quarta ritornerà la prima e terza (anche se commit B apportate altre modifiche di ripristino A.) In altre parole, questo è lo stesso

git cherry-pick A 
git revert --no-edit HEAD 
git revert --no-edit HEAD 
git revert --no-edit HEAD 

Spero che questo aiuti.

Problemi correlati