Pokko has two concepts that appear on the surface to solve the same problem, but there are slight differences that warrant them to exist in their own rights.
At the environment level is where Pokko stores everything to do with your projects configuration and content. Models belong to a project environment, not a project. Same goes for content entries.
Modifying models – creating new ones, changing existing ones, adding or removing fields, etc. will have an immediate impact on the GraphQL endpoint surfacing your content.
Because of this fact, once you have built and launched a product (i.e., a website) you probably wouldn't want to be making any changes to that GraphQL endpoint that negatively impact your system.
Environments help you mitigate this by allowing you to have a separate space for you to work in before sending your changes live.
You could have an environment for Production and another one for Development. Any changes you make in Development won't impact Production and vice-versa.
Side note - at the time of writing there is no facility for synchronising changes between environments, but it is definitely on the roadmap and should be available in the near future.
Once the synchronisation feature is available you will be able to compare environments and transfer changes between them.
Publish targets are configured at a project level but are somewhat scoped to project environments.
When querying your GraphQL endpoint you specify three things: the project, the environment within the project and the project token.
Project tokens are also configured at a project level and are associated with a publish target.
When publishing content you can specify which publish target it will be published to. That will surface only the version of those published pieces of content to requests made with their respective project token.
With all content within a project environment you can be sure that the structure will always be the same, and all the validation rules associated with an entry's model will have been applied when the content was published.
In contrast, data models can vary across project environments, so there is no guarantee that your content will be in the same structure from one environment to the next.