Tengo dos ramas devel
y next
. En desarrollo tengo una cantidad más o menos enorme de commits. Algunos de los commits son seleccionados next
. También agregué algunas confirmaciones a la siguiente que se fusionaron devel
.
Ahora me gustaría ver lo que falta next
, para poder probar los cambios en detalle antes de llevarlos a cabo next
. Mi pregunta ahora es, ¿cómo puedo ver en qué commits hay devel
pero no en el próximo?
Respuestas:
El comando poco utilizado le
git cherry
muestra los commits que aún no han sido seleccionados. La documentación paragit cherry
está aquí , pero, en resumen, debería poder hacer:... y ver la salida un poco como esto:
Los commits que comiencen
+
serán los que aún no has elegidonext
. En este caso, solo había elegido una confirmación hasta el momento. Es posible que desee agregar el-v
parámetro algit cherry
comando, para que también muestre la línea de asunto de cada confirmación.fuente
git checkout devel
, solo puedes hacerlogit cherry next devel
.-v
" ? La cereza sin un-v
es comols
sin un-la
. ; -Jcherry
de marcar o excluir confirmaciones equivalentes, ¿verdad?cherry
parece un comando de plomería, pero no (parece) ofrecer muchas opciones. Por lo que estoy actualmente en el medio,git cherry
me da falsos positivos, pero @ sehegit log --cherry-pick
excluye correctamente los commits previamente seleccionados / rebajados.Además, puedes usar
para obtener una buena lista de confirmaciones diferentes reales no compartidas entre las ramas.
La palabra operativa es
--cherry-pick
Actualización Como se menciona en un comentario, se agregaron versiones recientes de git
--cherry-mark
:fuente
Podría intentar hacer subconjuntos de registro git:
fuente
--left-only
hubiera sido mejor). Sin embargo, este se puede mejorar un poco agregando--no-merges
para omitir cualquier confirmación de fusión (por ejemplo, si una característica o rama de revisión se fusionó (por separado) en desarrollo y siguiente). Hablando estrictamente, por supuesto, la resolución de conflictos en las fusiones puede crear otras diferencias, pero ese no suele ser el caso. La--no-merges
opción se puede aplicar útilmente a las otras respuestas también.Qué tal si
El resultado es similar a la respuesta de Byran (diferente orden de confirmaciones) pero ambas respuestas producirán confirmaciones que son diferentes entre las ramas, en lugar de mostrar lo que hay en una rama y no en la otra.
fuente
git log next..
Para obtener la lista de confirmaciones que no se integraron en la rama de lanzamiento (siguiente), puede usar:
Consulte git-rev-list para obtener más información.
fuente
next...devel
@Mark Longair lo logró en su respuesta aquí , pero me gustaría agregar una idea adicional.
Relacionado y respondiendo a la pregunta de cómo dividir una solicitud de extracción (PR) grande, especialmente cuando aplastar sus confirmaciones no es práctico debido a una o más fusiones de master en su feature_branch
Mi situación:
hice una gran apuesta
feature_branch
con 30 confirmaciones y abrí una solicitud de extracción (PR) en GitHub para fusionarlamaster
. Branchmaster
cambió una tonelada debajo de mí y recibió 200 confirmacionesfeature_branch
que no tenía. Para resolver conflictos que hicegit checkout feature_branch
ygit merge master
para fusionarmaster
los cambios en mifeature_branch
. Elegí enmerge
lugar delrebase
último maestro, por lo que tendría que resolver los conflictos solo una vez en lugar de potencialmente 30 veces (una vez para cada una de mis confirmaciones). No quería aplastar mis 30 commits en 1 primero y luego rebase en el últimomaster
porque eso podría borrar el historial de comentarios de revisión de GitHub en el PR. Entonces, fusioné master en mi rama de características y resolví conflictos 1 sola vez. Todo estuvo bien. Sin embargo, mi RP era demasiado grande para que mis colegas la revisaran. Necesitaba dividirlo. Fui a aplastar mis 30 commits y ¡OH NO! ¿DÓNDE ESTÁN? ¡TODOS ESTÁN INTERMITADOS CONmaster
las 200 confirmaciones recientes ahora porque me fusioné conmaster
mifeature_branch
! ¿QUÉ DEBO HACER?git cherry
uso en caso de que quiera intentargit cherry-pick
confirmaciones individuales:git cherry
al rescate (más o menos)!Para ver todos los commits que están dentro
feature_branch
pero NO dentromaster
, puedo hacer:O bien, puedo verificar las confirmaciones de CUALQUIER rama sin asegurarme de que estoy en
feature_branch
primer lugar haciendogit cherry [upstream_branch] [feature_branch]
esto. Nuevamente, esto verifica qué confirmaciones ESTÁN enfeature_branch
pero NO enupstream_branch
(master
en este caso):Agregar
-v
también muestra las líneas de asunto del mensaje de confirmación:La canalización a "recuento de palabras", "líneas" (
wc -l
) cuenta cuántas confirmaciones hay:Puede comparar este recuento con el número de confirmación que se muestra en su GithHub PR para sentirse mejor al saber que
git cherry
realmente está funcionando. También puede comparar los hash de git uno por uno y ver si coinciden congit cherry
GitHub. Tenga en cuenta quegit cherry
no contará ningún commit de combinación en la que fueron fusionadosmaster
enfeature_branch
, pero GitHub VOLUNTAD. Entonces, si ve una pequeña discrepancia en el recuento, busque en la página de confirmación de relaciones públicas de GitHub la palabra "fusionar" y probablemente verá que ese es el culpable que no aparecegit cherry
. Por ejemplo: una confirmación titulada "Combinar rama 'maestro' en feature_branch" aparecerá en el PR de GitHub, pero no cuando se ejecutegit cherry master feature_branch
. Esto está bien y se espera.Entonces, ahora tengo un medio para descubrir qué diferencias me gustaría elegir en una nueva rama de características para dividir esta diferencia: puedo usar
git cherry master feature_branch
localmente o mirar los commits en el PR de GitHub.Cómo podría ayudar el aplastamiento, si tan solo pudiéramos aplastarlo:
Sin embargo, una alternativa para dividir mi gran diferencia es aplastar mis 30 confirmaciones en una sola, aplicar un parche en una nueva rama de características, restablecer de forma parcial la confirmación de la revisión, luego usar
git gui
para agregar piezas archivo por archivo, fragmento por fragmento o linea por linea. Una vez que obtengo una subfunción, puedo confirmar lo que he agregado y luego revisar una nueva rama, agregar un poco más, confirmar, revisar una nueva rama, etc., hasta que tenga mi gran característica dividida en varias subfunciones . El problema es que mis 30 commits se entremezclan con los otros 200 commits de otras personas debido a migit merge master
en mifeature_branch
, por lo que rebase no es práctico, ya que tendría que seleccionar 230 commits para reordenar y aplastar mis 30 commits.Cómo usar un archivo de parche como un reemplazo mucho más fácil para aplastar:
Una solución alternativa es simplemente obtener un archivo de parche que contenga un "equivalente de squash" de mis 30 confirmaciones, parchearlo en una nueva bifurcación de
master
(una nueva rama de subfunción) y trabajar desde allí, de la siguiente manera:Ahora tengo mi parche de 30 confirmaciones todo aplicado localmente, pero sin etapas y sin compromiso.
Ahora use
git gui
para agregar archivos, fragmentos y / o líneas y dividir su gran PR o "diff":Tenga en cuenta que si no tiene
git gui
, puede instalarlo fácilmente en Ubuntu consudo apt install git-gui
.Ahora puedo ejecutar
git gui
y comenzar a agregar archivos, fragmentos y / o líneas (haciendo clic con el botón derecho en el programa git GUI), y dividir la rama de la función de confirmación 30 en sub ramas como se describe arriba, agregando, confirmando y bifurcando repetidamente una nueva rama de funciones y repetir este ciclo hasta que todos los cambios se hayan agregado a una rama secundaria y mi función de confirmación 30 se divida con éxito en 3 o 4 subcaracterísticas. Ahora puedo abrir un RP por separado para cada una de estas subfunciones, y será más fácil para mi equipo revisarlas.Referencias
fuente