Mi equipo y yo usamos ramas de características (con git). Me pregunto cuál es la mejor estrategia para la revisión de código antes de fusionar para dominar.
- Comprobé una nueva rama de master, llamémosla fb_ # 1
- Me comprometo un par de veces y quiero volver a fusionarlo con Master
- Antes de fusionarme, se supone que alguien debe hacer una revisión del código
Ahora hay 2 posibilidades:
Primero
- Combino maestro para FB_ # 1 ( no FB_ # 1 al maestro) para que sea lo más al día posible
- Un compañero de equipo revisa los cambios entre la cabeza maestra y la cabeza fb_ # 1
- Si fb_ # 1 está bien, fusionamos fb_ # 1 para dominar
- Pros: no hay código obsoleto en revisión
- Contras: si alguien más combina algo entre "1". y 2." sus cambios aparecen en la revisión, aunque pertenecen a otra revisión.
2do
- Un compañero de equipo revisa los cambios entre el punto de pago (git merge-base master fb_ # 1) y fb_ # 1 head
- Pros: vemos exactamente lo que cambió durante el trabajo en la rama de características
- Contras: algún código obsoleto puede aparecer en la revisión.
¿De qué manera crees que es mejor y por qué ? Tal vez hay otro enfoque más adecuado?
fuente
git show HEAD
. Como ese será el comando de fusión fm , enumerará a ambos padres. Entonces, tienes el hash de mm . Alternativamente, puede ver trivialmente al padre engitk
cualquier otro navegador git3ro
Usted rebase la rama sobre la que amo tanto lo componen al día y mantener los cambios separan.
Esto crea una nueva historia de la rama. Serán nuevas revisiones con nuevas ID que tendrán el mismo contenido, pero se derivarán del último maestro y no se vincularán a las revisiones anteriores. Las revisiones anteriores todavía están disponibles en "reflog" si necesita consultarlas, por ejemplo, porque encuentra que cometió un error en la resolución de conflictos. Además de eso no valen nada. Git elimina por defecto el reflog después de 3 meses y descarta las revisiones anteriores.
Utiliza rebase interactivo (
git rebase -i
ygit commit --amend
) para reordenar, editar y limpiar los cambios para que cada uno realice un cambio lógicamente cerrado.Esto nuevamente crea un nuevo historial, esta vez con el beneficio adicional de que puede reestructurar los cambios para que tengan más sentido durante la revisión.
Pros:
Por lo general, el trabajo adicional significa que primero debe revisar el código usted mismo y eso también detectará muchos problemas.
Esto es lo que hacen Linux y Git. Y no es inusual ver series de 20 a 25 parches enviados para su revisión y reescritos varias veces en esos proyectos.
En realidad, Linux lo hizo desde el principio del proyecto cuando su control de versión elegido era tarballs y parches. Cuando muchos años después, Linus se propuso crear git, fue la razón principal para implementar el
rebase
comando y su variante interactiva. También debido a esto, git tiene una noción separada de autor y confirmador . El autor es quien creó la revisión por primera vez y el confirmador es quien la tocó por última vez. Dado que tanto en Linux como en Git, los parches todavía se envían por correo electrónico, los dos casi nunca son la misma persona.fuente
merge --no-ff
que muestre claramente esa rama en master en lugar de que la función desaparezca en el resto de los commits--no-ff
tiene sus altibajos . Personalmente me parece más ruido que cualquier otra cosa. YMMV.En realidad, existe una tercera posibilidad, y muy probablemente muchas otras, ya que GIT es más una implementación de un marco SCM que una implementación de una metodología SCM. Esta tercera posibilidad se basa en
rebase
.El
rebase
subcomando GIT toma una serie de commit (generalmente desde su punto de ramificación hasta la punta de su rama temáticatopic
) y los reproduce en otro lugar (típicamente en la punta de su rama de integración, por ejemplomaster
). Elrebase
subcomando produce nuevas confirmaciones, lo que brinda la oportunidad de reorganizar las confirmaciones de una forma que es más fácil de revisar. Esto produce una nueva serie de commit, similar a lo quetopic
solía ser pero que aparece arraigado en la parte superior de la rama de integración.topic
GIT todavía llama a esta nueva rama , por lo que se descarta la referencia anterior. Etiqueto informalmentetopic-0
el estado original de su sucursaltopic-1
y así sucesivamente sus diversas refactorizaciones.Aquí está mi sugerencia para su
topic
sucursal:(Paso opcional) Reorganiza interactivamente la rama de su tema
topic
en su punto de ramificación (vea la--fixup
opción paracommit
y las opciones-i
y--autosquash
enrebase
), lo que le brinda la oportunidad de reescribir sus confirmaciones de una manera que sea más fácil de revisar. Esto da como resultado una ramatopic-1
.Reorganiza su rama de tema en la parte superior de su rama de integración, es similar a hacer una fusión, pero "no contamina" el historial con una fusión que no es más que un artefacto de ingeniería de software. Esto da como resultado una rama
topic-2
.Enviar
topic-2
a un compañero de equipo que lo revisa en contra de la punta demaster
.Si
topic-2
está bien, combínalo con master.NOTA: Las ramas, donde rama se refiere al árbol de confirmación, serán todas llamadas por GIT, por lo tanto, al final del proceso, solo la rama
topic-2
tiene un nombre en GIT.Pros:
Contras:
topic-0
, hay tres artefactos ramastopic-0
,topic-1
ytopic-2
que se crean en el árbol de confirmación. (Aunque en cualquier momento, solo uno de ellos tiene un nombre en GIT).En su primer escenario «si alguien fusionó algo entre" 1 ". y "2." »se refiere al tiempo que transcurre entre la creación del punto de ramificación y el momento en que decide fusionarse. En este escenario «si alguien fusionó algo entre" 1 ". y "2." »se refiere al tiempo que transcurre entre el rebase y la fusión, que generalmente es muy corto. Por lo tanto, en el escenario que proporciono, puede "bloquear" la
master
rama durante el tiempo de la fusión sin perturbar significativamente su flujo de trabajo, mientras que no es práctico en el primer escenario.Si está realizando revisiones sistemáticas de código, probablemente sea una buena idea reorganizar las confirmaciones de manera adecuada (paso opcional).
La gestión de los artefactos de rama intermedios solo presenta una dificultad si los comparte entre repositorios.
fuente
topic-0
,topic-1
ytopic-2
ramas. En el segundo en que se completa el rebase, la versión anterior es irrelevante. Así que todo lo que habría estopic@{1}
,topic@{2}
,topic@{yesterday}
,topic@{3.days.ago}
etc, para guardar su trasero en caso de que encuentre usted estropeó la resolución de conflictos en el rebase.topic
,. Porque rama en git es solo el nombre.topic
en GIT, siempre es una de las ramas (una rama de árbol como en cometer, no como en la referencia GIT) etiquetétopic-0
,topic-1
,topic-2
.