2008-10-29 18 views
42

Estoy trabajando en un repositorio git con una rama maestra y otra rama temática. He cambiado a la rama de tema y he modificado un archivo. Ahora, si cambio a la rama maestra ese mismo archivo se muestra como modificado.Los archivos modificados en una rama git se están extendiendo a otra rama

Por ejemplo:

git status en la rama git-build:

# On branch git-build 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  modified: cvsup_current 
# 

Cambiar a rama principal

[[email protected] builder_scripts (git-build)]# git co master 
M  builder_scripts/cvsup_current 
Switched to branch "master" 

git status en la rama principal

[[email protected] builder_scripts (master)]# git status 
# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  modified: cvsup_current 
# 

Por qué es eso el archivo se muestra como modificado en la rama principal a pesar de que se modificó en la rama git-build?

Según entendí, las ramas son independientes entre sí y cuando cambio de una rama a otra, los cambios no se "expanden" de una rama a otra. Así que obviamente me falta algo aquí.

¿Alguien tiene una pista?

Respuesta

12

Este es el comportamiento predeterminado de git.

Puede usar -f marca para finalizar la compra y hacer una "comprobación limpia" si lo desea.

+11

Tenga en cuenta que esto no mantiene los cambios en la parte superior de la rama que está dejando ni nada. Esto descartará los cambios no confirmados (excepto si el archivo no está rastreado). – webmat

+6

Es el caso muy raro en el que desea utilizar 'git checkout -f' ya que instantáneamente, irrevocablemente, y sin provocar descartar cualquier cambio no confirmado. Hay una razón por la que el pago de git funciona de la manera que lo hace, le aconsejo que lea el comentario de Gareth a continuación. –

9

Los archivos modificados no se ponen en el repositorio hasta que los agregue y. Si vuelve a la rama de tema y confirma el archivo, no aparecerá en la rama principal.

58

¿Por qué el archivo se muestra como modificado en la rama principal aunque se modificó en la rama git-build?

La clave para recordar es que el archivo no fue modificado en la rama git-construcción. Solo fue modificado en tu copia de trabajo.

Sólo cuando se comprometa son los cambios puestos de nuevo en cualquier rama de haber efectuado su salida

+0

¡Gracias, las respuestas combinadas me han dejado esto muy claro! –

+0

Me acabo de dar cuenta, viniendo de una mentalidad de SVN, comprometerse en una rama no es realmente comprometerla con su servidor "SVN", es más bien un "guardar mis cambios en esta rama". Todavía estoy tratando de ajustarme. –

+4

"Solo se modificó en su copia de trabajo" <- no, también se modificó en el índice, es decir, el cambio se realizó –

38

Si desea almacenar temporalmente los cambios a una rama, mientras que ir fuera para hacer el trabajo en otro, puede utilizar la git stash mando. Es una de las increíbles ventajas poco conocidas de usar git. Ejemplo de flujo de trabajo:

git stash #work saved 
git checkout master 
#edit files 
git commit 
git checkout git-build 
git stash apply #restore earlier work 

git stash almacena una pila de cambios, lo que puede almacenar de manera segura múltiples puntos de control. También puede darles nombres/descripciones. Información de uso completo here.

+0

Aunque esto no responde directamente a la parte del por qué, esta respuesta se ajusta mejor a la intención de lo que el OP intentaba hacer. Esto es exactamente lo que estaba buscando –

1
  • No es como ramas git son dependientes entre sí, sino también que no tienen una base de código completo por separado para cada rama tampoco.
  • Para cada confirmación, Git almacena un objeto que contiene un puntero a los cambios . Por lo tanto, cada rama apunta a su última confirmación y apunta a la rama en la que se encuentra actualmente.
  • Al cambiar la bifurcación, el puntero HEAD apunta a esa confirmación particular de la bifurcación . Entonces, si hay archivos modificados, el comportamiento predeterminado de es copiarlos.

Puede hacer lo siguiente para solucionar este problema.

  1. Utilice -f opción para ignorar los cambios.

Si desea guardar los cambios:

  1. Confirme los cambios a nivel local en la misma rama y luego cambiar la rama .
  2. Utilice git stash, cambie la rama, haga su trabajo, vuelva a la rama original y haga git stash apply.
Cuestiones relacionadas