2009-05-24 7 views
9

Sé que thread dice que la rebase es para pequeños cambios de teamMates, mientras que se fusiona para grandes cambios.No se puede entender la rama, combinación y rebase de Git

guardo tres Gits de tres compañeros de equipo en la siguiente estructura de directorios donde todos tenemos el mismo código inicial:

project 
     | - I 
     | - myTeamMate1 
     | - myTeamMate2 

Las ramas no están en la misma Git. Esto significa que no puedo usar rebase y fusionar. He usado vimdiff para sincronizar cambios entre TeamMates. Sin embargo, esto lleva mucho tiempo.

me han tratado sin éxito de hacer la siguiente estructura de directorios donde todas las ramas están bajo una Git:

project 
     | - I - myTeamMate1 - myTeamMate2 

Sin embargo, corro comando de clonación para mí y para mi compañero de equipo:

git clone <url> 

y Aparece el mensaje de error después de ejecutar el segundo clon para mi compañero de equipo

fatal: destination path 'dotFiles' already exists and is not an empty directory. 

¿Qué estructura de directorios debo usar con un equipo de 3 personas, para poder usar los comandos rebase y merge?

Respuesta

10

Solo algunos otros pensamientos para completar la respuesta de Samuel.

  • A diferencia de SVN, ramas y directorios son completamente ajenos en Git: tener 3 ramas (una para cada miembro del equipo) no significa 3 directorios. Eso no es lo que quería decir en su pregunta (ya que sus directorios son en realidad 3 raíces para repositorios 3 Git), pero prefiero mencionarlo explícitamente por si acaso;)

  • Git siendo DVCS, los 3 repositorios pueden estar en cualquier lugar (no en 3 directorios en la misma computadora). Si son accesibles a través de una ruta UNC (\\desktop\path\to\repo), se pueden designar como remotos.

  • Git clon permite para obtener referencias de sucursales remotos, pero no crea ramales locales de seguimiento que le permiten obtener el trabajo de sus colegas. El módulo ruby ​​"remote branches" puede ayudar.

  • wary of rebase ya que reescribe el SHA-1 de la sucursal (ya que reproducir sus confirmaciones en la parte superior de la otra rama): si sus compañeros de equipo basaron sus fusiones en sus ramas, que tendrán que fusionarse todos sus confirmaciones todas las veces, ¡incluso aquellas ya fusionadas!
    mejor Es tener 2 ramas en este caso:

    • un trabajo rama está utilizando para su desarrollo y el cambio de base (para integrar los trabajos de sus compañeros, a pesar incluso de que la operación se podría hacer en su sucursal propia)
    • a publicando la sucursal pública, en la que solo fusiona su trabajo estable, y que luego puede ser utilizado por otros repositorios remotos como fuente de fusiones.
+0

Acepto esta respuesta, ya que es suficiente "en profundidad". Sin embargo, consulte la respuesta de Samuel y mi respuesta sobre ejemplos concretos para resolver el problema. -- ¡Gracias por su respuesta! –

+0

@VonC: ** ¿Funciona el módulo ruby ​​"branches remotas" en su Ubuntu Jaunty? ** Obtiene el comando 'grb not found' después de instalar rubygems y todas las dependencias enumeradas en el archivo README. –

+0

@Masi, sí, debería (aunque no probado directamente): 'sudo gem install git_remote_branch --include-dependencies' debería hacerlo, siempre que su' $ PATH' haga referencia al directorio 'bin' de ruby ​​para los scripts. – VonC

5

El hecho de que no sean dentro del mismo git como usted indica no lo limita de ninguna manera. Git se distribuye, lo que significa que puede buscar entre esos repositorios, combinar, rebase, etc.

Mira git remote --help para ver cómo se puede nombrar sus compañeros de equipo en los repositorios de la suya para que pueda fácilmente importación sus cambios, rebase sobre ellos o realizar fusiona. No hay necesidad de cambiar su estructura de directorio, la suya es perfectamente utilizable.

+0

¡Gracias por tu respuesta! –

+0

Así que el comando remoto no significa que diferentes Gits deben estar en las diferentes computadoras. Simplemente significa que tienes muchos Git para manejar tu proyecto. –

