¿Puedo confirmar solo partes de mi código usando SVN o Mercurial?


Uso Tortoise SVN normalmente, pero he estado buscando en Mercurial ya que es un sistema de control de revisiones distribuido.

Lo que estoy buscando, en ambos sistemas, es una herramienta que me permita elegir solo partes de un archivo y confirmarlas. Si quiero hacer esto ahora, tengo que copiar a una versión temporal del archivo y mantener solo los cambios que quiero confirmar en la versión actual, y luego copiar la versión temporal a la versión actual de nuevo después de confirmar. Es sólo una molestia y la el programa debería ser capaz de hacer esto por mí.

He oído que Git soporta esto, por favor avísame si esto es correcto.

Author: bahrep, 2008-09-29

6 answers

Mercurial puede hacer esto con la extensión record .

Te pedirá cada archivo y cada trozo de diferencia. Por ejemplo:

% hg record
diff --git a/prelim.tex b/prelim.tex
2 hunks, 4 lines changed
examine changes to 'prelim.tex'? [Ynsfdaq?]  
@@ -12,7 +12,7 @@
 \setmonofont[Scale=0.88]{Consolas}
 % missing from xunicode.sty
 \DeclareUTFcomposite[\UTFencname]{x00ED}{\'}{\i}
-\else
+\else foo
 \usepackage[pdftex]{graphicx}
 \fi

record this change to 'prelim.tex'? [Ynsfdaq?]  
@@ -1281,3 +1281,5 @@
 %% Local variables:
 %% mode: latex
 %% End:
+
+foo
\ No newline at end of file
record this change to 'prelim.tex'? [Ynsfdaq?]  n
Waiting for Emacs...

Después de la confirmación, el diff restante se dejará atrás:

% hg di
diff --git a/prelim.tex b/prelim.tex
--- a/prelim.tex
+++ b/prelim.tex
@@ -1281,3 +1281,5 @@
 %% Local variables:
 %% mode: latex
 %% End:
+
+foo
\ No newline at end of file

Alternativamente, puede encontrar más fácil usar MQ (Colas Mercuriales) para separar los cambios individuales en su repositorio en parches. También hay una variante de registro MQ (qrecord).

Actualizar: {[14] } También pruebe la extensión crecord, que proporciona una interfaz de curses para la selección de hunk / line.

relato captura de pantalla

 39
Author: Nicholas Riley,
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
2017-06-20 11:44:48

Sí, git te permite hacer esto. El comando git add tiene una opción -p (o --patch) que le permite revisar sus cambios hunk-by-hunk, seleccionar qué escenario (también puede refinar los hunks o editar los parches en su lugar). También puedes usar el modo interactivo para git-add (git add -i) y usar la opción "p".

Aquí hay un screencast en la adición interactiva que también demuestra la característica de parche de git add.

 12
Author: Pat Notz,
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
2008-09-30 04:43:01

Echa un vistazo a TortoiseHg, que hará la selección de hunk y te permitirá confirmar diferentes cambios a un archivo como a diferentes confirmaciones.

Incluso le permitirá confirmar todos los cambios en algunos archivos junto con cambios parciales en otros archivos en una confirmación.

Http://tortoisehg.bitbucket.io/

 7
Author: Hauge,
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
2017-06-20 11:42:58

Hice una pregunta similar hace poco, y la respuesta resultante de usar la extensión hgshelve fue exactamente lo que estaba buscando.

Antes de hacer una confirmación, puede poner los cambios de diferentes archivos (o montones de cambios dentro de un archivo) en el "estante" y luego confirmar las cosas que desee. Luego puedes deshacer los cambios que no confirmaste y seguir trabajando.

Lo he estado usando los últimos días y me gusta mucho. Muy fácil de visualiza y usa.

 5
Author: Ted Naleid,
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
2017-06-20 11:44:11

Mercurial ahora proporciona una opción --interactive (o -i) al comando commit, que habilita esta funcionalidad desde el primer momento.

Esto funciona directamente desde la línea de comandos, por lo que es perfecto si eres un entusiasta de la línea de comandos!

Corriendo

> hg commit -i

Comienza una sesión interactiva que permite examinar, editar y grabar cambios individuales para crear una confirmación.

Esto se comporta de manera muy similar a las opciones --patch y --interactive para git add y git commit comando.

 2
Author: Oly,
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
2017-09-07 17:34:03

Yo recomendaría no trabajar así.

Si tiene que establecer conjuntos de cambios, establecer A que está listo para registrarse y establecer B que aún no está listo, ¿cómo puede estar seguro de que solo el registro del conjunto A no romperá su compilación/pruebas? Puede perder algunas líneas, olvidarse de líneas en un archivo diferente, o no darse cuenta de una dependencia que A tiene en B rompiendo la compilación para otros.

Sus confirmaciones deben ser cambios atómicos discretos que no rompan la compilación para usted u otros en tu equipo. Si está cometiendo parcialmente un archivo, está aumentando en gran medida las posibilidades de que rompa la compilación para otros sin saberlo hasta que tenga un compañero de trabajo infeliz llamando a su puerta.

La gran pregunta es, ¿por qué sientes la necesidad de trabajar de esta manera?

 0
Author: craigb,
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
2008-09-29 15:46:10