Текстовый конспект пары будет немного отличаться от рассказанного онлайн, потому что у меня есть чуть больше времени спокойно обдумать все. Но в целом идейно все остается таким же.
Команды будут делиться на 3 группы:
- Для работы в одиночку над небольшим проектом
- Для работы в команде
- Более продвинутые и не так часто используемые Называться они будут lvl1, lvl5, lvl100, как в том старинном меме.
Каждый из нас проходил путь боли, когда пишешь какой-то проект, он уже становится достаточно большим и тут в какой-то момент перестает работать. Изменений сделано много, как искать ошибку? Эх, вот бы можно было откатиться на последнюю работающую версию. Системы контроля версий vcs решают эту и многие другие проблемы. Поговорим про одну из самых популярных (как минимум в open source мире) - git.
Цель: хочу писать проект, сохранять его промежуточные состояния не боясь чего-то потерять. Хочу проект держать где-то удаленно, например, на гитхабе. Коммитить буду один по ночам.
Ключевые слова:
git init
git commit
git add
git status
git log
git push
git pull
git fetch
Создаем простой проект. Создаем директорию mkdir MegaOmegaProject
и переходим в нее cd MegaOmegaProject
. Тут и будем писать наш код.
Смастерим файлик main.cpp:
#include <iostream>
int main() {
std::cout << "Hello, world!" << std::endl;
}
Написали пока немного, но уже переживаем, что можем что-то потерять. Гит, настало твое время. Делаем git init
.
Important
git init
- создать git репозиторий в текущей директории. Документация
Эта команда инициализирует гит. В директории появляется поддиректория .git
, в которой и будет находиться вся магия.
$ ls -a
. .. .git main.cpp
Посмотрим состояние репозитория с помощью команды git status
:
Important
git status
- показать текущее состояние репозитория. Документация
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
main.cpp
nothing added to commit but untracked files present (use "git add" to track)
Наш main.cpp
помечен как untracked. Это значит, что гит за ним не следит.
Tip
Иногда бывает полезно использовать git status -uno
, который не показывает untracked файлы, если их много.
Чтобы гит начал отслеживать изменения в этом файле, нужно добавить его в индекс. Или же сделать git add main.cpp
Important
git add
- добавить файл в индекс. После этого гит будет следить за изменениями в этом файле и его состояние можно будет сохранить. Можно использовать по-разному. git add filename
- добавить файл filename
. git add .
- добавить содержимое текущей директории. git add *.cpp
- добавить только файлы с расширением .cpp. git add *
- добавить все файлы. Добавлять нужно аккуратно, потому что можно случайно добавить лишние файлы. Чтобы этого избежать, можно добавить специальный .gitignore
файл. В котором перечислить, какие файлы нужно игнорировать. Сам файл .gitignore
нужно будет тоже закоммитить. Документация git add Документация .gitignore
Теперь git status
выдает следующее:
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: main.cpp
И мы готовы сделать первый коммит - сохранить текущее состояние нашего проекта. Для этого нужно выполнить git commit
.
$ git commit
Author identity unknown
*** Please tell me who you are.
Run
git config --global user.email "[email protected]"
git config --global user.name "Your Name"
to set your account's default identity.
Omit --global to set the identity only in this repository.
fatal: empty ident name (for <[email protected]>) not allowed
О нет, ошибка. Гит не знает кто мы. А для того, чтобы сохранить состояние нужно указать имя и почту. Они влияют на авторство комми Однако, если хочется сохранить свое авторство, то лучше указать что-то настоящее. Выполним команды, которые просит git.
Note
--global
означает, что настройка будет применена для всей системы. Если не указывать этот аргумент, то мы зададим автора коммитов только для заданного репозитория. Может быть удобно, если хочется в разные репозитории коммитить с разных аккаунтов.
Выполним:
$ git config --global user.email "[email protected]"
$ git config --global user.name "Misha"
И попробуем создать коммит еще раз git commit
.
О нет! Открылся текстовый редактор нано. Так мы далеко не уедем. Надо поменять еще одну настройку гита. Выходим из Nano, нажав Ctrl + X
и просим гит, открывать какие-то более приличные редакторы кода.
$ git config --global core.editor "nvim"
Попробуем в третий раз закоммитить git commit
:
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
#
# Initial commit
#
# Changes to be committed:
# new file: main.cpp
#
Открылся nvim и нас просят ввести commit message. Сообщение коммита - какой-то небольшой кусочек текста, описывающий текущие изменения. Напишем в первую строку "Initial commit" и закроем редактор.
[master (root-commit) 8950e8b] Initial commit
1 file changed, 7 insertions(+)
create mode 100644 main.cpp
Ура, успех. Мы сделали свой первый коммит. Теперь текущее состояние проекта зафиксировано и мы всегда сможем к нему вернуться.
Important
git commit
- сохранить изменения в файлах, добавленных в индекс. Чтобы не открывать текстовый редактор, можно сразу писать git commit -m "message"
.При таком использовании в коммит будут добавлены только изменения из staged файлов (об этом ниже [TODO: ссылку]). Также можно добавить сразу изменения всех отслеживаемых файлов и не запариваться со staged: git commit -a -m "commit message"
или добавить изменения только из файлов текущей директории: git commit -m "commit message" .
. Документация
Добавим еще несколько коммитов.
TBD