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.