title: Django migrate --fake and --fake-initial explained
body: <p>I've been a user of Django for about 2 years now and there is a feature I have always been afraid of using : <em><strong>faking migrations</strong></em>.</p>
  
  <p>I've looked pretty much everywhere and the most information I can get is from the <a href="https://docs.djangoproject.com/en/1.11/ref/django-admin/#cmdoption-migrate-fake" rel="noreferrer">documentation</a> where it states that:</p>
  
  <p><strong>--fake</strong></p>
  
  <blockquote>
    <p>Tells Django to mark the migrations as having been applied or
    unapplied, but without actually running the SQL to change your
    database schema.</p>
    
    <p>This is intended for advanced users to manipulate the current
    migration state directly if they’re manually applying changes; be
    warned that using --fake runs the risk of putting the migration state
    table into a state where manual recovery will be needed to make
    migrations run correctly.</p>
  </blockquote>
  
  <p><strong>--fake-initial</strong></p>
  
  <blockquote>
    <p>Allows Django to skip an app’s initial migration if all database
    tables with the names of all models created by all CreateModel
    operations in that migration already exist. This option is intended
    for use when first running migrations against a database that
    preexisted the use of migrations. This option does not, however, check
    for matching database schema beyond matching table names and so is
    only safe to use if you are confident that your existing schema
    matches what is recorded in your initial migration.</p>
  </blockquote>
  
  <p>I get the general idea and why one would want to use this feature. But, I don't understand the part where it says that this is <em><strong>intended for advanced users only.</strong></em></p>
  
  <p>Can someone explain what is happening behind the scene and why manual recovery would be needed. </p>
  
  <p><strong>NOTE</strong>  </p>
  
  <p>I'm not looking for the exact raw SQL queries that runs when faking a migration. I'm only looking for a general idea of what is happening behind the scene and maybe an example of why faking a migration
   would result in a state where <code>makemigrations</code> would not be working correctly.</p>