Рабочий каталог Git, область подготовки и репозиторий


Основные концепции

Сначала разберёмся с понятиями рабочего каталога Git, области подготовки и репозитория:

  • Рабочая область:Это каталог, который вы видите на своём компьютере.
  • Область подготовки:По-английски она называется «stage» или «index». Обычно она хранится в.gitОна содержится в индексном файле (.git/index) в каталоге, поэтому иногда мы также называем область подготовки индексом.
  • Хранилище версий:В рабочей области есть скрытый каталог.git, который не является рабочим каталогом, а представляет собой репозиторий Git.

Следующая диаграмма иллюстрирует взаимосвязь между рабочим каталогом, областью подготовки в репозитории и репозиторием:

  • На рисунке слева расположен рабочий каталог, а справа — репозиторий. В репозитории область, помеченная «index», — это область подготовки (stage/index), а область, помеченная «master», — это дерево каталогов, представленное веткой master.

  • Из диаграммы видно, что «HEAD» на самом деле является «курсором», указывающим на ветку master. Поэтому везде, где HEAD встречается в командах, показанных на диаграмме, его можно заменить на master.

  • Область, помеченная «objects» на рисунке, — это база объектов Git, которая фактически расположена в каталоге «.git/objects» и содержит различные объекты и созданное содержимое.

  • При выполнении команды для файлов, которые были изменены (или добавлены) в рабочем каталоге,git addпри запуске этой команды дерево каталогов области подготовки обновляется, а содержимое изменённых (или недавно добавленных) файлов в рабочем каталоге записывается в новый объект в базе объектов, при этом ID этого объекта записывается в файловый индекс области подготовки.

  • Когда выполняется операция коммита (git commit), дерево каталогов области подготовки записывается в репозиторий (базу объектов), и ветка master соответствующим образом обновляется. То есть дерево каталогов, на которое указывает master, — это дерево каталогов области подготовки на момент коммита.

  • При выполненииgit reset HEADпри запуске этой команды дерево каталогов области подготовки перезаписывается и заменяется деревом каталогов, на которое указывает ветка master, но рабочий каталог не затрагивается.

  • При выполненииgit rm --cached <file>, команда напрямую удаляет файлы из области подготовки, при этом рабочий каталог остаётся неизменным.

  • При выполненииgit checkout .илиgit checkout -- <file>, команда заменит файлы в рабочем каталоге всеми или указанными файлами из области подготовленных файлов. Эта операция очень опасна, так как она очистит изменения в рабочем каталоге, которые не были добавлены в область подготовленных файлов.

  • При выполненииgit checkout HEAD .илиgit checkout HEAD <file>, команда заменит файлы как в области подготовленных файлов, так и в рабочем каталоге всеми или некоторыми файлами из ветки master, на которую указывает HEAD. Эта команда также чрезвычайно опасна, потому что она очистит не только незакоммиченные изменения в рабочем каталоге, но и незакоммиченные изменения в области подготовленных файлов.

1. Рабочий каталог

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

Возможности:

  • Отображает текущее состояние проекта.
  • Изменения файлов вносятся в рабочем каталоге, но эти изменения ещё не записаны в системе контроля версий.

2. Область подготовленных файлов

Область подготовленных файлов — это временная область хранения, содержащая снимки файлов, которые вот-вот будут закоммичены в репозиторий. Перед коммитом вы можете выборочно добавлять изменения из рабочего каталога в область подготовленных файлов.

Возможности:

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

Основные команды:

git add filename       # 将单个文件添加到暂存区
git add .              # 将工作区中的所有修改添加到暂存区
git status             # 查看哪些文件在暂存区中

3. Репозиторий

Репозиторий содержит полную историю версий проекта.

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

Возможности:

  • Репозиторий делится на локальный репозиторий и удалённый репозиторий. Здесь в основном имеется в виду локальный репозиторий.
  • Локальный репозиторий хранится в.gitкаталоге, который содержит все зафиксированные объекты и ссылки.

Основные команды:

git commit -m "Commit message"   # 将暂存区的更改提交到本地版本库
git log                          # 查看提交历史
git diff                         # 查看工作区和暂存区之间的差异
git diff --cached                # 查看暂存区和最后一次提交之间的差异

Связь между рабочим каталогом, областью подготовки и репозиторием

1. Рабочий каталог -> Область подготовки

Используйте команду git add, чтобы добавить изменения из рабочего каталога в область подготовки.

git add filename

2. Область подготовки -> Репозиторий

Используйте команду git commit, чтобы зафиксировать изменения из области подготовки в репозиторий.

git commit -m "Commit message"

3. Репозиторий -> Удалённый репозиторий

Используйте команду git push, чтобы отправить коммиты из локального репозитория в удалённый репозиторий.

git push origin branch-name

4. Удалённый репозиторий -> Локальный репозиторий

Используйте команду git pull или git fetch, чтобы получить обновления из удалённого репозитория.

git pull origin branch-name
# 或者
git fetch origin branch-name
git merge origin/branch-name

Пример

Предположим, вы изменили файл file.txt в рабочем каталоге:

1. Рабочая область

Измените file.txt и сохраните.

2. Область подготовительных изменений

Добавьте изменения в область подготовительных изменений:

git add file.txt

3. Репозиторий

Зафиксируйте изменения из области подготовительных изменений в локальном репозитории:

git commit -m "Update file.txt"

4. Удалённый репозиторий

Отправьте локальные коммиты в удалённый репозиторий:

git push origin main

Понимая роли рабочего каталога, области подготовительных изменений и репозитория, а также их взаимосвязи, вы сможете эффективнее использовать Git для контроля версий и совместной разработки.

Другие расширения