tag - git tutorial




Annullare le modifiche alla copia di lavoro di un file in Git? (8)

Basta usare

git checkout filename

Questo sostituirà il nome del file con l'ultima versione dal ramo corrente.

ATTENZIONE: le tue modifiche verranno scartate, nessun backup verrà mantenuto.

Dopo l'ultimo commit, ho modificato un gruppo di file nella mia copia di lavoro, ma desidero annullare le modifiche a uno di quei file, come in reset allo stesso stato del commit più recente.

Tuttavia, voglio solo annullare le modifiche alla copia di lavoro solo di quel solo file, nient'altro con esso.

Come lo faccio?


Mi confondo sempre con questo, quindi ecco un caso di test promemoria; diciamo che abbiamo questo script bash per testare git :

set -x
rm -rf test
mkdir test
cd test
git init
git config user.name test
git config user.email [email protected]
echo 1 > a.txt
echo 1 > b.txt
git add *
git commit -m "initial commit"
echo 2 >> b.txt
git add b.txt
git commit -m "second commit"
echo 3 >> b.txt

A questo punto, la modifica non viene messa in scena nella cache, quindi lo git status è:

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   b.txt

no changes added to commit (use "git add" and/or "git commit -a")

Se da questo punto, eseguiamo il git checkout , il risultato è questo:

$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean

Se invece facciamo git reset , il risultato è:

$ git reset HEAD -- b.txt
Unstaged changes after reset:
M   b.txt
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   b.txt

no changes added to commit (use "git add" and/or "git commit -a")

Quindi, in questo caso, se le modifiche non sono state organizzate, git reset non fa alcuna differenza, mentre git checkout sovrascrive le modifiche.

Ora, diciamo che l'ultima modifica dallo script precedente è messa in scena / memorizzata nella cache, vale a dire che abbiamo anche git add b.txt al file git add b.txt alla fine.

In questo caso, lo git status a questo punto è:

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   b.txt

Se da questo punto, eseguiamo il git checkout , il risultato è questo:

$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean

Se invece facciamo git reset , il risultato è:

$ git reset HEAD -- b.txt
Unstaged changes after reset:
M   b.txt
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   b.txt

no changes added to commit (use "git add" and/or "git commit -a")

Quindi, in questo caso, se le modifiche sono in programma, git reset sostanzialmente trasformerà le modifiche in fasi in modifiche non modificate - mentre git checkout sovrascriverà completamente le modifiche.


Puoi usare

git checkout -- file

Puoi farlo senza il -- (come suggerito da nimrodm), ma se il nome del file appare come un ramo o un tag (o un altro identificatore di revisione), potrebbe essere confuso, quindi usare -- è il migliore.

Puoi anche controllare una versione specifica di un file:

git checkout v1.2.3 -- file         # tag v1.2.3
git checkout stable -- file         # stable branch
git checkout origin/master -- file  # upstream master
git checkout HEAD -- file           # the version from the most recent commit
git checkout HEAD^ -- file          # the version before the most recent commit

Questa risposta è per il comando necessario per annullare le modifiche locali che si trovano in più file specifici in cartelle o cartelle uguali o multiple. Questo risponde specificamente alla domanda dove un utente ha più di un file ma l'utente non vuole annullare tutte le modifiche locali:

se si dispone di uno o più file è possibile applicare il comando samne ( git checkout -- file ) a ciascuno di questi file elencando ciascuna posizione separata per spazio come in:

git checkout -- name1/name2/fileOne.ext nameA/subFolder/fileTwo.ext

mente lo spazio abve tra nome1 / nome2 / fileOne.ext nomeA / subFolder / fileTwo.ext

Per più file nella stessa cartella:

Se ti capita di dover eliminare le modifiche per tutti i file in una determinata directory, usa il checkout git come segue:

git checkout -- name1/name2/*

L'asterisco di cui sopra fa il trucco di annullare tutti i file in quella posizione sotto nome1 / nome2.

E, analogamente, le seguenti azioni possono annullare le modifiche in tutti i file per più cartelle:

git checkout -- name1/name2/* nameA/subFolder/*

di nuovo lo spazio tra name1 / name2 / * nameA / subFolder / * in quanto sopra.

Nota: nome1, nome2, nomeA, sottocartella: tutti questi nomi di cartelle di esempio indicano la cartella o il pacchetto in cui risiedono i file in questione.


Se è già stato eseguito il commit, è possibile ripristinare la modifica per il file e eseguire nuovamente il commit, quindi eseguire lo squash del nuovo commit con l'ultimo commit.


Se il tuo file è già in fase di staging (accade quando fai un git add ecc. Dopo che il file è stato modificato) per togliere le modifiche.

Uso

git reset HEAD <file>

Poi

git checkout <file>

Se non è già in scena, basta usare

git checkout <file>

Se vuoi semplicemente annullare le modifiche del commit precedente a quel file, puoi provare questo:

git checkout branchname^ filename

Questo controllerà il file com'era prima dell'ultimo commit. Se vuoi tornare indietro di qualche altro, usa la notazione branchname~n .


Ho finito con git bash:

(use "git checkout -- <file>..." to discard changes in working directory)

  1. Stato Git. [Quindi abbiamo visto un file modificato da wad.]
  2. git checkout - index.html [sono cambiato nel file index.html:
  3. stato git [ora tali modifiche sono state rimosse]





undo