Какая разница между .gitkeep и .gitignore

Пустой файл .gitkeep необходим в случае если необходимо добавить в git пустую директорию (по другому просто не получится —  git это не позволяет)
Причем подойдет любой файл с любым расширением. Просто .gitkeep это общепринятое соглашение о наименовании, а не git фича.
Файл .gitignore позволяет задать исключения для репозитория.
Его как привило размещают в корне проекта.
Каждая строка этого файла должна содержать путь или маску для файлов и директорий которые следует исключить из репозитория.
Эти правила однако не будут работать для уже добавленных в репозиторий объектов
В этом случае такие объекты необходимо вначале удалить из git:
git rm —cached path/to/file
Если необходимо с одной стороны добавить в git папку, но исключить из нее все содержимое,
то сделать это возможно добавив в нее файл .gitignore со следующим содержимым:
*
!.gitignore