Git puesta en escena y el compromiso entre múltiples ramas

Claramente no entiendo git en absoluto. Esto es lo que estoy recibiendo:

<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>

Aquí está el kicker. foo ahora no muestra los cambios realizados en el archivo en el directorio de trabajo O en etapas.

Parece que, cualquier cambio que realice, incluida la modificación de archivos y la preparación, sucederá en TODAS las ramas. y cuando se COMPROMETE con una rama específica, esos cambios se descartan en todas las demás ramas excepto en la que realizó.

¿Es esto realmente lo que está pasando? ¿Puede alguien tener sentido para mí? Suena como un comportamiento completamente arruinado y claramente no tengo la idea de diseño que hace que esto sea algo sensato.

Editar por ejemplo 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>

Lo que claramente contradice esto del libro 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.

Respuestas a la pregunta(2)

Su respuesta a la pregunta