Incapaz de entender la twig de Git, fusionar y rebase

Sé el hilo que dice que la rebase es para pequeños cambios de TeamMates, mientras se fusionan para grandes cambios.

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

project | - I | - myTeamMate1 | - myTeamMate2 

Las twigs no están en el mismo Git. Esto significa que no puedo usar rebase y fusionar. He usado vimdiff para sincronizar cambios entre TeamMates. Sin embargo, esto lleva mucho time.

Intenté sin éxito hacer la siguiente estructura de directorys donde todas las twigs están bajo un Git:

 project | - I - myTeamMate1 - myTeamMate2 

Sin embargo, ejecuto el command de clonación para mí y para mi compañero de equipo:

 git clone <url> 

y recibo el post 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 directorys debería usar con un equipo de 3 personas, de modo que pueda usar los commands rebase y merge ?

Solo algunos otros pensamientos para completar la respuesta de Samuel.

  • A diferencia de SVN, las sucursales y directorys no están relacionados en absoluto en Git: tener 3 sucursales (una para cada miembro del equipo) no significa 3 directorys. Eso no es lo que quiso decir en su pregunta (ya que sus directorys son en realidad 3 raíces para repositorys de 3 Git), pero prefiero mencionarlo explícitamente por las dudas;)

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

  • El clon de Git le permite get references de sucursales de controles remotos, pero no crea rastreos locales que le permiten get el trabajo de sus colegas. El module de Ruby " twigs remotas " puede ayudar.

  • Tenga cuidado con rebase ya que reescribe el SHA-1 de su sucursal (ya que reproduce sus confirmaciones en la parte superior de otra sucursal): si sus compañeros de equipo basan sus fusiones en sus sucursales, deberán fusionar todas sus confirmaciones todas las veces, incluso aquellas ¡ya fusionado!
    Lo mejor es tener 2 twigs en este caso:

    • una twig de trabajo que está utilizando para su desarrollo y rebase (para integrar las obras de sus compañeros, aunque incluso esa operación podría hacerse en su propia sucursal)
    • una sucursal pública de publicación , en la que solo fusiona su trabajo estable, y que luego puede ser utilizada por otros repositorys remotos como fuente de fusiones.

El hecho de que no estén dentro del mismo idiota que usted indica no lo limita de ninguna manera. Git se distribuye, lo que significa que puede search entre esos repositorys, combinar, rebase, etc.

Mira el git remote --help para ver cómo puedes nombrar los repositorys de tus compañeros de equipo en los tuyos para que puedas importar fácilmente sus cambios, rebase en ellos o realizar fusiones . No hay necesidad de cambiar su estructura de directory, la suya es perfectamente utilizable.

Ejemplos de código

Para rastrear una twig remota

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

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

Para get la twig de tu equipoMate, ejecuta

 git fetch Hnr 

Para ver que realmente tienes la twig TeamMates, ejecuta

 git branch -a 

o para ver solo las twigs de tus amigos

 git branch -r 

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

Segunda forma de tener la sucursal de tu amigo

Sin embargo, tenga en count que puede usar git-clone para tener el código de su amigo en un directory separado de la siguiente manera

 git clone UrlAtGithub 

Entonces, aparentemente puedes usar Git-remote como se indica arriba para tener una twig en tu repo de Git:

 git remote add master Hnr PATH/ToYourFriendRepo.git 

Conclusión: puede usar dos forms para tener la twig de su TeamMate para usted, ya sea por git-clone o sin él. Ambas forms requieren el uso de git remote add . La ventaja de este último parece ser que necesita ejecutar un command less. 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. (La sucursal remota de NB puede estar en su computadora. No tiene que estar en una computadora remota. Su sucursal también puede ser la sucursal remota, pero esto restringe su flujo de trabajo).


A continuación, puede fusionar el file específico de su amigo en su sucursal. En ese caso, es suficiente conocer las 5 primeras letras del compromiso de su amigo para fusionar el file.

[No estoy seguro de cómo puede hacer lo siguiente:] Necesita ejecutar, por ejemplo

 git merge 76a32 

Puede get 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 files difieren significativamente de los de su amigo y Git no puede decidir qué file tomar. Necesitas ejecutar aparentemente lo siguiente

 git rebase 

y obtienes

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

Ejercicio 1: Sin embargo, ahora estoy atascado, ya que mi tig no muestra el compromiso de mi amigo en mi tree Git. ¿Cómo puedes get la confirmación 76a32 de tu amigo en tu tree Git, qué twig está en tu Git?


Puede que ahora hayas resuelto el problema. El problema estaba en que lo ignoré para resolver los conflictos sobre los cuales Git me dio notifications. Google vuelve a salvar el día en el sitio oficial de Git :

Si hay conflictos, por ejemplo, si el mismo file se modifica de dos maneras diferentes en la sucursal remota y en la sucursal local, entonces se le advierte:

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

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


Problema al distinguir y fusionar dotFiles en FileMerge de Mac

Necesitaba actualizar mi Git, ya que solo el Git más nuevo tiene difftool -command. Puedes encontrar una solución en el hilo .

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

 git difftool master:README dev:README 

Problema con su count en Github después de agregar una nueva count remota

Su count de Github puede haber desaparecido en .git / config. En ese caso, debe ejecutar el siguiente código

 git remote add -f YourUserName [email protected] 

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

 git push origin master 

Puede recibir el siguiente post de error

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

También puedes probar los siguientes commands para resolver el problema

 git push Masi master 

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

Ejercicio 2 : ¿Cómo puedes comprometerte con tu count de github ya que tienes un Teammate en tu list remota?

Origin es un nombre corto para su real git-repo externo, por ejemplo, en Github. El contenido de su origen variable puede haber sido reemplazado por otro repository remoto. En este caso, te recomiendo que crees una nueva variable

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

Tenga en count que podría tener origin2 en el lugar de github. Origin es solo una convención al nombrar el repository.

Entonces simplemente puedes ejecutar

 git push github master 

Puede tener una frase de contraseña en su ssh-key. Si tiene, puede get un permiso denegado. Si lo hiciste, por favor mira el hilo .

A decir verdad, comencé a trabajar escribiendo una respuesta agradable, larga y detallada … pero esto ya se explica mucho mejor de lo que pude en http://excess.org/article/2008/07/ogre-git- tutorial / . Él cubre el uso de diferentes twigs, 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 configuration de directory. Git no maneja la bifurcación con directorys de la misma manera que SVN lo hace con las carpetas de sucursales. Las twigs en git son una cosa completamente diferente. Si bien es posible que no configure un repository central (lo recomiendo), debe configurar una única twig maestra en la que todo el mundo confíe su trabajo final y limpio.

Un ejemplo de un repository mío 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 repository de svn público que importo y baso cambios fuera de. " autocracia " es mi propia reference para el código, y " privado " es donde guardo un file de configuration con passwords que quiero administrar pero nunca publicar. Verifique las marcas de time en privado, y notará que no se alinean con las twigs a continuación. Esto es porque rebase esa twig en "autocracia" en lugar de fusionar .

Verás dos references remotas: elfo y bardo . Estas son dos máquinas remotas que alojan el software. Puedo empujar y tirar de mis twigs hacia allí como lo desee. En tu caso, tendrías repositorys 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 🙂