A client will indicate it is not push-enabled by setting SETTINGS_ENABLE_PUSH to 0 during the set up of the HTTP/2 connection.
From the HTTP/2 specification:
PUSH_PROMISE MUST NOT be sent if the SETTINGS_ENABLE_PUSH setting of
the peer endpoint is set to 0. An endpoint that has set this setting
and has received acknowledgement MUST treat the receipt of a
PUSH_PROMISE frame as a connection error (Section 5.4.1) of type
But HTTP/2 Push can easily be abused by site owners if they overly push assets that a client may not need, or already has cached. Clients can reset the stream to indicate they don't want the pushed resource but that's not great as it's still extra work for both client and server.
There are various methods website owners should use to ensure they only push appropriate content. I detail one such simple method in this blog post: https://www.tunetheweb.com/performance/http2/http2-push/. The HTTP Working Group are working on Cache digests which should ultimately formalise a method of doing this, but this is currently still being defined.