# File lib/gibbler/history.rb, line 106
    def gibbler_revert!(g=nil)
      raise NoRevert unless self.respond_to? :__gibbler_revert!
      raise NoHistory, self.class unless gibbler_history?
      raise BadDigest, g if !g.nil? && !gibbler_valid?(g)
      
      g = self.gibbler_history.last if g.nil?
      g = gibbler_find_long g 
      
      # Do nothing if the given digest matches the current gibble. 
      # NOTE: We use __gibbler b/c it doesn't update self.gibbler_cache.
      unless self.__gibbler == g
        @@mutex.synchronize {
          # Always make sure self.gibbler_digest is a Gibbler::Digest 
          self.gibbler_cache = g.is_a?(Gibbler::Digest) ? g : Gibbler::Digest.new(g)
          self.__gibbler_revert!
        }
      end
      
      self.gibbler_cache
    end