2012-05-27 8 views
7

Estoy tratando de comenzar con git en un proyecto github. (He estado usando CVS, SVN y hg durante años; es difícil entenderlo). Estoy siguiendo las instrucciones con la mayor precisión posible y simplemente no puedo hacer que funcione.Fusionar conflictos actualizando desde upstream

Puedo clonar mi proyecto bifurcado:

git clone [email protected]:davidgiven/linux-allwinner.git 

Como se recomienda, añado un mando a distancia 'aguas arriba' que realiza el seguimiento del proyecto que mi única se bifurca a partir de:

git remote add upstream https://github.com/amery/linux-allwinner.git 

voy a buscar de ella:

git fetch upstream 

Todo esto funciona bien. Pero pasaron más o menos una semana desde que hice el proyecto, y upstream han estado haciendo cambios. Entonces quiero aprovechar esos cambios. Actualmente estoy en la rama derecha --- Allwinner-v3.0-android-v2 --- así que Combinar desde aguas arriba en mi rama:

git merge upstream/allwinner-v3.0-android-v2 

... y consigo conflictos de combinación.

CONFLICT (add/add): Merge conflict in arch/arm/mach-sun5i/pm/standby/common.h 
CONFLICT (add/add): Merge conflict in arch/arm/mach-sun5i/pm/standby/Makefile 
CONFLICT (add/add): Merge conflict in arch/arm/mach-sun5i/pm/standby.S 
CONFLICT (add/add): Merge conflict in arch/arm/mach-sun5i/pm/Makefile 
[etc] 

Ahora, he comprobado en nada; Todavía no he empezado a trabajar, y mi proyecto está completamente intacto desde que lo bifurqué. Por lo tanto, no debería ser posible tener ningún conflicto. Pero hay algunos; ¿Qué está pasando y cómo lo soluciono?

Actualización:

git show-branch HEAD upstream/allwinner-v3.0-android-v2 muestra esto, que tengo que decir que no entiendo una palabra de:

! [HEAD] arm: sun3i: add getioaddr macro 
! [upstream/allwinner-v3.0-android-v2] arm: sun3i: updated irq handling and machine_desc to 3.0 
-- 
+ [upstream/allwinner-v3.0-android-v2] arm: sun3i: updated irq handling and machine_desc to 3.0 
+ [upstream/allwinner-v3.0-android-v2^] arm: sunxi: renable early_printk in all _defconfig except crane's 
+ [HEAD] arm: sun3i: add getioaddr macro 
+ [HEAD^] arm: sun3i: add dummy machine type 
+0

Suena como un caso en el que desea rebase en lugar de combinar. – ThiefMaster

+0

'git show-branch HEAD upstream/allwinner-v3.0-android-v2' podría revelar algo interesante. – georgebrock

+0

¿Es esa la salida completa de 'show-branch'? Esperaría que termine con una línea que comience con '++' – georgebrock

Respuesta

11

Podría ser, que aguas arriba se ha reescrito la historia (reajustar, modificar , ...) - no deberían hacer eso, pero nunca lo sabrás.

Desde que decir que no tiene cualquier cambio local, o confirmaciones, usted debe traer su repositorio de nuevo a un estado limpio restableciendo su sucursal:

git reset --hard upstream/allwinner-v3.0-android-v2 

(Esto descartará cualquier cambio local y hacer confirmaciones de HEAD y inalcanzables!)


lo anterior supone que usted (fuerza) empujar el nuevo estado de restablecer su rama en el repositorio remoto, de lo contrario se encontrará con los conflictos y de nuevo cuando Intente sacar desde origin.

git push origin +allwinner-v3.0-android-v2 

Si ya se había comprometido a sí mismo a nivel local, que tendría que reajustar (o cereza-escoge) que realiza poco en la parte superior de la rama aguas arriba, y luego hacer un empuje a su origen. De esta forma usted volver a escribir su historia local de la misma forma hizo aguas arriba y aplicar los cambios en la parte superior, es decir:

git rebase --onto upstream/branch \ 
    last-original-upstream-commit-before-yours \ 
    your-branch 
+0

Lo he intentado. Desafortunadamente no ayuda ... ahora 'git push' falla, diciéndome que necesito' git pull' primero; pero 'git pull' produce los mismos errores de combinación que antes. Esto es realmente lo que esperaría; mi entendimiento es que 'git reset' cambia la rama actual a la especificada, así que ahora simplemente tengo una copia de' upstream/allwinner-v3.0-android-v2' comprobada localmente como 'allwinner-v3.0-android -v2'. Pero dado que los conflictos están ocurriendo entre 'origin/...' y 'upstream/...', lo único que cambia es cuando ocurren los conflictos. –

+0

@DavidGiven: git push ¿hacia dónde? Fallará, ya que su impulso ya no es rápido. Mencionas en tu pregunta que no has cometido nada, ¿entonces tal vez un solo impulso forzado es el camino a seguir? – knittl

+0

'git push origen allwinner-v3.0-android-v2'. (Lo cual, por cierto, hace exactamente lo mismo que un simple 'git push'.) TBH, quiero saber qué está pasando aquí; Aún no tengo compromisos, pero sí quiero comenzar a trabajar en esto muy pronto, así que necesito una solución general en caso de que vuelva a suceder en lugar de una solución de nuke-everything. –

2

La salida show-branch significa que upstream y HEAD han cada uno añadido dos confirmaciones desde su ancestro común (suponiendo esa es la salida completa).(Ver también: http://www.gitguys.com/topics/git-show-branch-to-see-branches-and-their-commits/) Si no has cometido nada por ti mismo, eso significa que upstream presionó una rebase (u otra cosa que cambió el historial). Como no has cometido nada, la respuesta de Knittl es exactamente lo que quieres.

Por lo que vale, también me encanta git log --oneline --graph --decorate --remotes --branches para esto. Obtendrás un gráfico ASCII con todas tus ramas y controles remotos, para que puedas visualizar qué pasó donde.

Cuestiones relacionadas