¿Por qué git sigue mostrando mis cambios cuando cambio de rama (archivos modificados, agregados, eliminados) sin importar si ejecuto git add o no?

115

Soy realmente nuevo en git y he estado tratando de entender por qué git sigue mostrando todo lo que cambié en una rama en otra rama cuando ejecuto git checkout para cambiar entre ramas Primero intenté no usar git add y no funcionó. Sin embargo, intenté usar git add, pero no solucioné el problema. Todavía no estoy usando git commit.

Esto es básicamente lo que estoy haciendo:

$ git clone <a_repository>  
$ git branch  
* master  
$ git branch testing  
$ git checkout testing  
...edit a file, add a new one, delete...  
$ git status  
    # On branch testing  
    # Changed but not updated:  
    #   (use "git add/rm <file>..." to update what will be committed)  
    #   (use "git checkout -- <file>..." to discard changes in working directory)  
    #  
    #       deleted:    file1.txt  
    #  
    # Untracked files:  
    #   (use "git add <file>..." to include in what will be committed)  
    #  
    #       file2.txt  
no changes added to commit (use "git add" and/or "git commit -a")  
$ git branch  
  master  
* testing  
$ git checkout master  
D       file1.txt  
Switched to branch 'master'  
$ git status  
    # On branch master  
    # Changed but not updated:  
    #   (use "git add/rm <file>..." to update what will be committed)  
    #   (use "git checkout -- <file>..." to discard changes in working directory)  
    #  
    #       deleted:    file1.txt  
    #  
    # Untracked files:  
    #   (use "git add <file>..." to include in what will be committed)  
    #  
    #       file2.txt  
no changes added to commit (use "git add" and/or "git commit -a")  

Pensé que, al usar ramas, cualquier cosa que hagas en una rama, es invisible para todas las otras ramas. ¿No es esa la razón de crear sucursales?

Intenté usar "git add" pero los cambios son visibles en ambas ramas. ¿Necesito ejecutar "git commit" antes de cambiar entre ramas para evitar esto?

JPZ
fuente

Respuestas:

142

Cambiar de sucursal conlleva cambios no comprometidos. Confirme primero, ejecute git checkout .para deshacerlos o ejecute git stashantes de cambiar. (Puede recuperar sus cambios con git stash apply)

Sean Clark Hess
fuente
10
git stash pop es mejor a menos que desee acumular una gran pila de escondites.
Siride
7
@JPZ: git stash solo trata con archivos rastreados; los archivos nuevos no se rastrean, por lo que no se guardarán.
Siride
2
@JPZ: Si desea guardar los archivos sin seguimiento, lo que debe hacer es git addguardarlos antes de guardarlos. Dicho esto, no estoy seguro de que realmente quiera guardarlos aquí; si tiene la intención de que esos cambios formen parte de la rama de la que se está alejando, confíelos. (Si tiene la intención de volver a esa rama y trabajar más en los cambios antes de confirmarlos, entonces stashpuede ser la herramienta adecuada para el trabajo).
Cascabel
16
"Cambiar de rama conlleva cambios no comprometidos": esto tiene sentido y quizás sea la peor idea de diseño. ¿De qué sirve tener sucursales si no se puede trabajar de forma aislada? !!!
nehem
1
En mi caso, tengo una rama de función de una rama de desarrollo. Me comprometí en la rama de funciones, pero también muestra los cambios cuando reviso la rama de desarrollo.
Hitesh Garg
31

Respuesta corta: sí, necesitas comprometerte. ¡Asegúrate de hacerlo en la rama correcta!

Una rama es un puntero a una confirmación. Cuando confirma con una rama extraída, la rama avanza para apuntar a esa nueva confirmación. Cuando revisa una rama, está revisando la confirmación a la que apunta. (Puede pensar en las confirmaciones como instantáneas de su árbol de trabajo).

Entonces, si tiene cambios que no ha comprometido, no se verán afectados por el cambio de sucursales. Por supuesto, si cambiar de rama es incompatible con sus cambios, git checkoutsimplemente se negará a hacerlo.

git addes un comando para organizar cambios, que luego confirmará. No registra esos cambios en el historial del repositorio. Simplemente los coloca en un área de preparación (el índice); git commitluego usa el contenido de esa área de preparación para crear confirmaciones.

Cascabel
fuente