2012-01-10 17 views
7

Estamos migrando de SVN y también estamos fusionando varias ramas. Para simplificar masivamente, tenemos una rama B que se bifurcó hace mucho tiempo, y tiene un poco de desarrollo, digamos 8 archivos modificados, de cientos. Mientras tanto, grandes cambios han ocurrido en el maestro:Git: ¿Cómo fusionar una rama pequeña pero muy antigua?

A 
| 
X---(a few changes)--- B 
| 
|(hundreds of changes) 
| 
HEAD/master 

Si hago "maestro git merge" de la rama, muchos conflictos de fusión se muestran, ya que B y la cabeza son muy diferentes ahora. Pero esto parece (ingenuamente, para mí) erróneo: B no está tan lejos del tronco, es solo un largo camino atrás en el tiempo.

¿Hay alguna manera de aprovechar este hecho? ¿Debo intentar y primero fusionar B de nuevo a X, luego de allí a HEAD? ¿Cuáles serían los comandos a:

  1. Identificar revisión X
  2. Ver diferencias entre B y X
  3. Combinar B con X
  4. actualización de esa nueva versión fusionada a la cabeza

Es Hay otro enfoque que las personas usan en estas situaciones?

(Es muy posible que me han dicho algunas cosas muy estúpidas y poco git-como en el anterior - no dude en punto a cabo :).)

+1

¿Ha intentado crear un parche entre las dos ramas y aplicarlo a su cabeza actual. –

+0

entre X y B, quieres decir? eso suena como lo que quiero hacer. ¿Puedes señalarme los comandos correctos? –

+1

Dependiendo de lo que funcione mejor para usted, un par de ejemplos pueden ser git diff X..HEAD foo.cc> foo.patch o git diff X..HEAD> all.patch –

Respuesta

2

Creación de una nueva rama "X" desde el punto donde B y el maestro divergió y luego fusionar B en X no lo ayudará. Eso sería simplemente una fusión de avance rápido; habría literalmente sin cambios a los conflictos causados ​​por la fusión B en el maestro. Su única opción es realizar la fusión de B en el maestro y resolver los conflictos. Los conflictos son lo que son, y no hay forma de "rodearlos".

+0

Sí, al final creo que tienes razón, y este es el enfoque que tomé. Buenas herramientas ayudarían mucho. Curiosamente, la herramienta de resolución de conflictos en Eclipse (bueno, PyDev de todos modos) era menos buena que la Mac genérica "opendiff". Sin embargo, es bastante difícil manejar tantos conflictos y asegurarse de que no se pierda nada. Los buenos casos de prueba también ayudarían, supongo. –

+0

@SteveBennett: Las pruebas son geniales, pero solo van tan lejos, ya que si está fusionando una confirmación realmente antigua, las pruebas que agregó pueden no estar completas y las pruebas que modificó podrían cambiarse de forma incorrecta. – Cascabel

+0

A veces puede ser más fácil volver a establecer la base de la rama anterior en la parte superior del maestro. De esta forma, debe lidiar con los conflictos de fusión por compromiso anterior, no trabajar con un conflicto enorme que resulta de todos los compromisos anteriores como resultado de una fusión única. –

1

Si ya es suficientemente malo, quizás desee reescribir manualmente el parche contra HEAD o al menos una versión más reciente. Esto no solo ayudará a lidiar con los conflictos, y le dejará un historial que probablemente le gustará más, sino que también lo ayudará a evitar errores que no son parte de los conflictos de combinación. Hay un gran potencial de problemas debido al cambio de código debajo del cambio, y no todo se presentaría realmente como un conflicto de fusión.

Dicho esto, si quiere tratar de hacerlo únicamente de forma combinada, tendrá que lidiar con estos conflictos de una forma u otra. Es posible que podría ahorrarse un poco de dolor haciéndolo gradualmente, dando un paso adelante en el tiempo en incrementos más pequeños. Yo podría hacer esto por rebase progresivamente la rama hacia adelante:

git rebase version-2 old-branch 
# deal with conflicts if they happen 
git rebase version-3 old-branch 
# and so on... 
# until old-branch is based on a recent version 
git checkout master 
git merge old-branch 

Esto efectivamente dejar que usted se ocupa de los cambios más pequeños en cada paso, en lugar de tratar con todo de una vez.

Cuestiones relacionadas