We're using deploy_revision resource with git scm. We have 1000+ servers and sometimes we need to test the new version of our app on several (i.e. 10) of servers. We then create a branch from master, add some commits and then change revision (node[:app][:deploy_branch] attribute in our case) to that branch on these servers. If something goes wrong we then change it back to production. Chef client then sees that it already have this release in releases folder and perform the rollback. After that it doesn't call after_restart callback, however, and the code we have in that block is not executed.