¿Cómo hacer que git merge maneje cambios no comprometidos en mi árbol de trabajo?


Un compañero de trabajo y yo estamos trabajando en la rama master en este momento. Tengo un código en mi árbol de trabajo que no quiero confirmar (declaraciones de depuración y similares). Ahora bien, si confirma cambios en algunos de esos mismos archivos, no puedo combinarlos:

$ git merge origin/master
Updating 1b8c5c6..eb44c23
error: Entry 'blah.java' not uptodate. Cannot merge.

Viniendo de un fondo de subversion, estoy acostumbrado a que mi árbol de trabajo se fusione automáticamente cuando extraigo cambios del repositorio y si hay conflictos, los resuelvo manualmente.

La forma más rápida que tengo se encuentra que hacer esto en git es:

$ git stash
$ git merge origin/master
$ git stash pop

Esencialmente, eliminar mis cambios no comprometidos, hacer la fusión y luego volver a aplicar los cambios. ¿Cómo puedo decirle a merge que combine automáticamente mi árbol de trabajo con los cambios que estoy intentando introducir?

Author: Jeremy Huiskamp, 2009-05-02

3 answers

Por lo que puedo decir, lo mejor que puedes hacer es lo que ya tienes con git stash. Yo también encuentro extraño que Merge quiera tratar solo con árboles limpios.

 19
Author: Norman Ramsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-02 00:35:41

Olvida todo lo que aprendiste de subversion.

Siempre confirmar antes de introducir cambios externos.

Imagina que tienes un árbol en su mayoría funcional maybe tal vez no perfecto, pero estás haciendo algunos progresos. Luego vas a hacer una fusión y el código que estás trayendo solo causó estragos (estaba con errores, demasiados conflictos para lidiar, etc.)...). ¿No sería bueno si pudieras deshacer eso?

Si confirmas, puedes hacerlo. Si no lo haces, sólo vas a sufrir.

Recuerda: Lo que confirmas no tiene que ser lo que envías, pero lo que no confirmas puedes perderlo fácilmente.

Solo haz lo seguro y fácil y comprométete temprano y comprométete a menudo.

 37
Author: Dustin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-02 01:45:08

No puede decirle a git merge que combine cambios en archivos que tienen cambios con respecto a su repositorio local. Esto le protege de perder sus cambios en los momentos en que una fusión sale mal.

Con el enfoque CVS y SVN para fusionar, si no copió manualmente sus archivos antes de la actualización y los codificó en la fusión, tiene que volver a editarlos manualmente para volver a un buen estado.

Si confirma sus cambios o los almacena antes de hacer una fusión, todo es reversible. Si la fusión no va bien, puede probar varias formas de hacer que funcione e ir con la que funcione mejor.

Si confirmas cambios experimentales o de depuración, puedes usar git rebase para moverlos después de los commits que recibes a través de git merge para que sea más fácil deshacerse de ellos o para evitar enviarlos a un repositorio accidentalmente.

Tenga en cuenta que usar git rebase en una rama que ha enviado a un repositorio compartido causará dolor a todos los que están tirando de eso repositorio.

Prefiero usar git stash en estos casos, pero solo lo uso si la combinación cambia los archivos que he editado y no confirmado.

 2
Author: Jamey Hicks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-22 14:05:03