Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
289 changes: 289 additions & 0 deletions git_instruction.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,289 @@
# Основы работы с Git

- [Введение](#Введение)
- [Основы работы с локальным репозиторием](#Основы-работы-с-локальным-репозиторием)
- [Основы работы с удаленным репозиторием](#Основы-работы-с-удаленным-репозиторием)

# Введение

**Git** (произн. «гит») — распределённая система управления версиями файлов.
Проект был создан Линусом Торвальдсом для управления разработкой ядра Linux.
На сегодняшний день поддерживается Джунио Хамано.

Система спроектирована как набор программ, специально разработанных с учётом их
использования в скриптах. Это позволяет удобно создавать специализированные
системы контроля версий на базе Git или пользовательские интерфейсы.

Git поддерживает быстрое разделение и слияние версий, включает инструменты для
визуализации и навигации по нелинейной истории разработки.

У Git есть три основных состояния, в которых могут находиться файлы:
изменён (modified), индексирован (staged) и зафиксирован (committed):

- К изменённым относятся файлы, которые поменялись, но ещё не были зафиксированы.
- Индексированный — это изменённый файл в его текущей версии, отмеченный для включения
в следующий коммит.
- Зафиксированный значит, что файл уже сохранён в вашей локальной базе.

Три основным секциям проекта Git: рабочая копия (working tree), область
индексирования (staging area) и каталог Git (Git directory).

<image src="https://git-scm.com/book/en/v2/images/areas.png" alt="Рабочая копия, область индексирования и каталог Git">
</image>

- Рабочая копия является снимком одной версии проекта. Эти файлы извлекаются из сжатой базы
данных в каталоге Git и помещаются на диск, для того чтобы их можно было использовать или
редактировать.
- Область индексирования — это файл, обычно находящийся в каталоге Git, в нём содержится
информация о том, что попадёт в следующий коммит. Её техническое название на языке
Git — «индекс», но фраза «область индексирования» также работает.
- Каталог Git — это то место, где Git хранит метаданные и базу объектов вашего проекта.
Это самая важная часть Git и это та часть, которая копируется при клонировании репозитория с
другого компьютера.

Базовый подход в работе с Git выглядит так:
- Изменяете файлы вашей рабочей копии.
- Выборочно добавляете в индекс только те изменения, которые должны попасть в следующий коммит,
добавляя тем самым снимки только этих изменений в индекс.
- Когда вы делаете коммит, используются файлы из индекса как есть, и этот снимок сохраняется
в ваш каталог Git.
- Если определённая версия файла есть в каталоге Git, эта версия считается зафиксированной (committed).
Если файл был изменён и добавлен в индекс, значит, он индексирован (staged). И если файл был изменён
с момента последнего распаковывания из репозитория, но не был добавлен в индекс, он считается
изменённым (modified).


# Основы работы с локальным репозиторием
## Базовые команды
### git init — создание репозитория

Команда git init создает в директории пустой репозиторий в виде директории .git,
где и будет в дальнейшем храниться вся информация об истории коммитов, тегах —
о ходе разработки проекта:
```
mkdir project-dir
cd project-dir
git init
```

### git add и git rm — индексация изменений

Команда git add. Она позволяет внести в индекс — изменения, которые затем войдут в коммит.

Индексирует измененный файл, либо оповещение о создании нового:
```
git add EDITEDFILE
```

Вносит в индекс все изменения, включая новые файлы:
```
git add .
```

Из индекса и дерева проекта одновременно файл можно удалить командой git rm.

Удаляет из индекса и дерева проекта отдельные файлы:
```
git rm FILE1 FILE2
```


Вносит в индекс все удаленные файлы:
```
git rm -r --cached .
```

Сбросить весь индекс или удалить из него изменения определенного файла можно
командой git reset:
```
git reset
```

Удаляет из индекса конкретный файл:
```
git reset — EDITEDFILE
```

Команда git reset используется не только для сбрасывания индекса, поэтому дальше
ей будет уделено гораздо больше внимания.

### git status — состояние проекта, измененные и не добавленные файлы, индексированные файлы

Команду git status, пожалуй, можно считать самой часто используемой наряду с
командами коммита и индексации. Она выводит информацию обо всех изменениях,
внесенных в дерево директорий проекта по сравнению с последним коммитом рабочей
ветки; отдельно выводятся внесенные в индекс и неиндексированные
файлы. Использовать ее крайне просто:
```
git status
```

Кроме того, git status указывает на файлы с неразрешенными конфликтами слияния и
файлы, игнорируемые git.

### git commit — совершение коммита

Коммит — базовое понятие во всех системах контроля версий, поэтому совершаться
он должен легко и по возможности быстро. В простейшем случае достаточно
после индексации набрать:
```
git commit
```

Если индекс не пустой, то на его основе будет совершен коммит, после чего
пользователя попросят прокомментировать вносимые изменения вызовом команды
edit. Сохраняемся, и вуаля! Коммит готов. Есть несколько ключей, упрощающих
работу с git commit.

Совершает коммит, автоматически индексируя изменения в файлах проекта. Новые
файлы при этом индексироваться не будут! Удаление же файлов будет учтено:
```
git commit -a
```

Комментирует коммит прямо из командной строки вместо текстового редактора:
```
git commit -m «commit comment»
```

# Основы работы с удаленным репозиторием

## git clone — создание копии (удаленного) репозитория

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

Клонирует репозиторий, используя протокол http:
```
git clone http://user@somehost:port/~user/repository/project.git
```

Клонирует репозиторий с той же машины в директорию myrepo:
```
git clone /home/username/project myrepo
```

Клонирует репозиторий, используя безопасный протокол ssh:
```
git clone ssh://user@somehost:port/~user/repository
```

У git имеется и собственный протокол:
```
git clone git://user@somehost:port/~user/repository/project.git/
```

Импортирует svn репозиторий, используя протокол http:
```
git svn clone -s http://repo/location
```
где -s – понимать стандартные папки SVN (trunk, branches, tags)

## git fetch и git pull — забираем изменения из центрального репозитория

Для синхронизации текущей ветки с репозиторием используются команды git fetch
и git pull.

git fetch — забирает изменения удаленной ветки из репозитория по умолчания,
основной ветки; той, которая была использована при клонировании репозитория.
Изменения обновят удаленную ветку (remote tracking branch), после чего надо будет
провести слияние с локальной ветку командой git merge.

Получает изменений из определенного репозитория:
```
git fetch /home/username/project
```

Возможно также использовать синонимы для адресов, создаваемые командой git remote:
```
git remote add username-project /home/username/project
git fetch username-project
```

Естественно, что после оценки изменений, например, командой git diff, надо
создать коммит слияния с основной:
```
git merge username-project/master
```

Команда git pull сразу забирает изменения и проводит слияние с активной веткой.
Забирает из репозитория, для которого были созданы удаленные ветки по умолчанию:
```
git pull
```

Забирает изменения и метки из определенного репозитория:
```
git pull username-project --tags
```

Как правило, используется сразу команда git pull.

## git push — вносим изменения в удаленный репозиторий

После проведения работы в экспериментальной ветке, слияния с основной, необходимо
обновить удаленный репозиторий (удаленную ветку). Для этого используется команда
git push.

Отправляет свои изменения в удаленную ветку, созданную при клонировании по
умолчанию:
```
git push
```

Отправляет изменения из ветки master в ветку experimental удаленного репозитория:
```
git push ssh://yourserver.com/~you/proj.git master:experimental
```

В удаленном репозитории origin удаляет ветку experimental:
```
git push origin :experimental
```

Отправляет в удаленную ветку master репозитория origin (синоним репозитория по
умолчанию) ветки локальной ветки master:
```
git push origin master:master
```

Отправляет метки в удаленную ветку master репозитория origin:
```
git push origin master --tags
```

Изменяет указатель для удаленной ветке master репозитория origin (master будет
такой же как и develop):
```
git push origin origin/develop:master
```

Вносит в индекс и создаёт коммит на основе изменений единственного файла:
```
git commit FILENAME
```

Пример написания хорошего сообщения коммита:
```
Описывает изменение (до 50 символов)

Более детальное объяснение, если необходимо. Перенос на 72 символе
или около того. В некоторых контекстах первая строка рассматривается
как тема письма, а остальное как тело. Пустая строка, отделяющая сводку
от тела, важна (если вы не опустили тело целиком); если вы оставите их
вместе, инструменты, такие как rebase, могут воспринять это неправильно.

Дальнейшие параграфы идут после пустых строк

- также можно применять маркеры списков

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

Если вы используете систему отслеживания задач, поставьте ссылки на нее:

Resolves: #123
See also: #456, #789
```