One of the most useful features in ZFS is the ability to easily create snapshots.  Because of the copy-on-write nature of the filesystem, snapshots are both simple to create (old files are simply marked as belonging to a snapshot rather than marked for deletion) and always consistent due to the nature of copy-on-write.  

Creating a snapshot is easy -- simply use the zfs snapshot command like this:

zfs snapshot m10-1/development@mysnapshot

This will create a snapshot of the development dataset named mysnapshot.  Generally, we try to create snapshots with date/time values as part of their names -- it makes it easier to identify them among a large number of snapshots.  So you might use something like:

zfs snapshot m10-1/development@20170531

for a snapshot instead of the generic name above. You can also use recursion to snapshot all children of a dataset at the same time. Just add the -r switch to the snapshot command:

zfs snapshot -r m10-1/development@20170531

This will create snapshots in all of the child datasets at the same time as the parent.  Finally to list snapshots you can use the -t switch with zfs list, like this:

zfs list -t snapshot

This will list all existing snapshots.  Because snapshots are the basis for both ZFS clones and for send/receive, they are a fundamental part of how we use ZFS.