¿Cuál es la diferencia entre Mercurial y Git?
He estado usando git desde hace algún tiempo en Windows (con msysGit) y me gusta la idea del control de fuente distribuida. Recientemente estuve mirando Mercurial (hg) y parece interesante. Sin embargo, no puedo entender las diferencias entre hg y git.
¿Alguien ha hecho una comparación lado a lado entre git y hg? Me interesa saber en qué se diferencia hg y git sin tener que entrar en una discusión de fans.
Estos artículos pueden ayudar:
- Git versus Mercurial: relájese (Git es MacGyver y Mercurial es James Bond)
- Las diferencias entre Mercurial y Git
Editar : Comparar Git y Mercurial con celebridades parece ser una tendencia. Aquí hay uno más:
- Git es Wesley Snipes, Mercurial es Denzel Washington
Trabajo en Mercurial, pero fundamentalmente creo que ambos sistemas son equivalentes. Ambos trabajan con las mismas abstracciones: una serie de instantáneas (conjuntos de cambios) que conforman la historia. Cada conjunto de cambios sabe de dónde viene (el conjunto de cambios principal) y puede tener muchos conjuntos de cambios secundarios. La reciente extensión hg-git proporciona un puente bidireccional entre Mercurial y Git y en cierto modo muestra este punto.
Git tiene un fuerte enfoque en mutar este gráfico histórico (con todas las consecuencias que eso conlleva), mientras que Mercurial no fomenta la reescritura de la historia, pero es fácil de hacer de todos modos y las consecuencias de hacerlo son exactamente las que debería esperar que sean (es decir, , si modifico un conjunto de cambios que ya tienes, tu cliente lo verá como nuevo si lo retiras de mí). Entonces Mercurial tiene una preferencia por los comandos no destructivos.
En cuanto a las ramas livianas, Mercurial ha admitido repositorios con múltiples ramas desde..., siempre creo. Los repositorios de Git con múltiples ramas son exactamente eso: múltiples líneas de desarrollo divergentes en un solo repositorio. Luego, Git agrega nombres a estos hilos y le permite consultar estos nombres de forma remota. La extensión Marcadores para Mercurial agrega nombres locales y, con Mercurial 1.6, puede mover estos marcadores cuando empuja o tira.
Utilizo Linux, pero aparentemente TortoiseHg es más rápido y mejor que el equivalente de Git en Windows (debido al mejor uso del deficiente sistema de archivos de Windows). Tanto http://github.com como http://bitbucket.org brindan alojamiento en línea, el servicio en Bitbucket es excelente y receptivo (no he probado github).
Elegí Mercurial porque se siente limpio y elegante; me desanimaron los scripts de Shell/Perl/Ruby que obtuve con Git. Intente echar un vistazo al git-instaweb.sh
archivo si quiere saber a qué me refiero: es un script de shell que genera un script Ruby , que creo que ejecuta un servidor web. El script de shell genera otro script de shell para iniciar el primer script de Ruby. También hay un poco de Perl , por si acaso.
Me gusta la publicación del blog que compara Mercurial y Git con James Bond y MacGyver: Mercurial es de alguna manera más discreto que Git. Me parece que la gente que usa Mercurial no se impresiona tan fácilmente. Esto se refleja en cómo cada sistema hace lo que Linus describió como "¡la mejor fusión jamás vista!". . En Git puedes fusionarte con un repositorio no relacionado haciendo:
git fetch <project-to-union-merge>
GIT_INDEX_FILE=.git/tmp-index git-read-tree FETCH_HEAD
GIT_INDEX_FILE=.git/tmp-index git-checkout-cache -a -u
git-update-cache --add -- (GIT_INDEX_FILE=.git/tmp-index git-ls-files)
cp .git/FETCH_HEAD .git/MERGE_HEAD
git commit
Esas órdenes me parecen bastante arcanas. En Mercurial hacemos:
hg pull --force <project-to-union-merge>
hg merge
hg commit
Observe cómo los comandos de Mercurial son sencillos y nada especiales: lo único inusual es el --force
indicador to hg pull
, que es necesario ya que, de lo contrario, Mercurial abortará cuando extraiga de un repositorio no relacionado. Son diferencias como ésta las que hacen que Mercurial me parezca más elegante.
Git es una plataforma, Mercurial es “solo” una aplicación. Git es una plataforma de sistema de archivos versionada que viene con una aplicación DVCS en la caja, pero como es normal en las aplicaciones de plataforma, es más compleja y tiene aristas más ásperas que las aplicaciones enfocadas. Pero esto también significa que el VCS de git es inmensamente flexible, y hay una gran cantidad de cosas sin control de fuente que puedes hacer con git.
Ésa es la esencia de la diferencia.
Git se entiende mejor desde cero, desde el formato del repositorio. Git Talk de Scott Chacon es un excelente manual para esto. Si intentas usar git sin saber lo que sucede bajo el capó, terminarás confundido en algún momento (a menos que te ciñas sólo a una funcionalidad muy básica). Esto puede parecer estúpido cuando todo lo que quieres es un DVCS para tu rutina de programación diaria, pero la genialidad de git es que el formato del repositorio es realmente muy simple y puedes entender toda la operación de git con bastante facilidad.
Para algunas comparaciones más orientadas a los tecnicismos, los mejores artículos que he visto personalmente son los de Dustin Sallings:
- Las diferencias entre Mercurial y Git
- Hilo de Reddit donde Dustin, con experiencia en git, responde sus propias preguntas de neófito de git
De hecho, ha utilizado ampliamente ambos DVCS y los comprende bien, y terminó prefiriendo git.
La gran diferencia está en Windows. Mercurial es compatible de forma nativa, Git no. Puede obtener un alojamiento muy similar a github.com con bitbucket.org (en realidad, incluso mejor, ya que obtiene un repositorio privado gratuito). Estuve usando msysGit por un tiempo, pero me pasé a Mercurial y estoy muy contento con él.
Si es un desarrollador de Windows y busca un control de revisión desconectado básico, elija Hg. Encontré que Git era incomprensible, mientras que Hg era simple y estaba bien integrado con el shell de Windows. Descargué Hg y seguí este tutorial (hginit.com) ; diez minutos después tenía un repositorio local y volví a trabajar en mi proyecto.