> For the complete documentation index, see [llms.txt](https://strctr.gitbook.io/programming/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://strctr.gitbook.io/programming/02-tools/git/04-git-file-types.md).

# 04. Git File Types

После создания репозитория git начинает отслеживать файлы находящиеся в текущем каталоге. Каждый файл в вашем рабочем каталоге может находиться в одном из двух состояний: **отслеживаемый git** (`tracked`) и **неотслеживаемый git** (`untracked`).

Когда вы впервые клонируете репозиторий, все файлы будут отслеживаемыми и неизменёнными.

### Tracked files

**Отслеживаемые файлы** — это те файлы, (1) которые или были уже ранее добавлены в git или (2) git-у указано их отслеживать, т.к. они войдут в следующий коммит. Исходя из этого, все отслеживаемые файлы делятся на:

* `unmodified` - не изменился c момента предыдущего коммита;
* `modified` - изменился, но еще не добавлен в выборку для коммита;
* `staged` - изменился или новый файл и был добавлен в выборку для коммита при помощи `git add`.

Все файлы, отобранные для следующего коммита, находятся в индексе или на **сцене** (`staging area`). Ранее индекс назывался кэшем, поскольку сцена кэширует файлы, которые войдут в следующий коммит.

**Рабочей директорией** (`working directory`) называется текущая версия файлов с которой вы работаете (current checkout).&#x20;

Команда `git status` покажет все изменения в текущей рабочей директории. Предыдущий коммит хранит слепок прошлого состояния рабочей директории (`history`).

![](https://1356653101-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M5bu9Zoywb01ca-XJjd%2F-M6fqwLgc61kvMydwlRF%2F-M6ft-E60lrIT7ezbMNO%2Fimage.png?alt=media\&token=d6ac4f4b-3002-4c59-b948-d3d6c1d6482d)

### Untracked files

**Неотслеживаемые файлы** — это любые файлы в вашем рабочем каталоге, которые не входили в ваш последний слепок состояния и не подготовлены к коммиту.

* Созданные файлы
* Сгенерированные файлы

### Git file operations

Рабочая модель гит имеет следующий вид:

* Гит отслеживает все файлы в рабочей директории, а история коммитов представляет историю её изменений.
* Рабочая директория содержит текущую версию файлов.
* Сцена представляет собой выборку файлов которые войдут в следующий коммит.

![](https://1356653101-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M5bu9Zoywb01ca-XJjd%2F-M6fqwLgc61kvMydwlRF%2F-M6ft50nOdjr1SE65zkj%2Fimage.png?alt=media\&token=d0166985-74ec-4692-b61a-2998422b737d)

Следующие команды предназначены для копирования файлов между рабочей директорией, сценой и историей, представленной в форме коммитов:

```bash
# from working directory to staging area
git add <files>
git commit -a

## from staging area to commit
git commit

## from staging area to working directory
git reset -- <files> # copy files from previous commit to stage
git reset # drop all files from staging area
git reset HEAD <files> # drop files from index to changed

git checkout -- file # to discard changes in working directory
git checkout <branch> -- <filename> # checkout single file from different branch
```

![](https://1356653101-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M5bu9Zoywb01ca-XJjd%2F-M6fqwLgc61kvMydwlRF%2F-M6ft92cfi0eiIaTR33Y%2Fimage.png?alt=media\&token=56098580-c4e1-460b-ba68-f45b01f7deef)

Вы можете использовать `git reset -p`, `git checkout -p`, и `git add -p` вместо имён файлов или вместе с ними, чтобы в интерактивном режиме выбирать, какие именно изменения будут скопированы.

### Removing

For removing files from your tree, you can simply run: `git rm <filename>`. This will remove that file from the index (and thus from the next commit) as well as from your working directory.&#x20;

Команда `rm` удаляет файл физически но не индексирует это изменение. Удаление файла нужно подтвердить `git add .`.

Удаление файла только из индекса (физически он остается в директории):

```bash
git rm --cached path/to/file
```

### Move file

```bash
git mv from to
```
