Содержание

Что такое Git

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

Полезные ссылки

Основные особенности Git

Структура Git

Когда вы инициализируете репозиторий Git (git init), создаётся скрытая папка .git, в которой Git хранит всю информацию о вашем проекте.

При создании нового репозитория командой git init создаётся основная ветка master по умолчанию и на её указывает ссылка HEAD . Просмотр списка существующих веток репозитория и текущей ветки осуществляется командой git branch , ключ -a позволяет увидеть все ветки включая ссылки на ветки удалённого репозитория.

С недавнего времени ветка по умолчанию получила имя main . Далее мы будем использовать название main .

Общая структура

Содержимое каталога .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).

2. git commit

Фиксирует изменения из staging area в локальном репозитории.

3. git push

Отправляет локальные коммиты в удалённый репозиторий (например, GitHub).

Упрощённая схема

Этап Состояние файлов Команда
✏️ Работа над проектом 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 на 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 -T git@gitlab.com    

Пример добавления удалённого репозитория:

<code>  git remote add origin git@gitlab.com:user/project.git  </code>

3. Настройка прав доступа через Gitolite

Для централизованного контроля используйте Gitolite:

    repo project1
        RW+     = admin
        R       = devs
    

4. Подпись коммитов GPG

Для подтверждения авторства коммитов:

    gpg --full-generate-key
    
    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. Изоляция репозиториев

Для повышения безопасности: