2009-02-24 35 views
24

He estado luchando contra la curva de aprendizaje de git/git-svn y anoche, como parte de esa curva de aprendizaje, hice algo muy, muy malo. Desde entonces lo he corregido, pero espero entender el error a mi manera.Usando git-svn: Pull, Merge or Rebase?

Tengo un repositorio svn del que he clonado el tronco y las ramas (etiquetas que ignoré porque no trabajamos en ellas). El uso de git, creé ramas locales para cada una de las ramas que actualmente necesidad de trabajar con:

$ git checkout -b trunk svn/trunk 
$ git checkout -b feature1 svn/branches/development/feature1 
$ git checkout -b maint svn/branches/maintenance/previous-version 

hice feature1 mi rama activa e hice algunos cambios antes de dejarnos llevar por unos días. Volví a la pantalla ayer y quería integrar todos los cambios que se habían realizado en el maletero para poder trabajar con lo último y lo mejor. Lo que hice fue una actualización completa de todas las marcas primero, a través de git svn rebase (nadie más había trabajado en la rama feature1). Con todo actualizado desde mi repositorio svn, traté de volver a establecer la base.

Con feature1 como mi rama activa, hice un "git rebase trunk" pensando que estaría realizando cambios desde el tronco en la rama feature1. Resulta que estaba muy, muy mal. Después de fusionar todos los conflictos, hice git svn dcommit y encontré que mis cambios se habían aplicado al tronco.

Mi primera pregunta es simplemente ¿dónde estaba el error central en mi proceso de pensamiento? El segundo es que, después de leer mucho y buscar en Google, veo gente que defiende tirones, fusiones y rebases. Dado el hecho de que quiero fusionar los cambios aplicados en una rama local a otra rama local, ¿qué debería haber hecho? ¿Cuál es la mejor práctica para este escenario?

Gracias por su ayuda.

Respuesta

16

El problema con el que se encontró es que la sintaxis de línea de comando para rebase no coincide con sus expectativas (muy razonable, IMO).

$ git checkout feature1 
$ git rebase trunk 

Esta secuencia se suma el feature1 no compartido se compromete en la cabeza del tronco, y que se esperaba que iba a colocar el nuevo tronco se compromete a la cabeza de feature1. La sintaxis en realidad tiene sentido cuando sabes cómo se implementa el modelo de datos de Git (que sin duda es la razón por la cual es así). Pero para mí es lo contrario de lo que espero, funcionalmente. Lo mejor es aprenderlo como una construcción arbitraria y no tratar de tener expectativas.

Tienes razón en que entiendes cómo interactuar con el repositorio SVN usando git-svn. Así que ignora lo que encontraste en Google sobre empujar y tirar y fusionar: hay mucha discusión casi correcta por parte de personas que actúan como si empujar y tirar y fusionar son lo mismo en git y svn. Casi a la derecha todavía está mal.

+0

Tiene razón en que no estoy familiarizado con la implementación del modelo de datos (¿tiene algún URI bueno?). Si tuviera que leer mi declaración de rebase, ¿debería leerla como "git rebase [* from * active branch * to *] trunk" o eso es demasiado limitante? Gracias. –

+0

* Git de abajo hacia arriba * (http://www.newartisans.com/blog_assets/git.from.bottom.up.pdf) y * Git Internals * (http://peepcode.com/products/git-internals -pdf) son muy buenos para entender la estructura de Git. (Git Internals cuesta $ 9; no recomiendo el screencast en Git en el mismo sitio). – Paul

+0

Esa es una buena lectura del comando. Me resulta difícil recordar, ya que el objeto sobre el que se actúa es la rama desprotegida en muchos comandos de git. – Paul

-3

Debe usar git svn clone -s para clonar el árbol svn completo, incluidas todas las ramas. A partir de entonces, use git svn rebasey git svn dcommit en master para manejar svn, y puede crear git branches para su uso privado.

+0

Sin embargo, eso realmente no responde las preguntas. Entiendo cómo salir y poner a Svn usando git-svn. Estoy tratando de entender cómo mover cosas en mis sucursales locales antes de ** comprometerlo de nuevo. Yo ** creo ** eso es todo git cosas independientemente de la conexión svn. –

+1

Bueno, lo encontré útil :) No sabía que debería usar git svn rebase en lugar de git svn pull. –

Cuestiones relacionadas