git cambio de nombre divergente

Me gustaría saber cómo manejas una situación como esta en Git:

  • crear branch task001 desde master
  • master: modifique foo.c y cambie el nombre a bar.c
  • task001: modificar foo.c y cambiarle el nombre a moo.c
  • fusionar task001 para dominar

Lo que Git me dice es:

CONFLICT (rename/rename): Rename "foo.c"->"bar.c" in branch "HEAD" rename "foo.c"->"moo.c" in "task001" Automatic merge failed; fix conflicts and then commit the result. 

¿Cómo debería resolverlo? Quiero decir, todavía quiero fusionar los dos files una vez que se resuelva el conflicto de nombre.

Gracias.

Inicialmente, entendí que tu pregunta tenía un significado diferente de lo que has aclarado en los comentarios, pero la respuesta original puede ser útil, así que lo dejo como la primera parte, pero agrego una alternativa a continuación:

1. Solo resuelve el conflicto, por lo que solo tienes el moo.c y la barra divergentes.c

Aquí estoy suponiendo que el resultado que desea es tener bar.c y moo.c , con sus cambios de cada twig, en la versión fusionada. Me ocuparía de esto resolviendo el conflicto en el índice y comprometiéndome. La situación que describes se ve así:

 $ git log --pretty=oneline --graph --decorate master task001 * fce127471ab5d1ef55b1d16412a75a7129782517 (task001) Rename to a different file on task001 * 8edbc1357a3c0484dc077f6f7ce43de91d21e794 A small change on the task001 branch | * d10e9020d147a4bbd3688744823380322bf37718 (HEAD, master) Rename on master to bar.c | * f952617645456a551df07f219bfdc95e00c8ac9b Added a small change in master |/ * e8602eef46af744defd4fb4073ecdb6a7afbfd28 Initial version of foo.c 

Si luego task001 en master , produce el mismo error que ves:

 $ git merge task001 CONFLICT (rename/rename): Rename "foo.c"->"bar.c" in branch "HEAD" rename "foo.c"->"moo.c" in "task001" Automatic merge failed; fix conflicts and then commit the result. 

Luego, el git status le mostrará un resumen de los problemas:

 $ git status # On branch master # Unmerged paths: # (use "git add/rm <file>..." as appropriate to mark resolution) # # added by us: bar.c # both deleted: foo.c # added by them: moo.c # no changes added to commit (use "git add" and/or "git commit -a") 

Ahora solo necesitas usar git add y git rm para resolver los conflictos:

 $ git add bar.c $ git rm --cached foo.c foo.c: needs merge moo.c: needs merge rm 'foo.c' $ git add moo.c $ git status # On branch master # Changes to be committed: # # new file: moo.c # 

(Utilicé --cached para eliminar foo.c porque ya no está en la copy de trabajo, y " --cached significa que el command solo mira el índice – de lo contrario se obtiene un error acerca de que foo.c no existe).

Entonces solo comprometes los resultados:

 $ git commit [ save the prepopulated commit message ] 

Y ha resuelto los conflictos y tiene bar.c y moo.c en la versión fusionada.

(Noto de paso que la git merge -s resolve funciona para mí en la situación de ejemplo simple descrita aquí, pero espero que esto sea más útil en general).

2. Fusionando bar.c y moo.c de vuelta en un file

Parece de sus comentarios a continuación que realmente lo que desea es fusionar estos files nuevamente en uno, con los cambios en el file en ambas twigs fusionadas. Si desea que las estrategias de combinación de git lo ayuden con esto, los files de cada twig deben tener la misma ruta antes de la fusión, por lo que deberá cambiar el nombre de al less uno de ellos antes de la fusión. Supongamos que quiere que el file fusionado se llame quux.c , aunque podría hacerlo nuevamente foo.c , por supuesto. Luego, puede seguir los siguientes pasos, que cambian el nombre del file en cada twig antes de la fusión:

 # Rename the file on master: $ git checkout master Already on 'master' $ git mv bar.c quux.c $ git commit -m "Rename bar.c to quux.c on branch master" [master f9b3f49] Rename bar.c to quux.c on branch master 1 files changed, 0 insertions(+), 0 deletions(-) rename bar.c => quux.c (100%) # Rename the file on task001: $ git checkout task001 Switched to branch 'task001' $ git mv moo.c quux.c $ git commit -m "Rename moo.c to quux.c as well on branch task001" [task001 c71ad89] Rename moo.c to quux.c as well on branch task001 1 files changed, 0 insertions(+), 0 deletions(-) rename moo.c => quux.c (100%) # Switch back to master, and merge in task001: $ git checkout master Switched to branch 'master' $ git merge task001 

Si los cambios no entraron en conflicto, entonces en este momento esa fusión debería funcionar. En el ejemplo que probé, entraron en conflicto, por lo que tuve que editar el file, git add el file y confirmar el resultado:

 Renaming foo.c->quux.c Auto-merging quux.c CONFLICT (content): merge conflict in quux.c Automatic merge failed; fix conflicts and then commit the result. $ emacs -nw quux.c $ git add quux.c $ git commit [master 8baa7cb] Merge branch 'task001' $ ls quux.c 

Manera simple de arreglar esto Primero cancela la combinación actual

 git merge --abort 

Ahora, decida qué versión del file desea usar y utilice una estrategia de fusión (con las banderas -s)

Estás en el maestro de twig. Si desea mantener el nombre que estableció en el maestro, utilice este command

 git merge -s ours task 

Si quieres usar la versión de la tarea

 git merge -s theirs task