git - conflicto de fusión cuando se elimina local pero el archivo existe en remoto

116

Soy muy nuevo en git y me pregunté cómo debería realizar una fusión donde en el repositorio local he eliminado varios archivos en la rama maestra, pero estos archivos existen dentro de la rama maestra remota.

Después de hacer git-merge, muestra los conflictos que han ocurrido.

Al usar git gui, muestra que el archivo local se elimina, mientras que el archivo de rama remota tiene contenido.

¿Cómo evita que estos archivos entren en conflicto? ¿Existe una forma sencilla de usar git gui?

Muchas gracias

creaciones binarias
fuente
En el pasado, una cosa que hice fue dejar los archivos "eliminados" en el control de código fuente, pero excluirlos del proyecto / makefile / lo que sea. Es una buena solución temporal para los conflictos de fusión, al menos.
Mark Rushakoff
2
Lo arregla de la misma manera que arregla cualquier conflicto de fusión: agregue la versión deseada (ya sea el archivo o la falta de archivo) al índice y luego confirme. ¿Cuál quieres?
Cascabel
@MarkRushakoff Reformularía su consejo como "cuando me encuentro con la situación en la que necesito resolver el conflicto, simplemente no los resuelvo de verdad, solo los enmascaro para que muerdan a alguien (probablemente no a mí) en el futuro". Este es realmente un buen consejo para alguien que quisiera traer más problemas al proyecto.
Victor Yarema

Respuestas:

155

Debe resolver los conflictos como mejor le parezca. Si realmente se supone que el archivo debe eliminarse y va a publicar ese cambio en el origen, elimínelo nuevamente:

git rm path/to/file

Si el archivo debe ser rastreado aún, agréguelo (la versión en el árbol de trabajo será la versión de origen):

git add path/to/file

Después de hacer cualquiera de los dos para resolver el conflicto, realice la fusión.

Cascabel
fuente
Tenía varios archivos, todos en el mismo directorio y todos con el mismo sufijo. ¿Hay un atajo para eliminarlos todos a la vez mientras se conserva el resto de los archivos en el directorio?
chiborg
@chiborg: Esa es solo una pregunta de caparazón. cdal directorio y git rm *.ext. Su shell (no Git) se expande *.exta todos los nombres de archivo coincidentes.
Cascabel
¿Y si quiero conservar algunos de los archivos? git rmno tiene -ibandera.
chiborg
@chiborg: Dijiste que querías eliminar todo con un sufijo dado y dejar todo lo demás intacto. Eso es exactamente lo que te dije cómo hacer. ¿O te refieres git rm *-suffix.ext? La misma diferencia. Si tiene problemas para averiguar cómo utilizar los comodines de shell, pregunte en unix.stackexchange.com. Si sabe con certeza que lo que desea no se puede hacer con globbing, use rm -iy siga con git add -upara recoger las eliminaciones.
Cascabel
2
@Jefromi, si estoy especificando -s recursive -X ours, ¿por qué todavía es necesario git rmy git add?
Noel Yap
27

Como un consejo adicional además de la respuesta aceptada, en un "eliminado por nosotros" , si desea ver los cambios que se realizaron en el archivo eliminado para que pueda aplicar esos cambios en otro lugar, puede utilizar:

git diff ...origin/master -- path/to/file

Si se trata de un escenario "eliminado por ellos" y le gustaría ver los cambios para poder aplicarlos en otro lugar, puede utilizar:

git diff origin/master... -- path/to/file
Joseph Ravenwolfe
fuente
6
¡si! Esto es crucial si no desea borrar los cambios que está fusionando, como cuando se cambió el nombre de un archivo o su contenido se movió antes de que se eliminara el archivo.
Edward Anderson
8
Como recordatorio: esto no funciona cuando el conflicto ocurre durante el rebase . Necesito ser explícito comogit diff mybranch@{1}...origin/master -- path/to/file
nschum
@nschum ¡Gracias! Esto es precisamente lo que estaba buscando.
Chuim
2
También puede usar git diff --base(vea mi otra respuesta).
Dorian Marchal
Hola Joseph, todavía estoy atascado aunque esta respuesta parece prometedora. Si tiene un momento, me encantaría que respondiera aquí: stackoverflow.com/q/63044843/470749 ¡Gracias!
Ryan
9

En Git GUI, selecciona el archivo en conflicto y luego hace clic con el botón derecho en el área de texto principal donde se muestra el texto en conflicto.

En el menú contextual que aparece, puede elegir ir con "Remoto" o ir con "Local". Entonces, si un archivo se elimina de forma remota, puede elegir "Remoto" para propagar la eliminación localmente y viceversa.

Me tomó un mes resolverlo ... sería bueno si Git GUI realmente tuviera documentación ...

Joel Freeman
fuente
4

La respuesta mejor valorada se centra en la forma de resolver el conflicto.

Antes de eso, probablemente desee saber qué cambió el control remoto en los archivos eliminados localmente.

Para hacer eso, puede ver los cambios con:

git diff --base

De https://git-scm.com/docs/git-diff#Documentation/git-diff.txt--1--base

Compare el árbol de trabajo con la versión "base" [...]. El índice contiene estas etapas solo para las entradas no fusionadas, es decir, mientras se resuelven los conflictos.

Dorian Marchal
fuente
Aquí hay una buena explicación de git diff --base stackoverflow.com/a/60484874/470749
Ryan
0

En EGit también encontré problemas. Mi solucion fue:

  • Usó la vista Git Staging.
  • Haga doble clic en cada archivo que se muestra en los cambios sin etapas para abrir el comparador
  • Haga clic en el icono "Copiar todo de izquierda a derecha"
  • Guardar archivo (desaparecerá de la lista sin etapas)
borjab
fuente