2010-02-20 21 views
20

He revisado las diversas preguntas sobre esto. El primero proporciona a huge question and answer (¿no es relevante?) Y el segundo proporciona un wrong answer as best answer.Git merge -s theirs: ¿Simplemente?

Tengo una rama llamada great-use-this. Tengo otra rama llamada master. Deseo fusionar great-use-this en el maestro y evitar conflictos de fusión automática.

¿Cuál es la forma más simple y fácil de hacer esto?

Nota:. De hecho, me he dado cuenta de esto (el uso de una tercera rama y ours, pero esto sería bueno tener el SO de todos modos

+0

Véase también http://stackoverflow.com/questions/4911794/git-command-for-making-one-branch-like-another/4912267#4912267 – VonC

+0

Would Sé agradable mostrar un ejemplo del enfoque de la tercera rama + 'nuestro', especialmente el gráfico de confirmación resultante, cuánto ruido, etc. – lkraav

+0

@lkraav Ya no tengo ese ejemplo. Hago todo, ya sea con 'git merge BRANCH --squash' o, a veces, con' git reset --soft master' y luego con el check in como si fuera una nueva confirmación. Lo siento, pero si pides un ejemplo simple en otra pregunta, sería encantador. –

Respuesta

25

Sí, la creación de una tercera rama y haciendo un merge -s ours es una solución.

pero se puede encontrar toda la "let's not advertised any "theirs" merging strategy" here.

Entre la sustitución de su trabajo con otro trabajo rama, o simplemente conseguir librado del trabajo actual y reemplazarlo por completo por el otro, Junio ​​Hamano C (principal Git Maintainer) prefiere el segundo enfoque:

creo "-s theirs" es aún peor. Es cómo se deseche lo que hizo (tal vez debido a que el otro lado tiene solución mucho mejor que su corte), pero que puede ser mucho más fácil y limpia hecho con:

$ git reset --hard origin/master 

Algunas personas podrían decir "Pero con 'merge -s theirs', puedo guardar lo que hice, también ". Ese reinicio es simplemente descartar lo que hice.

Esa lógica también tiene defectos. Puede en su lugar:

$ git branch i-was-stupid 
$ git reset --hard origin/master 

si realmente desea mantener un registro de su falla.

Un problema grande "-s theirs" tiene, en comparación con lo anterior "restablecer al origen, descartar o dejar de lado el historial fallido" es que su historial 'maestro' en el que está basado su desarrollo adicional mantendrá sus fallas fallidas para siempre si lo hiciste "-s theirs".

Con suerte, con el tiempo se convertirá en un mejor programador, y es posible que finalmente tenga algo que valga la pena compartir con el mundo cercano a la punta de su rama principal. Sin embargo, cuando eso ocurra, no puede ofrecer su rama principal para ser arrastrada por la corriente ascendente, ya que el mundo en general no estará interesado en sus errores anteriores en absoluto.

+1

El problema con la lógica es que esto me sucede cuando me estoy fusionando en la rama principal. El hecho de que git no pueda entender la fusión automática no significa que no sea totalmente obvio. Pero quiero que la historia avance. En cualquier caso, la mayoría de estas historias se volverán a basar en la basura. –

+0

la sintaxis que funcionó para mí fue 'git reset --hard origin/master' –

2

Me estoy inclinando hacia la opción git reset --hard BRANCHNAME mí mismo, pero he descubierto que hay un "su" en Git (v. 1.7.1 por lo menos).

Si quiere probarlo, simplemente agregue un argumento "-Xtheirs" al comando merge.

Por ejemplo, a partir de maestro:

git checkout -b editBranch
-- edit your files --
git add .
git commit -m "Updated the files"
git checkout master
git merge -Xtheirs editBranch

Si ha borrado todos los archivos en el editBranch, obtendrá un conflit de combinación que se puede resolver con git rm FILENAME.

Una vez más, parece probable que el restablecimiento --hard BRANCHNAME sea una mejor opción, pero si tiene un caso en el que realmente necesita uno de ellos, esto debería llevarlo allí.

+4

Vale la pena enfatizar que' -Xtheirs' es completamente diferente de una estrategia hipotética '-s theirs'. '-Xtheirs' pasa la opción' theirs' a la estrategia de fusión recursiva que resuelve trozos en conflicto al elegir la versión 'theirs'. '-s theirs', si se implementa como' -s ours' elegiría la totalidad de 'su' árbol en lugar de cualquier tipo de fusión inteligente. –

+1

Creo que entiendo eso. ¿Eso significa que un "-s theirs" es realmente lo mismo que si lo hiciera "git reset --hard BRANCHNAME"? –

+0

@ Charles Bailey, quiero comentar sobre esto, por favor? –

8

encontré con este problema, el otro día:

httpx: //seanius.net/blog/2011/02/git-merge-s-theirs/

actualización: url Viejo esta abajo. Aquí está el artículo a través de Archive.org Wayback Machine:

git merge -s ours ref-to-be-merged 
git diff --binary ref-to-be-merged | git apply -R --index 
git commit -F .git/COMMIT_EDITMSG --amend 
+0

Gracias @Sean Finney, artículo interesante. Personalmente, he estado haciendo un montón de 'reset --hard' y' reset --soft' con refs, así que llegar a donde quiero ir, que es brutal y arruina el historial de commits (por lo que terminas usando 'push --force' mucho :)), pero tu solución parece sólida. Tendré que verificarlo pronto. –