find . -name '.git' -prune
это то же самое, что и
find . -name '.git' -prune -print
поэтому он обрезает и затем печатает
find . -name '.git' -prune -o -name '*.md' -print
это то же самое, что и
find . \( -name '.git' -prune -true \) -o \( -name '*.md' -print \)
поэтому он делает первое предложение, если он делает обрезку, то он делает true (обрезка возвращает true), и не делает правую часть -o
Они всегда будут печатать
find . \( -name '.git' -prune -o -name '*.md' \) -print
find . -name '.git' -prune -print -o -name '*.md' -print