¿Qué sucede con los files modificados cuando cambio las twigs de Git?

A pesar de usar Git por bastante time, todavía no entiendo su mecánica de ramificación. En particular, considere un nuevo proyecto foo con un solo file bar.txt inicializado por estos simples commands:

 $ mkdir foo $ cd foo $ git init $ touch bar.txt $ git add . $ git commit -m 'Initial commit' 

Ahora cuando creo una twig foobar , la git branch muestra que todavía estoy en master :

 $ git branch foobar $ git branch foobar * master 

Pero cuando cambio al file bar.txt :

 $ echo quux >> quux.txt $ git status modified: quux.txt 

Luego, cuando pago la otra twig, puedo ver que el file bar.txt se ha modificado:

 $ git checkout foobar $ git status modified: quux.txt 

Ya sé que este comportamiento me permite elegir a qué twig quiero comprometer mis cambios, pero me resulta molesto. Sospecho que no entiendo la idea básica detrás de la ramificación de Git. ¿Hay alguna manera de decirle a Git que cuando realizo cambios en el master , no quiero que sean visibles desde ninguna otra twig que pueda optar por pagar?

Los cambios que realice en el directory de trabajo no son parte de ninguna twig hasta que los cometa. Entonces, te equivocas al pensar que cuando compras una sucursal y luego modificas un file, has realizado una modificación "en la sucursal". No lo has hecho, has modificado el directory de trabajo.

Por lo tanto, tiene un directory de trabajo sucio basado en una sucursal y se registra en otra sucursal: los cambios no confirmados permanecen en el directory de trabajo porque de lo contrario no se saveían en ninguna parte . No podría volver a realizar el pago de la primera sucursal y hacer que reaparezcan los cambios locales.

Lo que probablemente quiera hacer es git stash antes de cambiar de twig. Esto guarda los cambios locales en una twig temporal, a la que puede volver luego con git stash pop .

Por lo general, no está permitido cambiar de sucursales si el process de pago afecta files dirty . En su caso, la modificación del file no afecta a la salida de foobar. Si hubo cambios en el file modificado localmente de la sucursal que se va a desproteger, la salida se cancelará. No existe el concepto de mantener files modificados para una sola twig cuando se cambian las twigs. Si no desea tener estas modificaciones locales cuando foobar , tiene las siguientes posibilidades:

  • stash save los cambios y borrar sus modificaciones locales. Esto permite volver a aplicar los cambios cuando vuelva a cambiar a maestro. ( git stash save --include-untracked para capturar también files nuevos y aún no git stash save --include-untracked )
  • reset --hard su twig actual a HEAD antes de reset --hard (lo cual descarta los cambios de curso)
  • checkout -f foobar para descartar también los cambios locales (mismo efecto que el restablecimiento).

Puede usar stash para almacenar cambios por etapas / sin compromiso:

 git stash 

Ahora puede cambiar de twig con un nuevo directory de trabajo:

 git branch master git status # On branch master nothing to commit, working directory clean 

Para aplicar sus cambios escondidos:

 git branch foobar git stash apply