Skip to end of metadata
Go to start of metadata

Общие понятия

Большую, если не всю, работу с git вы скорее всего будете производить из IDE либо из GUI-клиента, но без знания общих понятий все равно не обойтись.

Для начала немного теории. Файлы в рабочем каталоге могут быть в четырёх состояниях:

  • неотслеживаемые (untracked)
  • немодифицированные с последнего коммита (unmodified)
  • модифицированные (modified)
  • файлы в git-индексе (staged)

Git-индекс это своеобразный слепок изменений в конкретный момент времени подлежащий фиксации (commit).

Неотслеживаемые (untraked) - файлы которые еще не находятся под контролем версий, то есть, если мы добавили новый файл в рабочий проект, он находится в состоянии untracked.

Hемодифицированные с последнего коммита (unmodified) - файлы, которые уже находятся под контролем версий и которые не были изменены со времен последней фиксации (commit).

Модифицированные (modified) - файлы, находящиеся под контролем версий и в которые были внесены изменения со времен последней фиксации.

Файлы в git-индексе - могут быть новые либо модифицированные (modified) файлы, которые были добавлены в git-индекс посредством команды:

git add

Также это могут быть удаленные файлы через git rm или переименованные (перемещенные файлы) через команду:

git mv

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

Игнорирование файлов

Игнорирование файлов производится с помощью файла .gitignore.Файл может быть размещен в любой поддиректории проекта, при небольшом количестве правил игнорирования, обычно размещают его в корне проекта.

.gitignore может выглядеть так:

/.idea # игнорируем директорию .idea (если такая директория будет на другом уровне вложенности, то на нее это правило не распространяется)
logs # игнорируем любую директорию в проекте с именем logs
*.ipr # игнорируем все файлы с расширением .ipr
/images/*.xcf # игнорируем все файлы с расширением .xcf в директории /images

Замечу, что есть важная особенность - если нужно, чтобы файлы, например, в директории logs игнорировались, но сама директория оставалась (когда вы будете делать git clone), то нужно добавить в директорию logs файл с именем empty (имя может быть любое) и добавить в .gitignore такую запись:

logs/*

!empty

!%PATTERN% позволяет отменить правило игнорирования для файлов подходящих под %PATTERN%, то есть буквально это можно воспринимать так: "игнорировать все файлы в директории logs, отменить игнорирование для файла с именем empty".

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

Более подробная информация по синтаксису файла .gitignore смотрите в git help gitignore

Добавление и редактирование файлов

Для того, чтобы добавить файл в git-индекс (под этот случай подходят как добавление нового файла, так и фиксация изменений в файлах со статусом modified), нужно использовать команду git add:

git add . # рекурсивно добавляет все файлы в git-индекс начиная от текущего каталога
git add README # добавляет файл README в git-индекс
git add images/*.png # добавляет все файлы находящиеся в директории images с расширением .png

Здесь также есть одна важная особенность, когда вы добавите файл в git-индекс, git запомнит их состояние и в коммит пойдет именно эта версия файла. Например, вы изменили файл README, выполнили git add README, после чего вспомнили, что забыли исправить какую-либо ошибку в этом файле и исправили её. Самое время делать коммит, но если сделать его сейчас, то в коммит уйдет та версия файла, которая была добавлена в git-индекс ранее, неисправленная (интересно посмотреть на git status для этого файла, он одновременно будет в статусе modified и staged). Другими словами, при фиксации изменений (commit) учитываются только те изменения, которые есть в git-индексе.

Удаление и перемещение файлов

Для удаления файлов из-под контроля версий используется команда git rm

Если использовать такой синтаксис:

git rm README

то файл будет удален как из-под git так и из директории, чтобы этого избежать (то есть удалить файл только из-под контроля версий и оставить в каталоге), нужно использовать такой синтаксис:

git rm --cached README

Если же файл находится в статусе modified, то для его удаления следует использовать ключ -f:

git rm -f README

Для перемещения файлов, используйте команду git mv:

 git mv README README

в этом случае git status покажет файл в статусе renamed, остается только зафиксировать изменения.

Фиксация изменений (commit)

Чтобы зафиксировать изменения, достаточно ввести команду git commit. Будет открыт либо текстовый редактор, который зарегистрирован в системе по умолчанию, либо редактор указанный вами в конфигурационной переменной core.editor. В нём будет открыт закомментированный результат работы команды git status (закомментированные данные в commit message не пойдут).
Напишите сопроводительное сообщение (commit message), сохраните файл и закройте редактор, после чего будет сделана фиксация изменений. Если же закрыть редактор без сохранения изменений, фиксация сделана не будет.

Если commit message небольшой, то есть более короткий способ сделать фиксацию:

git commit -m 'your commit message'

Эта команда сделает фиксацию сразу, без открытия редактора.

Напоминаю, что при фиксации изменений, в коммит пойдут только те изменения, которые были добавлены в git-индекс, потому рекомендую, перед git commit внимательно просматривать вывод команды git status. Впрочем, если вы сделали коммит, и сразу после этого вспомнили, что забыли, например, добавить файл, то из этой ситуации есть выход. Добавьте нужный файл, и после выполните git commit с параметром --amend:

git commit --ammend

вернутся к: Основы работы с Git