Je suis toujours confus avec cela, voici donc un cas de test de rappel; disons que nous avons ce bashscript à tester 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
À ce stade, la modification n'est pas mise en scène dans le cache, tout git statuscomme:
$ 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")
Si à partir de ce point, nous le faisons git checkout, le résultat est le suivant:
$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean
Si au contraire nous le faisons git reset, le résultat est:
$ 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")
Donc, dans ce cas - si les modifications ne sont pas échelonnées, git resetcela ne fait aucune différence, tout en git checkoutécrasant les modifications.
Maintenant, disons que le dernier changement par rapport au script ci-dessus est mis en scène / mis en cache, c'est-à-dire que nous l'avons également fait git add b.txtà la fin.
Dans ce cas, git statusà ce stade est:
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
    modified:   b.txt
Si à partir de ce point, nous le faisons git checkout, le résultat est le suivant:
$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean
Si au contraire nous le faisons git reset, le résultat est:
$ 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")
Donc, dans ce cas - si les modifications sont échelonnées, elles git resetferont essentiellement des changements échelonnés en changements non échelonnés - alors qu'elles git checkoutécraseront complètement les changements.