Saya selalu bingung dengan ini, jadi ini adalah test case pengingat; katakanlah kita memiliki bash
skrip ini untuk diuji 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
Pada titik ini, perubahan tidak dilakukan dalam cache, demikian git status
juga:
$ 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")
Jika dari titik ini, kita lakukan git checkout
, hasilnya adalah ini:
$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean
Jika sebaliknya kita lakukan git reset
, hasilnya adalah:
$ 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")
Jadi, dalam hal ini - jika perubahan tidak dilakukan, git reset
tidak ada bedanya, sambil git checkout
menimpa perubahan.
Sekarang, katakanlah bahwa perubahan terakhir dari skrip di atas dipentaskan / di-cache, artinya kita juga melakukannya git add b.txt
di akhir.
Dalam hal ini, git status
pada titik ini adalah:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: b.txt
Jika dari titik ini, kita lakukan git checkout
, hasilnya adalah ini:
$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean
Jika sebaliknya kita lakukan git reset
, hasilnya adalah:
$ 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")
Jadi, dalam hal ini - jika perubahan dipentaskan, git reset
pada dasarnya akan membuat perubahan bertahap menjadi perubahan yang tidak dipentaskan - sementara git checkout
akan menimpa perubahan sepenuhnya.