You should think of migrations as a version control system for your database schema. makemigrations is responsible for packaging up your model changes into individual migration files - analogous to commits - and migrate is responsible for applying those to your database.
The migration files for each app live in a “migrations” directory inside of that app, and are designed to be committed to, and distributed as part of, its codebase. You should be making them once on your development machine and then running the same migrations on your colleagues’ machines, your staging machines, and eventually your production machines.
schema migrations (automatic)
data migrations (created manually)
Migration files
how do migrations work ?
https://docs.djangoproject.com/en/1.8/ref/django-admin/#makemigrations-app-label
migrate / makemigration commands
Why keep migrations in vcs ?
(examples)
common problem scenarios
The End