Cuente el número de confirmaciones en una rama de Git

Respuestas:

351

Para contar las confirmaciones para la rama en la que se encuentra:

git rev-list --count HEAD

para una rama

git rev-list --count <branch-name>

Si desea contar las confirmaciones en una rama realizadas desde que creó la rama

git rev-list --count HEAD ^<branch-name>

Esto contará todas las confirmaciones realizadas que no están en el nombre de la sucursal.

Ejemplos

git checkout master
git checkout -b test
<We do 3 commits>
git rev-list --count HEAD ^master

Resultado: 3

Si su rama proviene de una rama llamada develop:

git checkout develop
git checkout -b test
<We do 3 commits>
git rev-list --count HEAD ^develop

Resultado: 3

Ignorar fusiones

Si combina otra rama en la rama actual sin avance rápido y hace lo anterior, la fusión también se cuenta. Esto se debe a que git una fusión es una confirmación.

Si no desea contar estas confirmaciones, agregue --no-merges:

git rev-list --no-merges --count HEAD ^develop
Peter van der Does
fuente
77
ninguno de estos muestra el número correcto, por ejemplo, master y nombre de sucursal muestran el mismo número de confirmaciones.
botbot
Los comentarios no permiten realmente el código, pero esto debería mostrar que funciona. ==== $ git init ==== $ touch test.txt ==== $ git add. ==== $ git commit -a ==== $ git rev-list --count HEAD => 1 ==== $ git rev-list --count master => 1 ==== $ git checkout -b test ==== $ git rev-list --count test => 1 ==== $ git rev-list --count HEAD ^ master => 0 ==== $ touch test2.txt ==== $ git agregar. ==== $ git commit -a ==== $ git rev-list --count master => 1 ==== $ git rev-list --count test => 2 ==== $ git rev-list --count HEAD ^ master => 1 ====
Peter van der Does
1
Estoy de acuerdo con @botbot. Estos no son realmente precisos. Por ejemplo, intente agregar algunos commits de fusión o pull / rebase y observe que los recuentos como se muestran arriba comienzan a no ser confiables.
Wil Moore III
2
@wilmoore ¿Quiere decir que obtiene un recuento adicional después de fusionar una sucursal? Esto es técnicamente una confirmación, por lo que se cuenta. pero si no desea contar estas confirmaciones agregue --no-merges. Actualizaré la respuesta.
Peter van der Does
2
rev-list --count flag no existe en git 1.7. En este momento, las sugerencias de votos despreciables que se git logmuestran a continuación están funcionando mejor que cualquier otra sugerencia.
aaronbauman
60

Para ver el número total de confirmaciones, puede hacer lo que Peter sugirió anteriormente

git rev-list --count HEAD

Y si desea ver la cantidad de confirmaciones realizadas por cada persona, pruebe esta línea

git shortlog -s -n

generará resultados como este

135  Tom Preston-Werner
15  Jack Danger Canty
10  Chris Van Pelt
7  Mark Reid
6  remi
Asnad Atta
fuente
3
¿Cuáles son estos números antes de los nombres? puedes explicar ?
Ciasto piekarz
55
@Ciastopiekarz estos son varios compromisos de cada persona.
Asnad Atta
39

Puede requerir una versión relativamente reciente de Git, pero esto funciona bien para mí:

git rev-list --count develop..HEAD

Esto me da un recuento exacto de confirmaciones en la rama actual que tiene su base en master.

El comando en la respuesta de Peter git rev-list --count HEAD ^developincluye muchos más commits, 678 vs 97 en mi proyecto actual.

Mi historial de confirmación es lineal en esta rama, por lo que YMMV, pero me da la respuesta exacta que quería, que es "¿Cuántas confirmaciones he agregado hasta ahora en esta rama de características?".

scanny
fuente
Debería ser lo mismo. Los documentos lo dicen . A special notation "<commit1>..<commit2>" can be used as a short-hand for "^'<commit1>' <commit2>". For example, either of the following may be used interchangeably: $ git rev-list origin..HEAD $ git rev-list HEAD ^origin
dosentmatter
Estoy confundido: git fetch upstream; BEHIND=$(git rev-list --count HEAD..upstream/master); git merge --ff-only upstream/master~$BEHIND;no se está alineando. DETRÁS es como 1800 cuando en realidad nada más que fusionar upstream / master ~ 400 produce cambios. usar --no-mergesno es mucho mejor, da como 900. Y si hago una combinación como esta con ~ 800, y el recuento de la lista de revoluciones es 1800, entonces hago una fusión con ~ 790 obtengo entre 6 y 28 recuento más bajo en rev -lista.
dlamblin
7

Cuántas confirmaciones se realizaron en la rama actual desde el comienzo de la historia, sin contar las confirmaciones de las ramas fusionadas:

git rev-list HEAD --count --first-parent

De la documentación git rev-list --help :

--first-parent

Siga solo el primer compromiso padre al ver un compromiso de fusión. Esta opción puede brindar una mejor visión general al ver la evolución de una rama de tema en particular, porque las fusiones en una rama de tema tienden a ser solo acerca de ajustarse a la actualización corriente arriba de vez en cuando, y esta opción le permite ignorar los compromisos individuales traídos a tu historia por tal fusión. No se puede combinar con --bisect.

Nota: el clon superficial reducirá el tamaño del historial. Por ejemplo, si clonas con --depth 1, devolverá 1.

Número de confirmaciones realizadas desde alguna otra confirmación:

