Edit in JSFiddle

var app = angular.module('app', []);

app.controller('appCtrl', function ($scope) {
    $scope.master = {};

    $scope.update = function (user) {
        $scope.master = angular.copy(user);
    };

    $scope.reset = function () {
        $scope.user = angular.copy($scope.master);
    };

    $scope.isUnchanged = function (user) {
        return angular.equals(user, $scope.master);
    };

    $scope.reset();
});
input.ng-invalid.ng-dirty {
    background-color: red;
    color: cyan;
}
input.ng-valid.ng-dirty {
    background-color: green;
    color: cyan;
}
<section ng-app="app">
    <section ng-controller="appCtrl" class="well">
        <form class="form-horizontal" name="appFormName" novalidate>
            <div class="form-group">
                <label class="col-sm-2 control-label">Name (updateOn: 'mousedown blur')</label>
                <div class="col-sm-10">
                    <input type="text" ng-model="user.name" ng-model-options="{ updateOn: 'mousedown blur' }" name="userName" class="form-control" required />
                </div>
            </div>
            <div class="form-group">
                <label class="col-sm-2 control-label">Email (updateOn: 'blur')</label>
                <div class="col-sm-10">
                    <input type="email" ng-model="user.email" ng-model-options="{ updateOn: 'blur' }" name="userEmail" class="form-control" required />
                </div>
            </div>
            <div class="alert alert-danger" ng-show="appFormName.userEmail.$dirty && appFormName.userEmail.$invalid">Invalid: <span ng-show="appFormName.userEmail.$error.required">Tell us your email.</span>
 <span ng-show="appFormName.userEmail.$error.email">This is not a valid email.</span>

            </div>
            <div class="form-group">
                <label class="col-sm-2 control-label">Gender</label>
                <div class="col-sm-10">
                    <input type="radio" ng-model="user.gender" value="male" />male
                    <input type="radio" ng-model="user.gender" value="female" />female</div>
            </div>
            <div class="form-group">
                <input type="checkbox" ng-model="user.agree" name="userAgree" required />I agree:
                <input ng-show="user.agree" type="text" ng-model="user.agreeSign" class="form-control" required />
            </div>
            <div class="alert alert-danger" ng-show="!user.agree || !user.agreeSign">Please agree and sign.</div>
            <div class="form-group">
                <div class="col-sm-offset-2 col-sm-10">
                    <button ng-click="reset()" ng-disabled="isUnchanged(user)" class="btn btn-default">reset</button>
                    <button ng-click="update(user)" ng-disabled="form.$invalid || isUnchanged(user)" class="btn btn-primary">save</button>
                </div>
            </div>
            
            <ul>
                <li ng-repeat="(key, errors) in appFormName.$error track by $index"><strong>{{ key }}</strong> errors
                    <ul>
                        <li ng-repeat="error in errors">{{ error.$name }} has an error: <strong>{{ key }}</strong></li>
                    </ul>
                </li>
            </ul>
            
            
        </form> <pre>form = {{user | json}}</pre>
 <pre>master = {{master | json}}</pre>

    </section>
</section>