2012-08-03 14 views
6

Tengo dos ramas A y B. Lo que quiero hacer es crear un nuevo (merge) commit en A con el estado actual de A como padre que se refiere al árbol de archivos descrito por B descartando cualquier cosa de A. Básicamente, el historial de B debería aplastarse en una única confirmación.Creando Merge Commit reemplazando el nuestro por el suyo

El estado del depósito de hormigón consta de dos ramas independend, que no tienen un antecesor común (procedente de dos repositorios independientes por encima), pero que describen el mismo contenido. Ahora quiero encontrar un camino "git" para reunirlos. Una solución básica (sin git) sería verificar A y simplemente copiar el contenido de B en el árbol de trabajo y hacer un git commit. Eso es básicamente lo que hice antes para propagar el contenido del segundo repositorio al primero.

hacerlo con git He intentado

git checkout A 
git merge --squash B 

Pero unforunately generó conflictos de combinación para todos los archivos que se diferencian entre A y B, lo que definitivamente no es lo que esperaba.

Básicamente algo así como

git merge --squash -s theirs 

debe hacer el trabajo, pero la estrategia de combinación theirs no existe. La lectura de la docu muestra la posibilidad de utilizar algo así como

git merge -X theirs 

que es una opción para la estrategia de combinación recursive. Pero esto todavía hace una fusión de fragmentos no conflictivos. Solo los fragmentos en conflicto se toman directamente del theirs.

+0

qué uno de los 'fusionan las estrategias --their' ser útiles aquí? http://stackoverflow.com/questions/4911794/git-command-for-making-one-branch-like-another/4912267#4912267 – VonC

+0

La simulación mencionada n. ° 2 debería hacer el trabajo. Acabo de usarlo para el 'merge --squash'. Después en la historia de B hay una fusión de A, pero esto está bien. Si no se desea, B puede reiniciarse nuevamente. –

+0

Ok, he agregado el # 2 como respuesta. – VonC

Respuesta

2

Como usted comenta, de todas las estrategias de la combinación --theirs la lista de I en "git command for making one branch like another", la segunda opción es cerca de lo que necesita:

se muestra como una fusión, con el nuestro como el primer padre .
(propuesto por jcwenger)

git checkout -b tmp upstream 
git merge -s ours thebranch   # ignoring all changes from downstream 
git checkout downstream 
git merge --squash tmp    # apply changes from tmp but not as merge. 
git rev-parse upstream > .git/MERGE_HEAD #record upstream 2nd merge head 
git commit -m "rebaselined the branch from upstream" # make the commit. 
git branch -D tmp     # deleting tmp 
Cuestiones relacionadas