Git — это распределённая система контроля версий, применяемая для отслеживания и управления изменениями в коде программ. Git особенно популярен в командной разработке, обеспечивая эффективную работу над проектами любого масштаба.
Когда вы инициализируете репозиторий Git (git init), создаётся скрытая папка .git, в которой Git хранит всю информацию о вашем проекте.
При создании нового репозитория командой git init создаётся основная ветка master по умолчанию и на её указывает ссылка HEAD . Просмотр списка существующих веток репозитория и текущей ветки осуществляется командой git branch , ключ -a позволяет увидеть все ветки включая ссылки на ветки удалённого репозитория.
С недавнего времени ветка по умолчанию получила имя main . Далее мы будем использовать название main .
Элемент | Назначение |
---|---|
.git/config | Локальные настройки репозитория |
.git/HEAD | Указатель на текущую ветку |
.git/index | Индекс: промежуточная зона для подготовки коммита |
.git/description | Описание репозитория (используется в bare-репо) |
.git/hooks/ | Скрипты-хуки, выполняемые при определённых действиях (например, `pre-commit`) |
.git/info/ | Дополнительная информация, например `.git/info/exclude` — локальный `.gitignore</color> |
.git/objects/ | База всех Git-объектов: коммиты, деревья, блобы |
.git/objects/pack/ | Упакованные (сжатые) объекты для оптимизации хранения |
.git/refs/heads/ | Локальные ветки |
.git/refs/remotes/ | Ветки, отслеживаемые с удалённых репозиториев |
.git/refs/tags/ | Теги |
.git/logs/ | Логи перемещений HEAD и других ссылок |
Состояние | Описание |
---|---|
Working Directory | Текущие файлы проекта на диске |
Staging Area | Подготовленные к коммиту изменения |
Repository | Постоянно сохранённые изменения (история коммитов) |
Команда | Назначение |
---|---|
git init | Инициализировать новый локальный репозиторий |
git status | Проверить статус изменений в рабочем каталоге |
git add <файл> | Добавить файл в индекс (staging area) |
git commit -m "сообщение" | Зафиксировать изменения с сообщением. До commit нужно указать файл, в котором были изменения. |
git commit --amend -m " change commit message " | Изменяем commit сообщение |
git log -n 5 --pretty oneline | Просмотреть историю коммитов |
git diff | Посмотреть отличия между версиями файлов |
git branch | Просмотреть список веток |
git branch <имя> | Создать новую ветку |
git checkout <ветка> | Переключиться на указанную ветку. git checkout main, затем git merge fix 1276 |
git merge <ветка> | Слить указанную ветку с текущей |
git pull | Получить изменения из удалённого репозитория и слить с текущей веткой |
git push | Отправить изменения в удалённый репозиторий |
git revert | Позволяет отменить изменения от указанного коммита. |
git reset <идентификатор коммита> | Позволяет удалить из истории коммиты после указанного коммита, если указать ключ --hard, то удаление будет полным |
git stash | Временно сохранить изменения без коммита |
git tag | Просмотреть список тегов или создать тег для коммита |
Команда | Назначение |
---|---|
git clone <url> | Клонировать удалённый репозиторий |
Команда | Назначение |
---|---|
git remote -v | Показать подключённые удалённые репозитории |
git remote add local_gitlab https://gitlab.local.com/infra/har.git
Добавляет изменения из рабочей директории в стейджинг-область (staging area).
Фиксирует изменения из staging area в локальном репозитории.
Отправляет локальные коммиты в удалённый репозиторий (например, GitHub).
Этап | Состояние файлов | Команда |
---|---|---|
✏️ Работа над проектом | Working Directory | (редактирование файлов) |
➕ Подготовка | Staging Area | `git add` |
✅ Фиксация | Repository (.git/objects) | `git commit` |
☁️ Публикация | Удалённый репозиторий (origin) | `git push` |
Команда git status показывает состояние файлов в репозитории. Ниже представлены основные статусы, которые могут быть у файлов:
Статус | Описание |
---|---|
Untracked | Файл не отслеживается Git. Он существует в рабочем каталоге, но не был добавлен в индекс (git add). |
Tracked | Файл отслеживается Git и может находиться в одном из следующих состояний: |
↳ Unmodified | Файл не изменён после последнего коммита. |
↳ Modified | Файл изменён, но изменения ещё не были добавлены в индекс (git add). |
↳ Staged | Файл подготовлен к коммиту — изменения добавлены в staging area. |
Deleted | Файл был удалён из рабочей директории. Git покажет его как удалённый. |
Renamed | Файл был переименован — Git это отслеживает. |
Conflicted | Возник конфликт при слиянии веток, и файл требует ручного разрешения. |
По умолчанию Git хранит все данные в каталоге `.git`. Чтобы ограничить доступ:
chown -R myuser:mygroup /path/to/repo
chmod -R 700 /path/to/repo
Это исключит доступ других пользователей к данным репозитория.
Для подключения к удалённому репозиторию (например, GitLab или GitHub) настройте SSH:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
ssh -T git@gitlab.com
Пример добавления удалённого репозитория:
<code> git remote add origin git@gitlab.com:user/project.git </code>
Для централизованного контроля используйте Gitolite:
repo project1 RW+ = admin R = devs
Для подтверждения авторства коммитов:
gpg --full-generate-key
git config --global user.signingkey ABC1234 git config --global commit.gpgsign true
git commit -S -m "Безопасный коммит"
Можно настроить серверный Git-хук `pre-receive`:
#!/bin/bash while read oldrev newrev refname; do # запрет на пуш без GPG-подписи if ! git log $oldrev..$newrev --pretty=format:%G? | grep -q 'G'; then echo "Коммиты должны быть подписаны GPG!" exit 1 fi done
Для повышения безопасности: