Ripristinare o ritirare selettivamente le modifiche a un file in Git?


89

Esiste un comando che ti permetta di annullare parzialmente le modifiche a un file (o file) nella directory di lavoro?

Supponi di aver modificato molto un file ma ti rendi conto che vuoi annullare alcune delle modifiche allo stato di commit, ma non le altre modifiche.

Sto immaginando un'opzione git checkoutche git add -pfunzioni in modo molto simile , cioè passa attraverso il file pezzo per pezzo e chiede se vuoi tenerlo o meno.

Risposte:


85

Potresti usare

git add -p <path>

per mettere in scena i blocchi che desideri conservare in un file particolare, quindi

git checkout -- <path>

per scartare le modifiche dell'albero di lavoro che non si desiderava mantenere, controllando la versione di staging del file.

Infine, puoi usare

git reset -- <path>

per ripristinare la versione di staging del file alla versione più recente del file di cui è stato eseguito il commit per lasciare le modifiche non impostate.


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

5
@ Jan Il revertcomando di altri sistemi di controllo della versione consente di selezionare quali modifiche all'interno di un file vengono ripristinate? Chiedo sinceramente, dato che ho esperienza solo con CVS e Git. In Git, git checkout -- path/to/filec'è un singolo comando che annulla tutte le modifiche in quel file, ma questo non è lo stesso di sopra.
michiakig

3
C'è anche git checkout --patche git reset --patchche funziona come git add --patchnell'ultimo git.
Matt Connolly

2
@Rudie, di --solito indica la fine dell'analisi delle opzioni e che tutti gli argomenti che seguono devono essere interpretati letteralmente. Ciò significa che non dovresti aggiungere ./prima di qualsiasi nome di file che inizia con un segno meno, se il nome del file viene dopo --.
zrajm

quando uso git checkout --patchil diff sembra essere al contrario. I simboli meno AGGIUNGONO testo alla mia copia di lavoro ei simboli più RIMUOVONO linee dalla mia copia di lavoro.
Felipe Alvarez

115

Con la versione git> = 1.7.1 posso

git checkout -p

Non sono sicuro di quando sia stata introdotta questa funzione.


11
Vale la pena ricordare che puoi anche fare git reset -pper rimuovere selettivamente le modifiche dall'area / indice di staging. Inoltre, non so bene in quale versione di Git sia stata introdotta.

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

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

8

git checkout $fileripristina lo stato del file $fileall'ultimo stato di cui è stato eseguito il commit. Penso che tu possa usare git checkout SHA-1 -- $fileper ripristinare il file nel commit identificato da SHA-1.


1
sì, non esattamente quello che voglio, dal momento che voglio mantenere alcune delle modifiche che ho fatto nel file e ripristinare le altre
1800 INFORMAZIONI

1

Quanti commit devi tornare indietro e selezionare? Se è solo uno, magari prendi un ramo subito prima, controlla il file che hai commesso e poi usalo git add -pper aggiungerlo come lo desideri. Quindi puoi tornare al punto in cui ti trovavi ed estrarre il file dal tuo ramo temporaneo.

questo è:

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(contrassegnare il commit come edit, quindi eseguire un git reset HEAD^e ripetere il commit quando viene rilasciato nuovamente nella shell).

Se le modifiche da cui devi selezionare sono distribuite su una serie di commit, potrebbe essere meglio estrarle come patch (o una patch che le copre tutte) e modificare manualmente la patch, eliminando le modifiche che desideri mantenere, e alimentando il residuo in git apply --reverse.


In realtà non voglio ripristinare nulla di cui è stato eseguito il commit, voglio annullare le modifiche che sono solo nella mia copia di lavoro
1800 INFORMAZIONI
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.