Как обновляется рабочий каталог на "git checkout"?

Рассмотрим следующую "историю":

$ mkdir my_project
$ cd my_project
$ git init
Initialized empty Git repository in /home/misha/misha/my_project/.git/

$ echo "first line" > hello.txt
$ git add hello.txt
$ git commit -m "first commit"
[master (root-commit) 9c913a1] first commit
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 hello.txt

$ git branch new_feature
$ git checkout new_feature
Switched to branch 'new_feature'
$ echo "second line" >> hello.txt
$ cat hello.txt
first line
second line

$ git checkout master
M    hello.txt
Switched to branch 'master'
$ cat hello.txt
first line
second line

Почему hello.txt имеет две строки в главном ветки? (Я думал, что git checkout вернет рабочий каталог в предыдущее состояние, т.е. hello.txt будет иметь только одну строку.)

Что на самом деле происходит за кулисами в рабочем каталоге на git checkout? Как он обновляется?

Ответ 1

Ваш git checkout to master предотвращает потерю незавершенных изменений. Вот почему у вас все еще есть вторая строка в вашем файле hello.txt. Если вы действительно хотите потерять незафиксированные изменения, вы должны использовать параметр -f.

Наконец, ваша проверка будет выглядеть так:

git checkout -f master

Ответ 2

Git checkout (свободно) обновит рабочую копию с содержимым репозитория в объявлении, которое укажет. В вашей ветке new_feature нет второй строки, которую вы добавили в свой файл (так как вы еще не сделали этого). Прямо сейчас, эта дополнительная строка - это просто необработанное изменение вашей рабочей копии, и оно будет добавлено в ветку, на которой вы ее совершаете.