Что такое Git
Git — это распределённая система контроля версий, применяемая для отслеживания и управления изменениями в коде программ. Git особенно популярен в командной разработке, обеспечивая эффективную работу над проектами любого масштаба.
Полезные ссылки
Основные особенности Git
- 📜 История изменений — возможность вернуться к любому предыдущему состоянию проекта.
- 🌿 Ветвление (branches) — независимая работа над функциональностью с возможностью последующего слияния.
- 🗂 Распределённая архитектура — у каждого пользователя своя полная копия репозитория.
- ⚡ Высокая производительность — Git быстро обрабатывает операции даже в больших проектах.
- 🤝 Удобная совместная работа — интеграция с GitHub, GitLab и другими сервисами.
Структура Git
Когда вы инициализируете репозиторий Git (git init), создаётся скрытая папка .git, в которой Git хранит всю информацию о вашем проекте.
При создании нового репозитория командой git init создаётся основная ветка master по умолчанию и на её указывает ссылка HEAD . Просмотр списка существующих веток репозитория и текущей ветки осуществляется командой git branch , ключ -a позволяет увидеть все ветки включая ссылки на ветки удалённого репозитория.
С недавнего времени ветка по умолчанию получила имя main . Далее мы будем использовать название main .
Общая структура
- Рабочий каталог (Working Directory) — файлы проекта, с которыми вы работаете.
- Индекс (Staging Area) — промежуточная область, где готовятся изменения для коммита.
- Репозиторий (Repository) — база всех зафиксированных изменений (коммитов), хранящаяся в `.git`.
Содержимое каталога .git
Элемент | Назначение |
---|---|
.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
Последовательность работы с Git
1. git add
Добавляет изменения из рабочей директории в стейджинг-область (staging area).
- Пример: git add index.html
2. git commit
Фиксирует изменения из staging area в локальном репозитории.
- Пример: git commit -m "Добавлен новый раздел"
3. git push
Отправляет локальные коммиты в удалённый репозиторий (например, GitHub).
- Пример: git push origin main
Упрощённая схема
Этап | Состояние файлов | Команда |
---|---|---|
✏️ Работа над проектом | Working Directory | (редактирование файлов) |
➕ Подготовка | Staging Area | `git add` |
✅ Фиксация | Repository (.git/objects) | `git commit` |
☁️ Публикация | Удалённый репозиторий (origin) | `git push` |
Статусы файлов в Git
Команда git status показывает состояние файлов в репозитории. Ниже представлены основные статусы, которые могут быть у файлов:
Статус | Описание |
---|---|
Untracked | Файл не отслеживается Git. Он существует в рабочем каталоге, но не был добавлен в индекс (git add). |
Tracked | Файл отслеживается Git и может находиться в одном из следующих состояний: |
↳ Unmodified | Файл не изменён после последнего коммита. |
↳ Modified | Файл изменён, но изменения ещё не были добавлены в индекс (git add). |
↳ Staged | Файл подготовлен к коммиту — изменения добавлены в staging area. |
Deleted | Файл был удалён из рабочей директории. Git покажет его как удалённый. |
Renamed | Файл был переименован — Git это отслеживает. |
Conflicted | Возник конфликт при слиянии веток, и файл требует ручного разрешения. |
Быстрые команды для проверки
- git status — показывает текущее состояние всех файлов.
- git diff — показывает, что изменилось, но ещё не добавлено в staging.
- git diff –staged — показывает изменения, уже добавленные в staging.
- git ls-files –stage — просмотр состояния индекса.
Примечание
- Только файлы со статусом Staged попадут в следующий коммит.
- Untracked файлы можно игнорировать с помощью `.gitignore`.
Советы
- Проверяйте git status перед каждым коммитом.
- Используйте осмысленные комментарии к коммитам.
- Не забывайте про git pull перед git push, чтобы избежать конфликтов.
- Коммитьте часто, чтобы не потерять изменения.
- Используйте .gitignore, чтобы исключать лишние файлы.
Безопасность Git на Linux
1. Файловая безопасность
По умолчанию Git хранит все данные в каталоге `.git`. Чтобы ограничить доступ:
- Установите владельца и группу:
chown -R myuser:mygroup /path/to/repo
- Задайте права доступа:
chmod -R 700 /path/to/repo
Это исключит доступ других пользователей к данным репозитория.
2. Доступ через SSH
Для подключения к удалённому репозиторию (например, GitLab или GitHub) настройте SSH:
- Сгенерируйте ключи:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
- Добавьте содержимое `~/.ssh/id_rsa.pub` в профиль на Git-сервере.
- Проверьте соединение:
ssh -T git@gitlab.com
Пример добавления удалённого репозитория:
<code> git remote add origin git@gitlab.com:user/project.git </code>
3. Настройка прав доступа через Gitolite
Для централизованного контроля используйте Gitolite:
- Установите Gitolite на сервер.
- Добавьте публичные ключи пользователей.
- Настройте `conf/gitolite.conf`:
repo project1 RW+ = admin R = devs
4. Подпись коммитов GPG
Для подтверждения авторства коммитов:
- Сгенерируйте GPG-ключ:
gpg --full-generate-key
- Добавьте ключ в Git:
git config --global user.signingkey ABC1234 git config --global commit.gpgsign true
- Делайте подписанные коммиты:
git commit -S -m "Безопасный коммит"
5. Проверка на сервере через хуки
Можно настроить серверный 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
6. Изоляция репозиториев
Для повышения безопасности:
- Используйте отдельные учётные записи Linux.
- Применяйте chroot или jail.
- Убедитесь, что доступ к серверу ограничен по IP и через брандмауэр.