git - tipos - Extraiga todos los commits desde una rama, presione commits especificados a otro
git ver archivos modificados (2)
El término que creo que estás buscando es una "elección de cereza". Es decir, tome una confirmación simple desde el medio de una rama y agréguela a otra:
A-----B------C
/
/
D
se convierte
A-----B------C
/
/
D-----C''
Esto, por supuesto, se puede hacer con el comando git cherry-pick.
El problema con este commits es que git considera commits para incluir todo el historial antes que ellos, por lo tanto, si tienes tres commits así:
A-----B-----C
Y trate de deshacerse de B, debe crear una confirmación completamente nueva como esta:
A-----------C''
Donde C ''tiene una ID SHA-1 diferente. Del mismo modo, seleccionar un compromiso de una rama a otra consiste básicamente en generar un parche y luego aplicarlo, perdiendo así también la historia.
Este cambio de identificadores de commit rompe la funcionalidad de fusión de git entre otras cosas (aunque si se usa con moderación, hay heurística que tomará en cuenta esto). Sin embargo, lo más importante es que ignora las dependencias funcionales: si C realmente usó una función definida en B, nunca lo sabrá.
Quizás una mejor forma de manejar esto sería tener ramas de grano más fino. Es decir, en lugar de solo tener un ''maestro'', tener ''featureA'', ''bugfixB'', etc. Realice una revisión de código en una rama completa a la vez, donde cada rama está muy enfocada en hacer una sola cosa, y luego fusione una rama cuando termines Este es el flujo de trabajo para el que git está diseñado y en lo que es bueno :)
Si insistes en tratar las cosas al nivel de los parches, es posible que desees ver los darcs: considera que un repositorio es un conjunto de parches, y por lo tanto, la selección de cerebros se convierte en la operación fundamental. Sin embargo, esto tiene su propio conjunto de problemas, como ser muy lento :)
Editar: Además, no estoy seguro de entender tu segunda pregunta sobre los dos guiones. ¿Tal vez podrías describirlo con más detalle, posiblemente como una pregunta separada para evitar que las cosas se vuelvan confusas?
Tengo las siguientes ramas:
master
-
production
y las siguientes ramas remotas:
-
origin/master
-
origin/production
Tengo un script que recupera la rama de origin/master
y obtiene la diferencia de lo que cambió desde mi última búsqueda ( log -p master..origin/master
). Luego fusiono origin/master
.
Las confirmaciones encontradas se envían a una herramienta de revisión de código.
Quiero impulsar los commits exitosos, y solo ellos, a la rama de producción, y luego, por supuesto, al origin/production
.
¿Como lo puedo hacer?
Además, tengo 2 scripts en ejecución: el que obtiene del origin/master
, el empuje confirma los detalles en una base de datos y se fusiona, y el otro que estoy escribiendo que deberá enviar los commits exitosos.
Me gustaría tener esos 2 scripts en ejecución mientras evito las condiciones de carrera / conflicto de fusión. Como solo quiero trabajar con confirmaciones especificadas, ¿hay alguna manera de deshacerse de las confirmaciones que no quiero?
Me doy cuenta de que esta es una vieja pregunta, pero se hace referencia aquí: Cómo fusionar un compromiso específico en Git
Por lo tanto, una respuesta más nueva: use ramas de características y solicitudes de extracción.
Cómo se ve esto, donde fA es una confirmación con la característica A, y fB es una confirmación con la característica B:
fA fC (bad commit, don''t merge)
/ / /
master ----A----B----C
/ /
fB
Las solicitudes de extracción se asocian con la funcionalidad de GitHub, pero en realidad lo único que quiero decir es que alguien tiene la responsabilidad de fusionar las ramas de características en maestra.