Sempre fico confuso com isso, então aqui está um caso de teste de lembrete; digamos que temos esse bash
script para testar 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
Nesse ponto, a alteração não é preparada no cache, assim git status
como:
$ 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 a partir deste ponto git checkout
, o resultado é este:
$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean
Se o fizermos git reset
, o resultado é:
$ 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")
Portanto, neste caso - se as alterações não forem testadas, git reset
não faz diferença, enquanto as git checkout
substitui.
Agora, digamos que a última alteração do script acima seja preparada / armazenada em cache, ou seja, também fizemos git add b.txt
no final.
Nesse caso, git status
neste momento é:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: b.txt
Se a partir deste ponto git checkout
, o resultado é este:
$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean
Se o fizermos git reset
, o resultado é:
$ 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")
Portanto, neste caso - se as alterações forem git reset
preparadas , basicamente as transformadas serão transformadas em etapas - enquanto git checkout
substituem completamente as alterações.