Das verwirrt mich immer wieder, deshalb hier ein Testfall zur Erinnerung: Nehmen wir an, wir haben Folgendes bash
Skript zum Testen 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
Zu diesem Zeitpunkt ist die Änderung noch nicht im Cache gespeichert, so dass git status
ist:
$ 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")
Wenn wir von diesem Punkt aus git checkout
Das Ergebnis ist folgendes:
$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean
Wenn wir stattdessen git reset
ist das Ergebnis:
$ 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")
In diesem Fall also - wenn die Änderungen nicht stufenweise erfolgen, git reset
macht keinen Unterschied, während git checkout
überschreibt die Änderungen.
Nehmen wir nun an, dass die letzte Änderung aus dem obigen Skript staged/cached ist, d.h. wir haben auch git add b.txt
am Ende.
In diesem Fall, git status
zu diesem Zeitpunkt ist:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: b.txt
Wenn wir von diesem Punkt aus git checkout
Das Ergebnis ist folgendes:
$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean
Wenn wir stattdessen git reset
ist das Ergebnis:
$ 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")
In diesem Fall also - wenn die Änderungen schrittweise erfolgen, git reset
macht aus abgestuften Änderungen grundsätzlich nicht abgestufte Änderungen - während git checkout
werden die Änderungen vollständig überschrieben.