Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос нашим менторам. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Рабочий процесс

Перед тем как погружаться в детали, пройдём поверхностно весь путь от создания проекта в git до начала отслеживания изменений. Затем, в следующих уроках поговорим подробнее про все этапы. В процессе изучим большое количество новых терминов и команд, которые нужны для понимания работы git.

Рабочий процесс

Git может отслеживать файлы проекта только в том случае, когда он помещён под контроль версий. Для этого нужно зайти в директорию проекта и выполнить команду инициализации git init. Проект может быть как новый, так и уже существующий. Процесс инициализации от этого не поменяется.

# Создаем новый проект
$ mkdir hexlet-git
$ cd hexlet-git
# Выполняем инициализацию
hexlet-git$ git init
Initialized empty Git repository in /private/tmp/hexlet-git/.git/

Команда git init создает репозиторий — директорию .git, которая содержит все необходимые для работы git файлы.

С помощью команды git status можно посмотреть статус репозитория:

hexlet-git$ git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)

В этом выводе указано, что репозиторий пустой (No commits yet) и в него нечего добавить, так как нет новых или изменённых файлов. Давайте попробуем добавить несколько файлов:

# Создаем файл README.md со строкой текста
hexlet-git$ echo 'Hello, Hexlet!' > README.md
hexlet-git$ echo 'Haskell Carry' > PEOPLE.md

Теперь снова смотрим на статус:

hexlet-git$ git status
# Часть вывода убрана
Untracked files:
  (use "git add <file>..." to include in what will be committed)
    PEOPLE.md
    README.md

Git увидел, что в проекте появились новые файлы, о которых ему ничего не известно. Они помечаются как неотслеживаемые (untracked files). Git не следит за изменениями в таких файлах, так как они не добавлены в репозиторий. Добавление в репозиторий происходит в два шага. Первым шагом выполняется команда подготовки файлов git add <путь до файла>:

# Для каждого нового или измененного файла
hexlet-git$ git add README.md

Смотрим что произошло:

hexlet-git$ git status

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
    new file:   README.md

Untracked files:
  (use "git add <file>..." to include in what will be committed)
    PEOPLE.md

Файл README.md теперь находится в состоянии "готов к фиксации изменений" или, другими словами, файлы попадают в индекс. Под фиксацией понимается окончательное добавление в репозиторий, когда git запоминает файл навсегда и следит за всеми последующими изменениями.

Все изменения, готовые к фиксации, попадают в репозиторий с помощью коммита. Коммит — это операция, которая берёт все подготовленные изменения (они могут включать любое количество файлов) и отправляет их в репозиторий как единое целое. Вот как он выполняется:

# -m — означает message, то есть описание коммита
# Коммит можно выполнять и без флага -m
# Но тогда откроется редактор, в котором нужно будет ввести описание коммита
hexlet-git$ git commit -m 'add README.md'
hexlet-git$ [master (root-commit) 3c5d976] add README.md
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

Может возникнуть вопрос: зачем так сложно, зачем отдельно нужен индекс (куда попадают файлы после git add), а не добавлять все изменённые файлы сразу в коммит? Как ни странно, такой процесс создан как раз для удобства программистов. Дело в том, что во время разработки может меняться и добавляться много файлов. Но это не значит, что мы хотим добавить все эти изменения в один коммит.

Со смысловой точки зрения коммит — это какое-то логически завершённое изменение внутри проекта. Его размер бывает очень маленьким, например, исправлением опечатки в одном файле, а иногда и большим, например, при внедрении новой функциональности. Главное в коммите — его атомарность, то есть он должен выполнять ровно одну задачу.

Теперь файл README.md находится внутри репозитория. Убедиться в этом можно запустив команду git status:

hexlet-git$ git status
Untracked files:
  (use "git add <file>..." to include in what will be committed)
    PEOPLE.md

git status не выводит файлы, которые добавлены в репозиторий и не содержат изменений. При этом сам файл README.md находится внутри директории hexlet-git.

Самостоятельная работа

  1. Выполните все шаги из урока

  2. Добавьте файл PEOPLE.md в репозиторий. После добавления команда git status покажет такой вывод:

    hexlet-git$ git status
    On branch master
    nothing to commit, working tree clean
    

Дополнительные материалы

  1. Git Cheatsheet

<span class="translation_missing" title="translation missing: ru.web.courses.lessons.mentors.mentor_avatars">Mentor Avatars</span>

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят менторы из команды Хекслета или другие студенты.

Зарегистрироваться

или войти в аккаунт

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 115 курсов, 2000+ часов теории
  • 800 практических заданий в браузере
  • 250 000 студентов

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг».

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Rambler
Логотип компании Bookmate
Логотип компании Botmother

Есть вопрос или хотите участвовать в обсуждении?

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг».