Tôi luôn luôn bối rối với điều này, vì vậy đây là một trường hợp kiểm tra nhắc nhở; giả sử chúng ta có bash
kịch bản này để kiểm tra 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
Tại thời điểm này, thay đổi không được tổ chức trong bộ đệm, vì vậy 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")
Nếu từ thời điểm này, chúng tôi làm git checkout
, kết quả là:
$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean
Nếu thay vào đó chúng tôi làm git reset
, kết quả là:
$ 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")
Vì vậy, trong trường hợp này - nếu các thay đổi không được dàn dựng, sẽ git reset
không có sự khác biệt, trong khi git checkout
ghi đè lên các thay đổi.
Bây giờ, hãy nói rằng thay đổi cuối cùng từ tập lệnh ở trên được dàn dựng / lưu vào bộ đệm, nghĩa là chúng ta cũng đã làm git add b.txt
ở cuối.
Trong trường hợp này, git status
tại thời điểm này là:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: b.txt
Nếu từ thời điểm này, chúng tôi làm git checkout
, kết quả là:
$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean
Nếu thay vào đó chúng tôi làm git reset
, kết quả là:
$ 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")
Vì vậy, trong trường hợp này - nếu các thay đổi được dàn dựng, git reset
về cơ bản sẽ thực hiện các thay đổi theo giai đoạn thành các thay đổi không theo giai đoạn - trong khi git checkout
sẽ ghi đè lên hoàn toàn các thay đổi.