git rev-list HEAD abc0923f --count --first-parent

o lo mismo:

git rev-list abc0923f.. --count --first-parent

o use cualquier otra referencia git :

git rev-list master tag-v20 --count --first-parent

Contar los compromisos realizados desde 2018 año

git rev-list HEAD --count --first-parent --since=2018-01-01

01-01-2018, 01.01.2018, 2018.01.01 también funciona.


git rev-label

Escribí un script para obtener la revisión de versión de Git en un formato como el '$refname-c$count-g$short$_dirty'que se expande master-c137-gabd32ef.
La ayuda está incluida en el script mismo.

kyb
fuente
git rev-list abc0923f .. --count - first-parent está dando resultados adecuados para mi rama pero el primer comando está dando un gran valor
Jiss Raphel
5

Qué tal si git log --pretty=oneline | wc -l

Eso debería contar todos los commits desde la perspectiva de su rama actual.

Remear
fuente
¿Qué columna cuentas? ¿Es el primero?
Hengjie
3

Me gusta hacer git shortlog -s -n --all. Le proporciona una lista de nombres y número de confirmaciones en el estilo de "tabla de clasificación".

inorganik
fuente
2

Una forma de hacerlo es enumerar el registro de su sucursal y contar las líneas.

git log <branch_name> --oneline | wc -l
kjw0188
fuente
1

Bueno, la respuesta seleccionada no funciona si bifurcas tu rama de una rama no específica (es decir, no mastero develop).

Aquí ofrezco una forma diferente que estoy usando en mis pre-pushganchos de git.

# Run production build before push
echo "[INFO] run .git/hooks/pre-push"

echo "[INFO] Check if only one commit"

# file .git/hooks/pre-push
currentBranch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')

gitLog=$(git log --graph --abbrev-commit --decorate  --first-parent HEAD)

commitCountOfCurrentBranch=0
startCountCommit=""
baseBranch=""

while read -r line; do

    # if git log line started with something like "* commit aaface7 (origin/BRANCH_NAME)" or "commit ae4f131 (HEAD -> BRANCH_NAME)"
    # that means it's on our branch BRANCH_NAME

    matchedCommitSubstring="$( [[ $line =~ \*[[:space:]]commit[[:space:]].*\((.*)\) ]] && echo ${BASH_REMATCH[1]} )"

    if [[ ! -z ${matchedCommitSubstring} ]];then

      if [[  $line =~ $currentBranch ]];then
        startCountCommit="true"
      else
        startCountCommit=""

        if [[ -z ${baseBranch} ]];then
          baseBranch=$( [[ ${matchedCommitSubstring} =~ (.*)\, ]] && echo ${BASH_REMATCH[1]} || echo ${matchedCommitSubstring} )

        fi

      fi

    fi


    if [[ ! -z ${startCountCommit} && $line =~ ^\*[[:space:]]commit[[:space:]] ]];then
      ((commitCountOfCurrentBranch++))
    fi


done <<< "$gitLog"

if [[ -z ${baseBranch} ]];then

  baseBranch="origin/master"

else

  baseBranch=$( [[ ${baseBranch} =~ ^(.*)\, ]] && echo ${BASH_REMATCH[1]} || echo ${baseBranch} )

fi


echo "[INFO] Current commit count of the branch ${currentBranch}:  ${commitCountOfCurrentBranch}"

if [[ ${commitCountOfCurrentBranch} -gt 1 ]];then
  echo "[ERROR] Only a commit per branch is allowed. Try run 'git rebase -i ${baseBranch}'"
  exit 1
fi

Para más análisis, visite mi blog.

Paul Lan
fuente
1

Como el OP hace referencia al número de confirmaciones en la rama en git , quiero agregar que las respuestas dadas allí también funcionan con cualquier otra rama, al menos desde la versión 2.17.1 de git (y aparentemente más confiable que la respuesta de Peter van der Does):

funcionando correctamente:

git checkout current-development-branch
git rev-list --no-merges --count master..
62
git checkout -b testbranch_2
git rev-list --no-merges --count current-development-branch..
0

El último comando da cero confirmaciones como se esperaba ya que acabo de crear la rama. El comando anterior me da el número real de confirmaciones en mi rama de desarrollo menos las confirmaciones de combinación

no funciona correctamente

git checkout current-development-branch
git rev-list --no-merges --count HEAD
361
git checkout -b testbranch_1
git rev-list --no-merges --count HEAD
361

En ambos casos obtengo el número de todos los commits en la rama de desarrollo y master de donde descienden las ramas (indirectamente).

sdoe
fuente
1

Si está utilizando un sistema UNIX, podría hacer

git log|grep "Author"|wc -l
hacia
fuente
-2

También puedes hacer git log | grep commit | wc -l

y recuperar el resultado

James
fuente
1
Esto no es confiable. Coincidiría con los commits que tienen "commit" en el mensaje de commit dos veces, por ejemplo.
rdb
@rdb No, no lo hará. Solo generará el número de líneas que contienen la palabra "commit", por lo que una línea nunca se contará dos veces.
iBug
@iBug: Te estás perdiendo el punto. Si el mensaje de confirmación contiene la palabra "confirmación", aparece en una línea separada de la línea "confirmación a1b2c ..." en la git logsalida, por lo que la confirmación se contará dos veces en el resultado. Peor aún si el mensaje de confirmación contuviera la palabra "commit" dos veces en dos líneas separadas.
rdb