# Git Log Cheat Sheet – Analyse & Diagnose

## Inhaltsverzeichnis
- [Wann wird gearbeitet](#wann-wird-gearbeitet)
- [Wer versteht das System](#wer-versteht-das-system)
- [Release-Prozess analysieren](#release-prozess-analysieren)
- [Merge-Complexity](#merge-complexity)
- [Risiko-Hotspots](#risiko-hotspots)

---

## Wann wird gearbeitet
Zeigt, zu welchen Uhrzeiten am häufigsten Commits stattfinden.

```bash
git log --since="6 months ago" \
--pretty=format:"%ad" \
--date=format:"%H:00" \
| sort | uniq -c | sort -nr | head
```

---

## Wer versteht das System
Identifiziert die aktivsten Entwickler im Repository (Top-Contributors).

```bash
git log --since="6 months ago" --pretty=format:"%an" \
| sort | uniq -c | sort -nr | head -5
```

---

## Release-Prozess analysieren
Bewertet Qualität und Struktur der Tags (Annotated vs. Lightweight, SemVer-Compliance).

```bash
git for-each-ref refs/tags \
--format='%(refname:short)|%(taggerdate)' \
| awk -F'|' '
function is_semver(tag) {
  return tag ~ /^v?[0-9]+\.[0-9]+\.[0-9]+$/
}
{
  total++

  # Lightweight vs Annotated
  if ($2 == "") lightweight++
  else annotated++

  # SemVer Check
  if (is_semver($1)) semver++
  else non_semver++
}
END {
  printf "Total tags: %d\n", total
  printf "Annotated tags: %d\n", annotated
  printf "Lightweight tags: %d\n", lightweight
  printf "SemVer compliant: %d\n", semver
  printf "Non-SemVer tags: %d\n", non_semver

  annotated_score = (annotated/total)*100
  semver_score = (semver/total)*100

  printf "\nAnnotated ratio: %.2f%%\n", annotated_score
  printf "SemVer ratio: %.2f%%\n", semver_score

  quality = (annotated_score * 0.6) + (semver_score * 0.4)
  printf "\nRelease Quality Score: %.2f / 100\n", quality
}'
```

---

## Merge-Complexity
Analysiert die Komplexität von Merge-Commits anhand der geänderten Dateien.

```bash
git rev-list --all --min-parents=2 --since="6 months ago" \
| while read commit; do
    git show --shortstat --format="" "$commit"
  done \
| grep "files changed" \
| awk '{
    files += $1
    merges++
  }
  END {
    if (merges > 0) {
      printf "Total merges: %d\n", merges
      printf "Total files changed: %d\n", files
      printf "Avg files per merge: %.2f\n", files/merges
    } else {
      print "No merge commits found in this period."
    }
  }'
```

---

## Risiko-Hotspots
Identifiziert Dateien mit den meisten Änderungen (Hotspots im System).

```bash
git log --since="6 months ago" --numstat --pretty="%H" \
| awk '
  { added[$3]+=$1; deleted[$3]+=$2 }
  END {
    for (file in added)
      print added[file]+deleted[file], file
  }' \
| sort -nr \
| head -20
```

---