+0

Exactamente. Un repositorio es remoto tan pronto como sea alcanzable, ya sea local o remotamente. Eh, incluso podría designar su propio repositorio como uno remoto, pero el uso sería muy limitado. –

4

A decir verdad, empecé a trabajar en escribir una buena respuesta, largo, detallado ... pero esto ya se explica mucho mejor que pude en http://excess.org/article/2008/07/ogre-git-tutorial/. Él cubre el uso de diferentes ramas, controles remotos y fusión. También se hace en screencast, así que tómate una hora, toma un café y disfruta de la conferencia.

Específico a su pregunta: no debe usar una configuración de directorio. Git no maneja la bifurcación con directorios de la misma manera que SVN lo hace con las carpetas de sucursales. Las ramas en git son una cosa completamente diferente. Si bien es posible que no configure un repositorio central (lo recomiendo), debe configurar una sola rama maestra a la que todos le encomienden su trabajo final y limpio.

Un depósito de ejemplo de la mía tiene una captura de pantalla en Wikimedia Commons. En mi ejemplo, "bartender" envía su código solo en trozos de alquitrán, por lo que tengo que importarlo para administrarlo. "maestro" (que se muestra aquí solo como controles remotos/elf/master) es un repositorio de svn público que importo y baso cambios fuera de. "autocracy" es mi propia línea base para el código, y "private" es donde guardo un archivo de configuración con contraseñas que quiero administrar pero nunca publico. Compruebe timestamps en privado, y verá que no se alinean con las ramas a continuación. Esto se debe a que rebase esa rama en "autocracia" en lugar de fusionar.

Notarás dos referencias remotas: elf y bardo. Estas son dos máquinas remotas que alojan el software. Puedo empujar y tirar de mis ramas hacia allí como lo desee. En tu caso, tendrías repositorios remotos de tus otros desarrolladores, y ellos modificarían sus propias sucursales. Ver el tutorial le dará una mejor idea de cómo funciona. Buena suerte :)

5

Ejemplos de código

Para realizar un seguimiento de una rama remota

git remote add -t master Hnr git://github.com/userName/files.git 

Esto no le descarga la rama. Simplemente edita el archivo .git/config y agrega algunas líneas que le dicen a Git cómo y dónde obtener datos de forma remota.

Para obtener rama de su compañero de equipo, ejecute

git fetch Hnr 

Para ver que realmente tenga sus compañeros de equipo rama, ejecutar

git branch -a 

o para ver sólo sus amigos ramas

git branch -r 

Los dos comandos anteriores causaron mi confusión inicialmente, ya que no los conocía. Esto me hizo probar otros comandos innecesarios para tener las ramas para mí.

segunda manera de tener sucursal de su amigo

Sin embargo, tenga en cuenta que puede utilizar git-clone tener el código de su amigo a un directorio independiente de la siguiente manera

git clone UrlAtGithub 

A continuación, al parecer, puede usar Git-remoto como antes para tener una sucursal en su Git repo:

git remote add master Hnr PATH/ToYourFriendRepo.git 

Conclusión: Puede usar dos formas para tener la rama de su TeamMate, ya sea por git-clone o sin ella. Ambas formas requieren el uso de git remote add. La ventaja de este último parece ser que necesita ejecutar un comando menos. El primero vuelve a darle el repo completo de su equipo a su disco duro.

Consulte los manuales de Git para saber cómo puede actualizar sus sucursales remotas. (rama remota NB puede estar delante del ordenador. No tiene que estar en un equipo remoto. Su rama puede ser la rama remota también, pero esto restringe el flujo de trabajo.)


Es posible que el próximo desee para fusionar el archivo específico de tu amigo en tu sucursal. En ese caso, es suficiente con conocer las 5 primeras letras del compromiso de su amigo para fusionar el archivo.

[no estoy seguro de cómo se puede hacer lo siguiente:] Tiene que ejecutar, por ejemplo

git merge 76a32 

Usted puede obtener la siguiente salida

