2009-04-21 10 views
78

Esiste un comando che consente di annullare parzialmente le modifiche a un file (o file) nella directory di lavoro?In modo selettivo, ripristina o verifica le modifiche a un file in Git?

Supponiamo di aver modificato molto un file ma ci si rende conto che si desidera annullare alcune delle modifiche allo stato impegnato, ma non le altre modifiche.

Sto immaginando un'opzione per git checkout che funziona molto come git add -p, cioè passa attraverso il file hunk da hunk e chiede se si desidera mantenerlo o meno.

risposta

74

Si potrebbe utilizzare

git add -p <path> 

di mettere in scena i pezzi che si desidera conservare in un particolare file, quindi

git checkout -- <path> 

per annullare le modifiche di lavoro degli alberi che non hai desidera conservare , controllando la versione a fasi del file.

Infine, è possibile utilizzare

git reset -- <path> 

per ripristinare la versione messa in scena del file per la versione più recente impegno del file lasciarvi con le modifiche non è stato classificato.

+0

Penso che questo sia quello che sto cercando grazie –

+0

Per questo semplice caso d'uso, che ogni altro sistema di controllo della versione chiama semplicemente "ripristina", perché il comando Git è così oscuro? –

+5

@Jan Il comando 'revert' di altri controlli di sistema consente di selezionare quali modifiche all'interno di un file vengono ripristinate?Chiedendo sinceramente, ho solo esperienza con CVS e Git. In Git, 'git checkout - path/to/file' è un singolo comando che ripristina tutte le modifiche in quel file, ma questo non è lo stesso di sopra. – spacemanaki

8

git checkout $file ripristina lo stato del file $file all'ultimo stato impegnato. Penso che tu possa usare git checkout SHA-1 -- $file per ripristinare il file sul commit identificato da SHA-1.

+1

sì, non esattamente quello che voglio, dal momento che voglio mantenere alcune delle modifiche che ho apportato nel file e ripristinare gli altri –

1

Quanti sono i commit necessari per tornare indietro e selezionare? Se è solo uno, magari prendi un ramo poco prima, controlla il file che hai impegnato e poi usa git add -p per aggiungerlo come lo volevi. Quindi puoi tornare dove ti trovavi e controllare il file dal tuo ramo temporaneo.

che è:

git checkout -b temp troublesome-commit^ 
git checkout troublesome-commit -- path/to/file 
git add -p path/to/file 
git commit -c troublesome-commit 
git checkout @{-1} 
git checkout temp -- path/to/file 
git commit path/to/file 
git branch -D temp 

Altre alternative includono tornare indietro e modificare il commit con git rebase -i (che segna il commit come edit, quindi facendo un git reset HEAD^ e rifare il commit in caso di caduta di nuovo nel guscio).

Se le modifiche da selezionare sono distribuite su una serie di commit, potrebbe essere meglio estrarle come patch (o una patch che copre tutte) e modificare a mano la patch, eliminando le modifiche desidera conservare e immettere il residuo in git apply --reverse.

+0

In realtà non sto volendo ripristinare tutto ciò che è impegnato, voglio annullare le modifiche che sono solo nella mia copia di lavoro –

99

Con la versione git> = 1.7.1 posso

git checkout -p 

io non sono sicuro che quando questa funzione è stata introdotta.

+8

Vale la pena ricordare che si può anche fare 'git reset -p' per togliere selettivamente le modifiche dall'area/indice di staging. Inoltre, non conosco la parte superiore della mia testa in quale versione di Git è stata introdotta. –

+0

Questa è la risposta corretta, perché non è stata accettata. – wukong

+0

@wukong perché questa risposta è stata postata 2 anni dopo la domanda. In questo momento (2009), la risposta di Charles è stata la migliore soluzione – pomeh

Problemi correlati