Я не знаю ни одного проекта, в рабочей директории которого не появлялось бы таких файлов, которые не нужно игнорировать. Зачастую, у вас имеется группа файлов, которые вы не только не хотите автоматически добавлять в репозиторий, но и видеть в списках неотслеживаемых (а чем взрослее проект, тем больше таких файлов может быть). К таким файлам обычно относятся автоматически генерируемые файлы (различные логи, результаты сборки программ и т.п.).

Вы можете создать файл .gitignore с перечислением шаблонов соответствующих таким файлам. Хорошая практика заключается в настройке файла .gitignore до того, как начать серьёзно работать, это защитит вас от случайного добавления в репозиторий файлов, которых вы там видеть не хотите.

Вот пример файла .gitignore для типового Rails приложения:

cat .gitignore

*.rbc
capybara-*.html
.rspec
/log
/tmp
/db/*.sqlite3
/public/system
/coverage/
/spec/tmp
**.orig
rerun.txt
pickle-email-*.html

# TODO Comment out these rules if you are OK with secrets being uploaded to the repo
config/initializers/secret_token.rb
config/secrets.yml

## Environment normalisation:
/.bundle
/vendor/bundle

# these should all be checked in to normalise the environment:
# Gemfile.lock, .ruby-version, .ruby-gemset

# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
.rvmrc

Давайте повнимательнее рассмотрим этот файл: В первой строке написано, что необходимо игнорировать все файлы, которые заканчиваются на .rbc, в четвертой, что необходимо игнорировать директорию log, в шестой - все файлы конфигураций баз данных sqlite3. Сразу видно, что для большинства правил используются некоторые шаблоны. Но можно указывать и полный путь до конкретного файла, как сделано в 15 и 16 строках. Git всегда мягко применяет эти правила. Если вы указали, что необходимо игнорировать просто строку test - то он будет игнорировать и директории (вместе со вложенными файлами) и файлы, которые называются test, вне зависимости, где они располагаются. Если вы хотите ограничиться только корневым уровнем в репозитории - необходимо явно это указать поставив “/” перед шаблоном.
К шаблонам в файле .gitignore применяются следующие правила:

• Пустые строки, а также строки, начинающиеся с #, игнорируются.
• Можно использовать стандартные glob шаблоны.
• Можно заканчивать шаблон символом слэша (/) для указания каталога.
• Можно инвертировать шаблон, использовав восклицательный знак (!) в качестве первого символа.
Glob-шаблоны представляют собой упрощённые регулярные выражения используемые командными интерпретаторами. Символ * соответствует 0 или более символам; последовательность [abc] — любому символу из указанных в скобках (в данном примере a, b или c); знак вопроса (?) соответствует одному символу; [0-9] соответствует любому символу из интервала (в данном случае от 0 до 9). Вот ещё один пример файла .gitignore:
# комментарий — эта строка игнорируется
# не обрабатывать файлы, имя которых заканчивается на .a
*.a
# НО отслеживать файл lib.a, несмотря на то, что мы игнорируем все .a файлы с помощью предыдущего правила
!lib.a
# игнорировать только файл TODO находящийся в корневом каталоге, не относится к файлам вида subdir/TODO
/TODO
# игнорировать все файлы в каталоге build/
build/
# игнорировать doc/notes.txt, но не doc/server/arch.txt
doc/*.txt
# игнорировать все .txt файлы в каталоге doc/
doc/**/*.txt
Шаблон **/ доступен в Git, начиная с версии 1.8.2.
Временно игнорировать изменения в файле можно командой:
git update-index --assume-unchanged <file>
Отключается командой:
git update-index --no-assume-unchanged <file>
Если файл попал в индекс и нужно убрать его из индекса:
git rm --cached path/to/file
Однако, стоит быть осторожнее с командой git rm.
Однако, стоит обратить внимание на то, что файл .gitignore не решение от всех проблем. То есть он проблему то решает, но не стоит его всегда использовать. Иногда встречаю в файле .gitignore то, чего там быть никак не должно. Давайте представим такую ситуацию: Я и вы работаем в одной команде над одним проектом. Я в своей работе использую vim, а вы, например, IDE от JetBrains. У меня временные файлы создаются в специальном каталоге в профиле пользователя, тем самым в директории проекта я никак не создаю временных файлов при редактировании проекта. У вас же в проекте создается директория .idea, в которой лежат конфиги вашей IDE для этого проекта. Это часть вашего рабочего окружения и она никаким боком не относится к проекту и репозиторию. По идее, вы можете добавить строчку /.idea в файл .gitignore в проекте, однако, если над проектом работает несколько человек и каждый из них добавит конфиги своего окружения в .gitignore, то он превратится в нечитаемую помойку.
Что делать и как быть? Есть несколько разных способов игнорирования файлов в git.

.gitignore

# https://github.com/github/gitignore
# build - files generate with tools for static PHP code analyses
build
## generic files to ignore
*~
*.lock
*.DS_Store
*.swp
*.out
##
# composer 
##
composer.phar
#composer.lock
##
# components, libraries, etc
##
vendor
##
# Symfon2 - https://github.com/github/gitignore/blob/master/Symfony2.gitignore
##
# Bootstrap
app/bootstrap*
# Symfony directories
vendor/*
*/logs/*
*/cache/*
web/uploads/*
web/bundles/*
# Configuration files
app/config/parameters.ini
app/config/parameters.yml
##
# Netbeans
##
nbproject
##
# Eclipse - https://github.com/github/gitignore/blob/master/Global/Eclipse.gitignore
##
*.pydevproject
.project
.metadata
bin/**
tmp/**
tmp/**/*
*.tmp
*.bak
*.swp
*~.nib
local.properties
.classpath
.settings/
.loadpath
# External tool builders
.externalToolBuilders/
# Locally stored "Eclipse launch configurations"
*.launch

# CDT-specific
.cproject

# PDT-specific
.buildpath
##### Windows
# Windows thumbnail cache files
Thumbs.db
Thumbs.db:encryptable
ehthumbs.db
ehthumbs_vista.db

# Dump file
*.stackdump

# Folder config file
[Dd]esktop.ini

# Recycle Bin used on file shares
$RECYCLE.BIN/

# Windows Installer files
*.cab
*.msi
*.msix
*.msm
*.msp

# Windows shortcuts
*.lnk

##### Linux
*~

# temporary files which can be created if a process still has a handle open of a deleted file
.fuse_hidden*

# KDE directory preferences
.directory

# Linux trash folder which might appear on any partition or disk
.Trash-*

# .nfs files are created when an open file is removed but is still being accessed
.nfs*

##### Backup
*.bak
*.gho
*.ori
*.orig
*.tmp

##### Dropbox
# Dropbox settings and caches
.dropbox
.dropbox.attr
.dropbox.cache

# Log file - the following switch allows to specify the file that will be
# used to write all messages from simulation: -l <filename>
*.log

##### PuTTY
# Private key
*.ppk

##### Notepad++
# Notepad++ backups #
*.bak

##### VisualStudioCode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace

# Local History for Visual Studio Code
.history/

# Mongo Explorer plugin
.idea/**/mongoSettings.xml