Mi confondo sempre con questo, quindi ecco un caso di promemoria; diciamo che abbiamo questo bash
script da testare git
:
set -x
rm -rf test
mkdir test
cd test
git init
git config user.name test
git config user.email test@test.com
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 gestita nella cache, quindi 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, lo facciamo git checkout
, il risultato è questo:
$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean
Se invece lo 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 vengono messe in scena, git reset
non fa alcuna differenza, mentre le git checkout
sovrascrive.
Ora, supponiamo che l'ultimo cambiamento dallo script sopra sia messo in scena / memorizzato nella cache, vale a dire anche git add b.txt
alla fine.
In questo caso, 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, lo facciamo git checkout
, il risultato è questo:
$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean
Se invece lo 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 vengono messe in scena, git reset
sostanzialmente trasformeranno le modifiche in fasi in modifiche non messe in scena - mentre git checkout
verranno sovrascritte completamente.