CONFLICT (add/add): Merge conflict in shells/externalPrograms 
Auto-merging shells/smallApps/extract 
CONFLICT (add/add): Merge conflict in shells/smallApps/extract 
Auto-merging shells/smallApps/extract~ 
CONFLICT (add/add): Merge conflict in shells/smallApps/extract~ 
Automatic merge failed; fix conflicts and then commit the result. 

En ese caso, sus archivos difieren significativamente de los de su amigo y Git no puede decidir qué archivo tomar. Tiene que ejecutar al parecer el siguiente

git rebase 

y se obtiene

shells/smallApps/extract: needs merge 
shells/smallApps/extract~: needs merge 
cannot rebase: you have unstaged changes 

Ejercicio 1: Sin embargo, ahora estoy en atascado, ya que mi TIG no muestra de mi amigo cometer en mi árbol de Git . ¿Cómo se puede obtener commit 76a32 de su amigo en su árbol Git qué rama está en su Git?


Es posible que haya resuelto el problema. El problema estaba en que lo ignoré para resolver los conflictos sobre los cuales Git me dio notificaciones. Google guarda el día de nuevo en el official Git site:

Si hay conflictos - por ejemplo, si el mismo archivo se modifica en dos formas diferentes en la rama remota y la filial local - a continuación, son advertido -

El siguiente problema es limpiar las partes problemáticas y fusionar nuevamente. Usted ve algo similar a lo siguiente en sus archivos problemáticos: ¡diviértase! (Finalmente llegar a problemas reales;)

alt text http://dl.getdropbox.com/u/175564/exampleGitProblemSolving.png


problema en diffing y la fusión dotfiles en FileMerge de Mac

que necesitaba para actualizar mi Git, ya que sólo la más reciente Git tiene difftool -mando. Puede encontrar una solución en el thread.

Difftool le permite iniciar dotFiles en FileMerge desde la terminal. No puedes acceder a ellos en GUI. Funciona como

git difftool master:README dev:README 

problema con su cuenta de Github después de añadir una nueva cuenta remota

Su cuenta de Github pueden haber sido desaparecido en .git/config. En ese caso, es necesario ejecutar el siguiente código

git remote add -f YourUserName [email protected] 

A continuación, puede notar que no se puede git-push normalmente por

git push origin master 

Usted puede obtener el siguiente mensaje de error

fatal: 'origin' does not appear to be a git repository 
fatal: The remote end hung up unexpectedly 

También puede probar los siguientes comandos para resolver el problema

git push Masi master 

y todos los 3 en 2 permutaciones de Masi, maestro y origen. Sin embargo, ninguno de los comandos no funcionó.

Exercise 2: ¿Cómo se puede comprometer con su cuenta github ya que tiene un equipo en su lista remota?

Origen es un nombre corto para su git-repo externo real, por ejemplo, en Github. El contenido de su origen de variable puede haber sido reemplazado por otro repositorio remoto. En este caso, recomiendo que le permite crear una nueva variable por

git remote add github [email protected]:myLogin/myProject.git 

Tenga en cuenta que usted podría tener origen2 en el lugar de GitHub. Origin es solo una convención al nombrar el repositorio.

continuación, puede simplemente ejecutar

git push github master 

Es posible que tenga una contraseña en su clave ssh. Si tiene, puede obtener un permiso denegado. Si lo hizo, consulte el thread.

+0

Algunos puntos buenos en su propia respuesta, gracias por sus comentarios. +1 – VonC

+1

Nota: git merge o git rebase pueden darle conflictos, como se indica aquí (http://stackoverflow.com/questions/457927/git-workflow-and-rebase-vs-merge-questions). Tiene que resolver esos conflictos de combinación con una buena herramienta de diferencias: más detalles allí (http://stackoverflow.com/questions/861995/is-it-possible-for-git-merge-to-ignore-line-ending- diferencias) – VonC

+0

@VonC: ¡Gracias por los consejos! - Actualmente estoy trabajando para que los programas de mi Mac se puedan iniciar en Zsh directamente. Noté que Mac tiene FileMerge -program por defecto. Parece ser similar a sus programas mencionados en su respuesta. –

Cuestiones relacionadas