hgbook

view es/tour-merge.tex @ 435:263a8436d72d

translated more text. Surprise!
author jerojasro@localhost
date Mon Dec 01 21:53:26 2008 -0500 (2008-12-01)
parents 53b4a0d0052e
children 9da096de3c52
line source
1 \chapter{Una gira de Mercurial: fusionar trabajo}
2 \label{chap:tour-merge}
4 Hasta ahora hemos cubierto cómo clonar un repositorio, hacer cambios,
5 y jalar o empujar dichos cambios de un repositorio a otro. Nuestro
6 siguiente paso es \emph{fusionar} cambios de repositorios separados.
8 % TODO cambié streams por líneas. check please
9 \section{Fusionar líneas de trabajo}
11 Fusionar es una parte fundamental de trabajar con una herramienta
12 de control distribuido de versiones.
13 \begin{itemize}
14 \item Alicia y Roberto tienen cada uno una copia personal del
15 repositorio de un proyecto en el que están trabajando. Alicia
16 arregla un fallo en su repositorio; Roberto añade una nueva
17 característica en el suyo. Ambos desean que el repositorio
18 compartido contenga el arreglo del fallo y la nueva
19 característica.
20 \item Frecuentemente trabajo en varias tareas diferentes en un mismo
21 proyecto al mismo tiempo, cada una aislada convenientemente de las
22 otras en su propio repositorio. Trabajar de esta manera significa
23 que a menudo debo fusionar una parte de mi propio trabajo con
24 otra.
25 \end{itemize}
27 Como fusionar es una operación tan necesaria y común, Mercurial la
28 facilita. Revisemos el proceso. Empezaremos clonando (otro)
29 % TODO poner interrogante de apertura
30 repositorio (ve lo seguido que aparecen?) y haciendo un cambio en él.
31 \interaction{tour.merge.clone}
32 Ahora deberíamos tener dos copias de \filename{hello.c} con contenidos
33 diferentes. El historial de los dos repositorios diverge ahora, como
34 se ilustra en la figura~\ref{fig:tour-merge:sep-repos}.
35 \interaction{tour.merge.cat}
37 \begin{figure}[ht]
38 \centering
39 \grafix{tour-merge-sep-repos}
40 \caption{Historial reciente divergente de los repositorios
41 \dirname{my-hello} y \dirname{my-new-hello}}
42 \label{fig:tour-merge:sep-repos}
43 \end{figure}
45 Ya sabemos que jalar los cambios desde nuestro repositorio
46 \dirname{my-hello} no tendrá efecto en el directorio de trabajo.
47 \interaction{tour.merge.pull}
48 Sin embargo, el comando \hgcmd{pull} dice algo acerca de
49 ``frentes''\ndt{El autor se refiere a \emph{heads} aquí.}.
51 \subsection{Conjuntos de cambios de frentes}
53 Un frente es un cambio que no tiene descendientes, o hijos, como
54 también se les conoce. La revisión de punta es, por tanto, un frente,
55 porque la revisión más reciente en un repositorio no tiene ningún
56 % TODO cambio en la redacción de la frase, pero espero que conserve el
57 % sentido. Querido human@, apruebe o corrija :D
58 hijo. Sin embargo, un repositorio puede contener más de un frente.
60 \begin{figure}[ht]
61 \centering
62 \grafix{tour-merge-pull}
63 \caption{Contenidos del repositorio después de jalar
64 \dirname{my-hello} a \dirname{my-new-hello}}
65 \label{fig:tour-merge:pull}
66 \end{figure}
68 En la figura~\ref{fig:tour-merge:pull} usted puede ver el efecto que
69 tiene jalar los cambios de \dirname{my-hello} a \dirname{my-new-hello}.
70 El historial que ya existía en \dirname{my-new-hello} se mantiene
71 intacto, pero fue añadida una nueva revisión. Refiriéndonos a la
72 figura~\ref{fig:tour-merge:sep-repos}, podemos ver que el \emph{ID del
73 conjunto de cambios} se mantiene igual en el nuevo repositorio, pero
74 el \emph{número de revisión} ha cambiado. (Incidentalmente, éste es un
75 buen ejemplo de porqué no es seguro usar números de revisión cuando se
76 habla de conjuntos de cambios). Podemos ver los frentes en un
77 repositorio usando el comando \hgcmd{heads}\ndt{Frentes.}.
78 \interaction{tour.merge.heads}
80 \subsection{Hacer la fusión}
82 % TODO poner interrogante de apertura
83 Qué pasa si tratamos de usar el comando usual, \hgcmd{update}, para
84 actualizar el nuevo frente?
85 \interaction{tour.merge.update}
86 Mercurial nos indica que el comando \hgcmd{update} no hará la fusión;
87 no actualizará el directorio de trabajo cuando considera que lo que
88 deseamos hacer es una fusión, a menos que lo obliguemos a hacerlo.
89 En vez de \hgcmd{update}, usamos el comando \hgcmd{merge} para hacer
90 la fusión entre los dos frentes.
91 \interaction{tour.merge.merge}
93 \begin{figure}[ht]
94 \centering
95 \grafix{tour-merge-merge}
96 \caption{Directorio de trabajo y repositorio durante la fusión, y
97 consignación consecuente}
98 \label{fig:tour-merge:merge}
99 \end{figure}
101 Esto actualiza el directorio de trabajo, de tal forma que contenga los
102 cambios de \emph{ambos} frentes, lo que se ve reflejado tanto en la
103 salida de \hgcmd{parents} como en los contenidos de \filename{hello.c}.
104 \interaction{tour.merge.parents}
106 \subsection{Consignar los resultados de la fusión}
108 Siempre que hacemos una fusión, \hgcmd{parents} mostrará dos padres
109 hasta que consignemos (\hgcmd{commit}) los resultados de la fusión.
110 \interaction{tour.merge.commit}
111 Ahora tenemos una nueva revisión de punta; note que tiene \emph{los
112 dos} frentes anteriores como sus padres. Estos son las mismas
113 revisiones que mostró previamente el comando \hgcmd{parents}.
114 \interaction{tour.merge.tip}
115 En la figura~\ref{fig:tour-merge:merge} usted puede apreciar una
116 representación de lo que pasa en el directorio de trabajo durante la
117 fusión cuando se hace la consignación. Durante la fusión, el
118 directorio de trabajo tiene dos conjuntos de cambios como sus padres,
119 y éstos se vuelven los padres del nuevo conjunto de cambios.
121 \section{Fusionar cambios con conflictos}
123 La mayoría de las fusiones son algo simple, pero a veces usted se
124 encontrará fusionando cambios donde más de uno de ellos afecta las
125 mismas secciones de los mismos ficheros. A menos que ambas
126 modificaciones sean idénticas, el resultado es un \emph{conflicto}, en
127 donde usted debe decidir cómo reconciliar ambos cambios y producir un
128 resultado coherente.
130 \begin{figure}[ht]
131 \centering
132 \grafix{tour-merge-conflict}
133 \caption{Cambios con conflictos a un documento}
134 \label{fig:tour-merge:conflict}
135 \end{figure}
137 La figura~\ref{fig:tour-merge:conflict} ilustra un ejemplo con dos
138 cambios generando conflictos en un documento. Empezamos con una sola
139 versión de el fichero; luego hicimos algunos cambios; mientras tanto,
140 alguien más hizo cambios diferentes en el mismo texto. Lo que debemos
141 hacer para resolver el conflicto causado por ambos cambios es decidir
142 cómo debe quedar finalmente el fichero.
144 Mercurial no tiene ninguna utilidad integrada para manejar conflictos.
145 En vez de eso, ejecuta un programa externo llamado \command{hgmerge}.
146 Es un guión de línea de comandos que es instalado junto con Mercurial;
147 usted puede modificarlo para que se comporte como usted lo desee. Por
148 defecto, lo que hace es tratar de encontrar una de varias herramientas
149 para fusionar que es probable que estén instaladas en su sistema.
150 Primero se intenta con unas herramientas para fusionar cambios
151 automáticamente; si esto no tiene éxito (porque la fusión demanda
152 una guía humana) o dichas herramientas no están presentes, el guión
153 intenta con herramientas gráficas para fusionar.
155 También es posible hacer que Mercurial ejecute otro programa o guión
156 en vez de \command{hgmerge}, definiendo la variable de entorno
157 \envar{HGMERGE} con el nombre del programa de su preferencia.
159 \subsection{Usar una herramienta gráfica para fusión}
161 Mi herramienta favorita para hacer fusiones es \command{kdiff3}, y la
162 usaré para describir las características comunes de las herramientas
163 gráficas para hacer fusiones. Puede ver una captura de pantalla de
164 \command{kdiff3} ejecutándose, en la
165 figura~\ref{fig:tour-merge:kdiff3}. El tipo de fusión que la
166 herramienta hace se conoce como \emph{fusión de tres vías}, porque hay
167 tres versiones diferentes del archivo en que estamos interesados.
168 Debido a esto la herramienta divide la parte superior de la ventana en
169 tres paneles.
170 \begin{itemize}
171 \item A la izquierda está la revisión \emph{base} del fichero, p.ej.~la
172 versión más reciente de la que descienden las dos versiones que
173 estamos tratando de fusionar.
174 \item En la mitad está ``nuestra'' versión del fichero, con las
175 modificaciones que hemos hecho.
176 \item A la derecha está la versión del fichero de ``ellos'', la que
177 forma parte del conjunto de cambios que estamos tratando de
178 fusionar.
179 \end{itemize}
180 En el panel inferior se encuentra el \emph{resultado} actual de la
181 fusión. Nuestra tarea es reemplazar todo el texto rojo, que muestra
182 los conflictos sin resolver, con una fusión adecuada de ``nuestra''
183 versión del fichero y la de ``ellos''.
185 Los cuatro paneles están \emph{enlazados}; si avanzamos vertical o
186 horizontalmente en cualquiera de ellos, los otros son actualizados
187 para mostrar las secciones correspondientes del fichero que tengan
188 asociado.
190 \begin{figure}[ht]
191 \centering
192 \grafix[width=\textwidth]{kdiff3}
193 \caption{Usando \command{kdiff3} para fusionar versiones de un
194 fichero}
195 \label{fig:tour-merge:kdiff3}
196 \end{figure}
198 En cada conflicto del fichero podemos escoger resolverlo usando
199 cualquier combinación del texto de la revisión base, la nuestra, o la
200 de ellos. También podemos editar manualmente el fichero en que queda
201 la fusión, si es necesario hacer cambios adicionales.
203 Hay \emph{muchas} herramientas para fusionar ficheros disponibles. Se
204 diferencian en las plataformas para las que están disponibles, y en
205 sus fortalezas y debilidades particulares. La mayoría están afinadas
206 para fusionar texto plano, mientras que otras están pensadas para
207 formatos de archivos especializados (generalmente XML).
209 % TODO traduje "worked" como "real"
210 \subsection{Un ejemplo real}
212 En este ejemplo, reproduciremos el historial de modificaciones al
213 fichero de la figura~\ref{fig:tour-merge:conflict} mostrada
214 anteriormente. Empecemos creando un repositorio con la versión base
215 de nuestro documento.
216 \interaction{tour-merge-conflict.wife}
217 Clonaremos el repositorio y haremos un cambio al fichero.
218 \interaction{tour-merge-conflict.cousin}
219 Y haremos otro clon, para simular a alguien más haciendo un cambio al
220 mismo fichero. (Esto introduce la idea de que no es tan inusual hacer
221 fusiones consigo mismo, cuando usted aísla tareas en repositorios
222 separados, y de hecho encuentra conflictos al hacerlo.)
223 \interaction{tour-merge-conflict.son}
224 Ahora que tenemos dos versiones diferentes de nuestro fichero,
225 crearemos un entorno adecuado para hacer la fusión.
226 \interaction{tour-merge-conflict.pull}
228 En este ejemplo, no usaré el comando normal de Mercurial para hacer la
229 fusión (\command{hgmerge}), porque lanzaría mi linda herramienta
230 automatizada para correr ejemplos dentro de una interfaz gráfica de
231 usuario. En vez de eso, definiré la variable de entorno
232 \envar{HGMERGE} para indicarle a Mercurial que use el comando
233 \command{merge}. Este comando forma parte de la instalación base de
234 muchos sistemas Unix y similares. Si usted está ejecutando este
235 ejemplo en su computador, no se moleste en definir \envar{HGMERGE}.
236 \interaction{tour-merge-conflict.merge}
237 Debido a que \command{merge} no puede resolver los conflictos que
238 aparecen, él deja \emph{marcadores de fusión} en el fichero con
239 conflictos, indicando si provienen de nuestra versión o de la de
240 ellos.
242 Mercurial puede saber ---por el código de salida del comando
243 \command{merge}--- que no fue posible hacer la fusión exitosamente,
244 así que nos indica qué comandos debemos ejecutar si queremos rehacer
245 la fusión. Esto puede ser útil si, por ejemplo, estamos ejecutando una
246 herramienta gráfica de fusión y salimos de ella porque nos confundimos
247 o cometimos un error.
249 Si la fusión ---automática o manual--- falla, no hay nada que nos
250 impida ``arreglar'' los ficheros afectados por nosotros mismos, y
251 consignar los resultados de nuestra fusión:
252 % TODO este mercurial no tiene el comando resolve. Revisar si sigue
253 % siendo necesario
254 \interaction{tour-merge-conflict.commit}
256 \section{Simplificar el ciclo jalar-fusionar-consignar}
257 \label{sec:tour-merge:fetch}
259 El proceso de fusionar cambios delineado anteriomente es directo, pero
260 requiere la ejecución de tres comandos en sucesión.
261 \begin{codesample2}
262 hg pull
263 hg merge
264 hg commit -m 'Fusionados cambios remotos'
265 \end{codesample2}
266 En la consignación final usted debe proveer un mensaje adecuado, que
267 casi siempre es un fragmento de texto ``de relleno'' carente de valor
268 particular.
270 Sería agradable reducir la cantidad de pasos necesarios, si fuera
271 posible. De hecho, Mercurial es distribuido junto con una extensión
272 llamada \hgext{fetch}\ndt{Descargar, traer.} que hace precisamente
273 esto.
275 Mercurial cuenta con un mecanismo de extensión flexible que le permite
276 % TODO lets people => permite a usuarios
277 a sus usuarios extender su funcionalidad, manteniendo el núcleo de
278 Mercurial pequeño y fácil de manejar. Algunas extensiones añaden
279 nuevos comandos que usted puede usar desde la línea de comandos,
280 mientras que otros funcionan ``tras bambalinas'', por ejemplo,
281 añadiendo funcionalidad al servidor.
283 La extensión \hgext{fetch} añade un comando llamado, no
284 sorpresivamente, \hgcmd{fetch}. Esta extensión actúa como una
285 combinación de \hgcmd{pull}, \hgcmd{update} y \hgcmd{merge}. Empieza
286 jalando cambios de otro repositorio al repositorio actual. Si
287 encuentra que los cambios añaden un nuevo frente en el repositorio
288 actual, inicia una fusión, y luego consigna el resultado de la misma
289 con un mensaje generado automáticamente. Si no se añadieron nuevos
290 frentes, actualiza el directorio de trabajo con el nuevo conjunto de
291 cambios de punta.
293 Activar la extensión \hgext{fetch} es fácil. Edite su
294 \sfilename{.hgrc}, y vaya a (o cree) la sección
295 \rcsection{extensions}. Luego añada una línea que diga simplemente
296 ``\Verb+fetch +''.
297 \begin{codesample2}
298 [extensions]
299 fetch =
300 \end{codesample2}
301 (Normalmente, a la derecha del ``\texttt{=}'' debería aparecer la
302 ubicación de la extensión, pero como el comando \hgext{fetch} es parte
303 de la distribución estándar, Mercurial sabe dónde buscarla.)
305 %%% Local Variables:
306 %%% mode: latex
307 %%% TeX-master: "00book"
308 %%% End: