--- /dev/null
+#!/bin/sh
+
+test_description='test describe
+
+ B
+ .--------------o----o----o----x
+ / / /
+ o----o----o----o----o----. /
+ \ A c /
+ .------------o---o---o
+ D e
+'
+. ./test-lib.sh
+
+check_describe () {
+ expect="$1"
+ shift
+ R=$(git describe "$@") &&
+ test_expect_success "describe $*" '
+ case "$R" in
+ $expect) echo happy ;;
+ *) echo "Oops - $R is not $expect";
+ false ;;
+ esac
+ '
+}
+
+test_expect_success setup '
+
+ test_tick &&
+ echo one >file && git-add file && git-commit -m initial &&
+ one=$(git-rev-parse HEAD) &&
+
+ test_tick &&
+ echo two >file && git-add file && git-commit -m second &&
+ two=$(git-rev-parse HEAD) &&
+
+ test_tick &&
+ echo three >file && git-add file && git-commit -m third &&
+
+ test_tick &&
+ echo A >file && git-add file && git-commit -m A &&
+ test_tick &&
+ git-tag -a -m A A &&
+
+ test_tick &&
+ echo c >file && git-add file && git-commit -m c &&
+ test_tick &&
+ git-tag c &&
+
+ git reset --hard $two &&
+ test_tick &&
+ echo B >side && git-add side && git-commit -m B &&
+ test_tick &&
+ git-tag -a -m B B &&
+
+ test_tick &&
+ git-merge -m Merged c &&
+ merged=$(git-rev-parse HEAD) &&
+
+ git reset --hard $two &&
+ test_tick &&
+ echo D >another && git-add another && git-commit -m D &&
+ test_tick &&
+ git-tag -a -m D D &&
+
+ test_tick &&
+ echo DD >another && git commit -a -m another &&
+
+ test_tick &&
+ git-tag e &&
+
+ test_tick &&
+ echo DDD >another && git commit -a -m "yet another" &&
+
+ test_tick &&
+ git-merge -m Merged $merged &&
+
+ test_tick &&
+ echo X >file && echo X >side && git-add file side &&
+ git-commit -m x
+
+'
+
+check_describe A-* HEAD
+check_describe A-* HEAD^
+check_describe D-* HEAD^^
+check_describe A-* HEAD^^2
+check_describe B HEAD^^2^
+
+check_describe A-* --tags HEAD
+check_describe A-* --tags HEAD^
+check_describe D-* --tags HEAD^^
+check_describe A-* --tags HEAD^^2
+check_describe B --tags HEAD^^2^
+
+test_done