2010-01-29 18 views
5

Acabo de empezar a usar git y estoy impresionado con las diferencias de flujo de trabajo de SVN, pero me he encontrado con una pregunta de configuración/estructural que la documentación no parece explicar intuitivamente cómo configurarla, y estoy preguntándose si es posible.configuración del repositorio Git para el desarrollo de dos máquinas?

Mi configuración es que tengo varias computadoras que desarrollo (de escritorio y portátil), así que, para mantenerme sincronizado y proporcionar una copia de seguridad para el repositorio de git, configuré un repositorio "público" en mi casa Servidor Linux al que puedo acceder desde el escritorio y la computadora portátil. No es realmente público, ya que requiere acceso SSH a la caja para acceder.

Mi problema viene cuando hago cambios en mi escritorio, puedo empujar fácilmente los cambios en el repositorio del servidor (no tengo el conjunto mirror bandera para el origin remoto en ese repositorio), y el uso de gitx puedo ver que el local y los estados remotos se ven idénticos, y cada uno de mis commits individuales se ha registrado en el servidor.

La pregunta es cuando me cambio a mi computadora portátil, que uso con poca frecuencia, el repositorio git es probable que haya varios compromisos detrás de la versión del servidor y deba actualizarse. Empecé a usar git pull para obtener esos cambios como locales, pero en lugar de duplicar todas las confirmaciones individuales en el servidor en el repositorio local, agrega una nueva confirmación 'fusión' al repositorio local, y gitx muestra la fusión en la rama de repositorio remoto en ese punto.

¿Existe un comando/flujo de trabajo que me permita actualizar el repositorio local al estado exacto del repositorio remoto (de modo que si hago un git push --mirror no se perderán los datos)? ¿Tendría que eliminar mi repositorio local cada vez y git clone de nuevo cada vez?

Actualmente, nadie más necesitaría acceder a este repositorio, aunque en el futuro podría convertirse en un repositorio público para que las personas lo extraigan, por lo que las respuestas que no destruyen esa posibilidad serían apreciadas.

Editar: Mis compromisos incluyen las ramas de rebase de la rama principal; podría ser eso lo que desencadena el comando git pull para mostrar como una combinación? ¿Es el indicador --rebase lo que necesito entonces?

Solución Explicación: Resulta que había hecho el siguiente para configurar mis repositorios:

  • Uso portátil para inicializar un repositorio git
  • empuje portátil repositorio de servidor (cometer Un)
  • hecho un cambio y se ha comprometido en la computadora portátil (portátil en cometer B)
  • escritorio depósito del servidor de clones (commit Un)
  • hacer cambios en el escritorio y la confirmación (C compromete , D, E , incluidas las sucursales cambio de base) empuja
  • de escritorio a servidor (servidor de rápido hacia delante a E)
  • Cuando portátil tira desde un servidor, da como resultado una fusión (desde B no pueden ayunar adelante a E).
  • El equipo portátil se fusiona y empuja los cambios al servidor
  • El escritorio ahora también tiene que fusionarse.

Debido a que una comisión adicional que fue un error no intencional, me llevó a pensar que siempre sería una fusión. Por sugerencia de Xentac, volví y encontré en la computadora portátil que había hecho una fusión que no se envió al servidor, que fue el culpable, y una vez que obtuve las tres realmente sincronizadas, git pull --ff (forzando solo fusiones rápidas)) funciona bien, y me advierte si algo no está sincronizado antes de hacer la fusión.

Respuesta

4

Debido a que tiene confirmaciones en la rama maestra de su computadora portátil que no están en la rama principal de su servidor, cada vez que el servidor cambia, la computadora portátil no puede simplemente actualizar el puntero de la rama maestra. Es por eso que estás creando uniones de fusión.

Si desea continuar teniendo cambios que no están almacenados en su servidor sino que simplemente están almacenados en su computadora portátil, querrá git fetch y luego git rebase origin/master. La búsqueda descargará las confirmaciones del servidor pero no cambiará las sucursales locales y la rebase volverá a crear los cambios de la rama maestra de su computadora portátil en la parte superior de la rama maestra del servidor (origen/principal).

Probablemente sería mejor no tener esos compromisos pendientes. ¿No pueden integrarse en toda la base de código para tener solo una historia común?

1

Iba a sugerir usar la bandera --ff, pero la página man dice que es el comportamiento predeterminado. Puede probar git pull --ff y ver si hace una diferencia.

Si está consiguiendo una fusión, sugeriría que tiene confirmaciones en su computadora portátil que no están en el servidor.

¿Su computadora portátil está configurada como un espejo del servidor, como su escritorio?

Cuestiones relacionadas