Зачем в gulp(grunt) разделять сборки на public и build?
Есть различные идеологии сборки проектов. Будь то папки dev, dist, public, production или еще какие либо. Но в основном отличие этих сборок следующее: в приведенном примере, предположительно, public — сборка проекта для отладки, а build — для продакшна, где исходные файлы минифицирются (например,  JavaScript), и при этом процесс отладки сильно усложняется, когда вместо привычного Вам пойнтера на баг выдаётся пойнтер на неизвестную минифицированную точку кода.
В public попадают твои временные файлы при разработке проекта.  Вот у меня в шаблоне jade файлы рендерятся в html в папку .tmp, а когда делаю gulp build эта папка стоит в gitignore. Как-то так.