tipos - git log para devolver solo las confirmaciones hechas a la rama maestra?
git ver commits pendientes (2)
He hecho un poco de búsqueda y he encontrado:
git log myBranchName
como una posible solución. Pero, ¿qué pasa cuando mi rama es la rama maestra? cuando corro:
git log master
Parece devolver todo lo comprometido a cualquier sucursal. De acuerdo con lo que he leído, enumera todas las confirmaciones relacionadas con la rama maestra. Sabiendo eso, ¿cómo puedo recuperar el historial de confirmación de la rama maestra solamente?
Creo que esto es lo que quieres
git log --first-parent master
Para citar el manual
Siga solo el primer compromiso padre al ver un compromiso de fusión. Esta opción puede proporcionar una mejor visión general al ver la evolución de una rama de tema en particular, ya que las combinaciones en una rama de tema tienden a ser solo sobre el ajuste a la actualización de tiempo en tiempo, y esta opción le permite ignorar las confirmaciones individuales introducidas para su historia por tal fusión.
Debido al modelo de bifurcación de Git, los compromisos no pertenecen a una sola o varias bifurcaciones. Las ramas son punteros a objetos de confirmación individuales dentro de todo el gráfico de confirmación. Así que cuando dices que un compromiso está "en una rama X" en X, generalmente quieres decir que es accesible cuando se inicia en la confirmación a la que apunta la rama X.
Para git log
, el comportamiento predeterminado es igual a git log HEAD
donde HEAD se refiere a la confirmación a la que apunta actualmente la rama actual. Por lo tanto, si se encuentra en la rama maestra, es igual a git log master
, que muestra todas las confirmaciones a las que se puede git log master
cuando se inicia en la confirmación más reciente.
Desafortunadamente, lo que usted se refiere como un compromiso hecho a una determinada rama no está claramente definido en Git. Si hago un commit en master y luego creo una nueva rama que apunta al mismo commit (por ejemplo, usando git branch newbranch
), esa rama es literalmente idéntica a la rama master, excepto por el nombre. Por lo tanto, cada propiedad "hecha en la sucursal maestra" ahora también implicaría "hecha en la sucursal de la sucursal nueva" . Como tal, no puede tener esta propiedad en Git.
Incluso la solución de parkydr, que muestra todos los compromisos que se hicieron solo en un lado de las fusiones, no es una solución a prueba de fallas. Lo ideal sería que ocultara todos aquellos compromisos que se hicieron en una rama no maestra separada y que luego se fusionaron de nuevo en el maestro. Como tal, solo obtendría confirmaciones que se realizan directamente en la línea maestra o que son combinaciones de combinación de combinaciones en otras confirmaciones. Sin embargo, hay dos cosas que evitarán que esto funcione:
- Combinaciones de avance rápido: cuando se bifurca desde el maestro y crea algunas confirmaciones, mientras no se crea un nuevo en el maestro directamente, un
git merge somebranch
en el maestro avanzará rápidamente las confirmaciones, lo que hará que la rama maestra apunte a la misma confirmación que somebranch Como tal, usted “pierde” la información de que esos compromisos se crearon originalmente en una rama separada. Sin embargo, puede forzar a Git a crear siempre confirmaciones de fusión, usandogit merge --no-ff
pero esto no le ayudará después. - El orden de fusión no está garantizado: cuando se encuentra en maestro y fusiona una rama, entonces el compromiso maestro anterior siempre será el primer padre. Así obtendrías tu comportamiento deseado. Sin embargo, es perfectamente posible estar en dicha bifurcación, y fusionar el maestro en su lugar, lo que hace que el master sea el segundo padre. Luego, el maestro podría avanzar rápidamente (o restablecerse) a la nueva confirmación, lo que resultaría en una vista "invertida".
Por lo tanto, la conclusión es que no se puede obtener de manera segura tal historial. Es mejor acostumbrarse a cómo funciona el modelo de ramificación flexible de Git.