git staging e committing entre múltiplos branches

Eu claramente não entendo git em tudo. É isso que estou recebendo:

<code>git branch  (outputs that I'm on master)
git checkout -b foo
echo "next line" >> file (file is an existing file)
git add file (stages)
git checkout master
git status (shows that file has "next line" and is staged!!)
git commit (commits the changes that were staged on branch foo!!)
git checkout foo
</code>

Aqui está o kicker. foo agora não mostra nenhuma alteração feita no arquivo no diretório de trabalho OR staged.

Parece que - qualquer alteração feita, incluindo modificação de arquivos e preparo, ocorre em TODAS as filiais. e quando você COMPRAR a uma ramificação específica, essas alterações serão descartadas em todas as outras ramificações, exceto aquela com a qual você se comprometeu.

Isso é realmente o que está acontecendo? Alguém pode fazer isso fazer sentido para mim? Parece um comportamento completamente maluco e claramente eu não entendo a ideia de design que faz disso uma coisa sensata a fazer.

Editar para exemplo explícito:

<code>$ mkdir element
$ cd element
$ git init
Initialized empty Git repository in /home/dan/element/.git/
$ echo "one" >> one
$ git add one
$ git commit -m msg
[master (root-commit) 36dc8b0] msg
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 one
$ git checkout -b fire
Switched to a new branch 'fire'
$ echo "next line" >> one
$ git checkout master
M       one
Switched to branch 'master'
$ cat one
one
next line
$
</code>

Que patentemente contradiz isso do livro git pro:

This is an important point to remember: Git resets your working directory to look like the snapshot of the commit that the branch you check out points to. It adds, removes, and modifies files automatically to make sure your working copy is what the branch looked like on your last commit to it.

questionAnswers(2)

yourAnswerToTheQuestion