2010-02-02 14 views
24

He estado buscando por aquí para buscar una respuesta y parece que puedo estar haciendo suposiciones incorrectas sobre cómo se supone que funcionan las ramas de git.Archivos no rastreados entre sucursales en Git

Tengo mi sucursal master y he creado una rama de función llamada profiles donde estoy haciendo un trabajo específico para los perfiles. Mientras trabajaba en perfiles, he cambiado 5 o 6 archivos y he agregado otros 5 o 6 archivos nuevos. Necesitaba volver a la rama master para corregir un error rápido y noté que todos los archivos nuevos y los archivos modificados estaban allí también. Supongo que esto tiene sentido ya que git no va a eliminar archivos sin seguimiento de la rama master y traerlos de vuelta a mi rama profiles ya que, de hecho, no se han rastreado. Pero ¿qué pasa con los cambios a los archivos existentes? ¿Por qué están apareciendo en la rama principal?

¿Cuál es la mejor práctica aquí? Aún no estoy listo para comprometer los cambios a nivel local. ¿Debería esconder todos estos cambios, cambiar a master, hacer la pequeña corrección, volver a profiles y luego volver a aplicar el alijo?

Cualquier ayuda es apreciada. Gracias

Respuesta

33

"Todavía no estoy preparado para confirmar los cambios a nivel local".

Los compromisos en git son cosas locales que se pueden deshacer, volver a hacer y volver a hacer a voluntad. Solo cuando presionas el compromiso en algún lugar debes prestar atención.

Además, las confirmaciones son visibles para herramientas locales como gitk, y pueden tener diferencias de ellas y pueden volver a basarse en otras confirmaciones, etc. Es una herramienta muy poderosa. Aprende a usarlo.

frecuencia que hago:

git add .; git commit -a -m 'WIP' 

sólo para ir acumulando todo en el árbol de trabajo actual, si creo que podría ser interrumpido. Si realizo algunos cambios más, uso:

git add .; git commit --amend 

para actualizar mi compromiso "WIP" en el lugar. Cuando por fin estoy listo para el verdadero comprometo, acabo:

git reset --soft HEAD~; git reset 

y ahora puedo controlar cuidadosamente lo que la final será cometen.

+1

Tengo una memoria horrible y me gusta usar git para ver dónde estoy en mi trabajo (y con Magit es aún más fácil, y se incorpora a mi flujo de trabajo). Realmente, tu solución tiene más sentido. Simplemente comprométete más a menudo. Solo necesito modificar un poco mi flujo de trabajo. gracias – Clarence

+2

Solo para aclarar, ¿hay alguna diferencia entre 'git reset --soft HEAD ~; git reset' y 'git reset HEAD ^'? Por lo que puedo ver, ambos reiniciaron HEAD y el índice del padre del compromiso "WIP" listo para realizar una confirmación real usando algunos o todos los cambios del árbol de trabajo, pero puede haber perdido una sutileza. –

+2

@Charles Bailey: "--soft no toca el archivo de índice ni el árbol de trabajo en absoluto, pero requiere que estén en buen estado. Esto deja todos los archivos modificados" Se deben confirmar los cambios ", ya que el estado de git pondría eso." si usa "git reset HEAD ^" no obtendrá este fatal: no se puede hacer un reinicio suave en el medio de una fusión. – maletin

5

No están apareciendo en la rama principal - si hiciera un restablecimiento completo y una limpieza, desaparecerían. Git simplemente preserva sus modificaciones locales cuando cambia de sucursales.

Esto es comúnmente útil; es posible que se haya dado cuenta de que desea confirmar esas modificaciones en una sucursal diferente de la que tiene actualmente. Si las modificaciones entraban en conflicto con la diferencia entre las dos ramas, git se negaría a cambiar de rama.

Tiene razón sobre el mejor enfoque, aunque cambiar de rama limpiamente es en mi experiencia uno de los usos más comunes de git stash.

3

Parece que creó la rama con git branch profiles, pero no se cambió a ella, por lo que se quedó en master, y obtuvo los cambios cuando hizo una confirmación.

Después de crear la rama, debe cambiarla explícitamente con git checkout (simplemente cree una nueva rama sobre la marcha y cambie a ella en un paso usando git checkout -b).

Si tiene cambios que no desea perder (o comprometerse con la rama actual), pero en lugar de poner en la otra rama, hacer:

git add -A 
git stash 
git checkout <other branch> 
git stash pop 

Más información sobre git stash está disponible en git-scm.com

Cuestiones relacionadas