title: Unable to deploy with rails and capistrano, "HEAD is not the same as origin/master"
body: <p>I keep getting an error when trying to deploy with capistrano to my remote server. It is telling me that my local files aren't synced up to the remote repo, but when I <code>git push</code> I get  the <code>Everything is up-to-date</code> message. I'm not sure what the problem is. I've also checked the rev-parse for both origin and HEAD and they return the same values.</p>
  
  <p>Error:</p>
  
  <pre><code>WARNING: HEAD is not the same as origin/master
  Run `git push` to sync changes.
  (Backtrace restricted to imported tasks)
  cap aborted!
  SSHKit::Runner::ExecuteError: Exception while executing on host [IP address]
  exit
  
  SystemExit: exit
  
  Tasks: TOP =&gt; deploy:starting =&gt; deploy:check_revision
  (See full trace by running task with --trace)
  The deploy has failed with an error: Exception while executing on host [IP address]: exit    
  </code></pre>
  
  <p>deploy.rb</p>
  
  <pre><code># Change these
  server '[ipaddress]', port: 22, roles: [:web, :app, :db], primary: true
  
  set :repo_url,        'git@github.com:name/rails_site.git'
  set :application,     'rails_site'
  set :user,            'deploy'
  set :puma_threads,    [4, 16]
  set :puma_workers,    0
  
  # Don't change these unless you know what you're doing
  set :pty,             true
  set :use_sudo,        false
  set :stage,           :production
  set :deploy_via,      :remote_cache
  set :deploy_to,       "/home/#{fetch(:user)}/apps/#{fetch(:application)}"
  set :puma_bind,       "unix://#{shared_path}/tmp/sockets/#{fetch(:application)}-puma.sock"
  set :puma_state,      "#{shared_path}/tmp/pids/puma.state"
  set :puma_pid,        "#{shared_path}/tmp/pids/puma.pid"
  set :puma_access_log, "#{release_path}/log/puma.error.log"
  set :puma_error_log,  "#{release_path}/log/puma.access.log"
  set :ssh_options,     { forward_agent: true, user: fetch(:user), keys: %w(~/.ssh/id_rsa.pub) }
  set :puma_preload_app, true
  set :puma_worker_timeout, nil
  set :puma_init_active_record, true  # Change to false when not using ActiveRecord
  
  ## Defaults:
   set :scm,           :git
   set :branch,        :master
   set :format,        :pretty
   set :log_level,     :debug
   set :keep_releases, 5
  
  ## Linked Files &amp; Directories (Default None):
  # set :linked_files, %w{config/database.yml}
  # set :linked_dirs,  %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system}
  
  namespace :puma do
    desc 'Create Directories for Puma Pids and Socket'
    task :make_dirs do
      on roles(:app) do
        execute "mkdir #{shared_path}/tmp/sockets -p"
        execute "mkdir #{shared_path}/tmp/pids -p"
      end
    end
  
    before :start, :make_dirs
  end
  
  namespace :deploy do
    desc "Make sure local git is in sync with remote."
    task :check_revision do
      on roles(:app) do
        unless 'git rev-parse HEAD' === 'git rev-parse origin/master'
          puts "WARNING: HEAD is not the same as origin/master"
          puts "Run `git push` to sync changes."
          exit
        end
      end
    end
  
    desc 'Initial Deploy'
    task :initial do
      on roles(:app) do
        before 'deploy:restart', 'puma:start'
        invoke 'deploy'
      end
    end
  
    desc 'Restart application'
    task :restart do
      on roles(:app), in: :sequence, wait: 5 do
        invoke 'puma:restart'
      end
    end
  
    before :starting,     :check_revision
    after  :finishing,    :compile_assets
    after  :finishing,    :cleanup
    after  :finishing,    :restart
  end
  
  # ps aux | grep puma    # Get puma pid
  # kill -s SIGUSR2 pid   # Restart puma
  # kill -s SIGTERM pid   # Stop puma
  </code></pre>
  
  <p>EDIT: </p>
  
  <pre><code>$ git status
  On branch master
  Your branch is up-to-date with 'origin/master'.
  nothing to commit, working directory clean
  
  $ git branch -a
  * master
    remotes/origin/HEAD -&gt; origin/master
    remotes/origin/master 
  </code></pre>