Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/zolotyh-dk/git-cheat-sheet
Яндекс.Практикум: «Основы работы с Git». Краткий конспект
https://github.com/zolotyh-dk/git-cheat-sheet
command-line git github yandex-praktikum
Last synced: 17 days ago
JSON representation
Яндекс.Практикум: «Основы работы с Git». Краткий конспект
- Host: GitHub
- URL: https://github.com/zolotyh-dk/git-cheat-sheet
- Owner: zolotyh-dk
- Created: 2024-01-03T12:53:40.000Z (about 1 year ago)
- Default Branch: master
- Last Pushed: 2024-01-05T12:02:39.000Z (about 1 year ago)
- Last Synced: 2024-11-11T01:42:33.648Z (3 months ago)
- Topics: command-line, git, github, yandex-praktikum
- Homepage:
- Size: 10.7 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Cамая удобная шпаргалка по работе с Git
## 1. Командная строка
### 1.1 Навигация в командной строке
**Домашняя директория** (англ. home directory) — каталог с файлами пользователя. Обычно здесь хранится такая информация, как загрузки, медиа, скриншоты и так далее.`pwd` (от англ. print working directory — «показать рабочую папку») - выводит путь к текущей директории.
`cd` (от англ. change directory — «сменить директорию»).
`cd` и символ `~` — перейти к домашней директории.
Допустим, вы находитесь в директории `/projects`. Если ввести команду `cd github`, она перенесёт вас в директорию `/projects/github`.
Если в названии папки есть пробелы, при вводе нужно использовать кавычки.
```bash
$ cd "Фотографии с дня рождения"
```Чтобы вернуться в **родительскую директорию** — то есть на уровень выше, — вместо названия папки нужно написать две точки: `..`.
```bash
$ pwd
/projects/github # сейчас мы здесь$ cd .. # переходим на уровень выше
$ pwd
/projects # мы вернулись!
````ls` (от англ. list directory contents — «отобразить содержимое директории»).
`ls` с флагом `-a` выведет расширенный список. В нём отобразятся все скрытые файлы, которые начинаются с символа `.` (например, файлы конфигурации). В том числе два особых файла `.` и `..`, которые обозначают текущую и родительскую директории.
```bash
$ ls # вывели список файлов
file.txt
photo.png$ ls -a # вывели список, в котором отображаются скрытые файлы ., .. и .git
.
..
.git
file.txt
photo.png
```### 1.2 Создание, копирование, перемещение
#### Создание файлов и директорий — touch, mkdir
`touch` (англ. «коснуться») с именем файла в качестве параметра - создание файла
```bash
$ touch my-new-file.txt # создали файл my-new-file.txt
````mkdir` (от англ. make directory — «создать директорию») - создание директории
```bash
$ mkdir new-dir # создали директорию new-dir
````mkdir` с флагом `-p` - создание структуры директорий
```bash
$ mkdir -p dir1/dir-inside/dir-deeper-inside
# создали папку dir-deeper-inside в папке dir-inside, которая находится в папке dir1
```#### Копирование файлов — cp
`cp` (от англ. copy — «копировать») - копирования файлов
В простом виде `cp` принимает два параметра: `что копируем` и `куда копируем`.
```bash
$ cp index.html src/
# скопировали index.html в папку src
```Но можно указать сразу несколько файлов.
```bash
$ cp что_копируем что_копируем что_копируем куда_копируем$ cp index.html style.css script.js src/
# скопировали три файла (index.html, style.css и script.js) в папку src
```#### Перемещение файлов и папок — mv
Синтаксис команды `mv` аналогичен синтаксису `cp`. После имени команды указывают список файлов и папок, которые нужно переместить, а затем — папку, в которую нужно выполнить перемещение.
```bash
$ mv table.csv ./very-important-files
# сначала указываем имя файла, который хотим переместить, потом путь — куда перемещаем
```### 1.3 Чтение и удаление
#### Чтение файлов — cat
`cat` (от англ. concatenate and print — «объединить и распечатать») - распечатывает файл в консоль. После команды нужно ввести имя файла.
Команда `cat` работает только с текстовыми файлами.
#### Удаление файлов и папок — rm, rmdir, rm -r
`rm` (от англ. remove — «удалить») - удаляет файл.
```bash
$ rm example.txt # удалили файл example.txt из текущей папки
````rmdir` (от англ. remove directory — «удалить директорию») - удаляет папку.
```bash
$ rmdir images # команда удалит папку images из текущей директории,
# если папка images пуста
```Если в папке, которую вы пытаетесь стереть, есть какие-то файлы, то командная строка не удалит её и выведет сообщение о том, что папка не пуста (англ. `Directory not empty`).
`rm -r` (`-r` — от англ. recursive, «рекурсивный») рекурсивно удаляет файлы и папки.
Это значит, что удаление будет последовательно применяться к каждому из элементов в этой папке — пока не сотрёт их все. Затем команда удалит пустую директорию.
### 1.4 Работа с файлом настройки .gitconfig
Чтобы участникам проекта было понятно, кто и какие изменения вносил, нужно указать имя пользователя и адрес электронной почты.
`git config` (от англ. *configuration —* «конфигурация», «настройка») с ключом `--global` (англ. «глобальный»)
```bash
$ git config --global user.name "User Namovich"
# имя или ник нужно написать латиницей и в кавычках$ git config --global user.email [email protected]
# здесь нужно указать свой настоящий email
```Все глобальные настройки Git хранит в файле `.gitconfig` в домашней директории.
```bash
$ cat ~/.gitconfig
```Другой способ проверки — вывести содержимое файла конфигурации Git той же командой `git config` с флагом `--list` (англ. «список»).
```bash
$ git config --list
```## 2. Первый коммит
### 2.1 Инициализируем репозиторий
#### Сделать папку репозиторием — git init
Чтобы Git начал отслеживать изменения в проекте, папку с файлами этого проекта нужно сделать **Git-репозиторием** (от англ. *repository* — «хранилище»). Для этого следует переместиться в неё и ввести команду `git init` (от англ. ***init**ialize* — «инициализировать»).
```bash
$ cd ~/dev/first-project # перешли в нужную папку$ git init # создали репозиторий
```#### «Разгитить» папку, если что-то пошло не так, — rm -rf .git
Если вы случайно сделали Git-репозиторием не ту папку, её можно «разгитить». Для этого нужно удалить скрытую подпапку `.git`.
```bash
$ cd <папка с репозиторием> # перешли в папку$ rm -rf .git # удалили подпапку .git
```Разберём подробнее, что такое `-rf`:
- ключ `r` (от англ. recursive — «рекурсивно») позволяет удалять папки вместе с их содержимым;
- ключ `f` (от англ. force — «заставить») избавит вас от вопросов вроде «Вы точно хотите удалить этот файл? А этот? И этот тоже?».#### Проверить состояние репозитория — git status
`git status` (от англ. status — «статус», «состояние») — показывает текущее состояние репозитория.
### 2.2 Добавляем файлы в репозиторий
`git add --all` (от англ. add — «добавить» + от англ. all — «всё»). Ключ, или флаг, `--all` позволяет подготовить к сохранению все файлы в репозитории.
```bash
$ git add --all # подготовили к сохранению все файлы в репозитории
$ git status # проверили статус
```Добавлять файлы можно и по одному, без ключа `--all`.
```bash
$ git add todo.txt
$ git add readme.txt
```Также можно добавить текущую папку целиком — в этом случае все файлы в ней тоже будут добавлены. Обратиться к текущей папке в Bash позволяет точка (`.`).
```bash
$ git add . # добавить всю текущую папку
```### 2.3 Делаем первый коммит
Сделать коммит можно командой `git commit` c ключом `-m` (от англ. message — «сообщение»), который присваивает коммиту сообщение.
Обычно в таком сообщении поясняется, в чём именно состояли изменения.
```bash
$ git commit -m 'Мой первый коммит!'
```Команда `git commit` выведет информацию о коммите.
- `[master (root-commit) baa3b6e]` значит:
- коммит был в ветке `master`;
- `root-commit` — это самый первый, или «корневой» (англ. root), коммит в ветке, у следующих коммитов такой надписи не будет;
- `baa3b6e` — сокращённый идентификатор коммита (подробнее об этом мы ещё расскажем).
- `2 files changed, 1 insertion(+)` значит:
- изменились два файла (`readme.txt` и `todo.txt`);
- одна строка была добавлена (`1. Пройти пару уроков по Git.`).
- Строки вида `create mode 100644 readme.txt` — это более подробная информация о новых (добавленных в Git) файлах.
- `create` (англ. «создать») говорит, что файл был создан. Если бы файл был удалён, на этом месте было бы слово `delete` (англ. «удалить»).
- `mode 100644` сообщает, что это обычный файл. Также возможны варианты `100755` для исполняемых файлов (например, `что-нибудь.exe`) и `120000` для файлов-ссылок в Linux. Файлы-ссылки не содержат данных сами по себе, а только ссылаются на другие файлы — как «ярлыки» в Windows.
### 2.4 Просматриваем историю коммитов`git log` (от англ. *log* — «журнал») - показывет историю коммитов.
По умолчанию `git log` выводит коммиты в обратном хронологическом порядке — последние коммиты оказываются первыми сверху.
## 3. Синхронизация репозиториев
### 3.1 Что такое SSH. Генерируем SSH-ключ
#### Что такое SSH
**SSH** (от англ. Secure Shell Protocol) - один из наиболее распространённых сетевых протоколов.
Он обеспечивает безопасный обмен данными в сети. С помощью этого протокола можно получать данные с удалённого компьютера или отправлять их на него. Трафик шифруется, поэтому протокол безопасен.
SSH использует пару ключей для обеспечения безопасности — публичный и приватный:
- **Приватный ключ** (англ. *private key*) хранится только на вашем компьютере и не должен передаваться кому-либо ещё. Он используется для расшифровки данных.
- **Публичный ключ** (англ. *public key*) доступен всем и используется для шифрования данных. Они могут быть расшифрованы парным приватным ключом.Только вы можете расшифровать данные с помощью приватного ключа, но любой владелец публичного ключа может их для вас зашифровать. Эти два ключа связаны и образуют **SSH-пару**.
#### Проверка наличия SSH-ключа
По умолчанию директория с SSH-ключами находится в домашней директории пользователя.
```bash
$ cd ~ # перешли в домашнюю директорию
$ ls -la .ssh/ # вывели список созданных ключей
```Если папка пустая или её нет, всё в порядке.
Если есть файлы с похожими названиями, SSH-ключи уже создавались:
- `id_dsa.pub`;
- `id_ecdsa.pub`;
- `id_ed25519.pub`;
- `id_rsa.pub`.#### Инструкция по генерации SSH-ключа
1. Для генерации SSH-пары можно использовать программу `ssh-keygen`. Откройте терминал и введите следующую команду.
```bash
$ ssh-keygen -t ed25519 -C "электронная почта, к которой привязан ваш аккаунт на GitHub"
```Если вы видите сообщение об ошибке, то, скорее всего, ваша система не поддерживает алгоритм шифрования `ed25519`. Ничего страшного: используйте другой алгоритм.
```bash
$ ssh-keygen -t rsa -b 4096 -C "электронная почта, к которой привязан ваш аккаунт на GitHub"
```После ввода отобразится такое сообщение.
```bash
> Generating public/private rsa key pair. # сгенерированы публичный и приватный ключи
```2. Укажите место хранения ключей. Простой вариант — сделать домашний каталог пользователя путём по умолчанию. Для этого нажмите `Enter`.
3. Программа запросит **кодовую фразу** (англ. passphrase) для доступа к SSH-ключу. Вы можете оставить поле пустым. Для этого нажмите `Enter`, а затем ещё раз `Enter` для подтверждения.```bash
> Enter passphrase (empty for no passphrase): [Type a passphrase]
> Enter same passphrase again: [Type passphrase again]
```4. Теперь осталось проверить, что ключи действительно сгенерировались. Для этого вызовите эту команду.
```bash
ls -a ~/.ssh
```На экране должны появиться два файла — один с расширением `.pub`, другой — без. Файл в `.pub` — публичный, им можно делиться с веб-сайтами или коллегами. Файл без расширения `.pub` — приватный. Ни в коем случае не передавайте его никому!
### 3.2 Привязываем SSH-ключ к GitHub
1. Скопируйте содержимое файла с публичным ключом в буфер обмена.
```bash
# скопировать содержимое ключа в буфер обмена:
$ clip < ~/.ssh/id_rsa.pub
# для ed25519:
$ clip < ~/.ssh/id_ed25519.pub
```2. Перейдите на GitHub и выберите пункт **Settings.** В меню слева нажмите на пункт **SSH and GPG keys**. В открывшейся вкладке выберите **New SSH key.** В поле **Title** напишите название ключа. Например, **Personal key.** В поле **Key type** должно быть **Authentication Key**.
В поле **Key** скопируйте ваш ключ из буфера обмена.
3. Проверьте правильность ключа с помощью следующей команды.```bash
$ ssh -T [email protected]
```### 3.3 Связываем локальный и удалённый репозитории
#### Привязать удалённый репозиторий к локальному — git remote add
Перейдите на страницу удалённого репозитория, выберите тип `SSH` и скопируйте URL.
Откройте консоль, перейдите в каталог локального репозитория и введите команду `git remote add` (от англ. *remote* — «удалённый» и *add* — «добавить»).
```bash
$ cd ~/dev/first-project
$ git remote add origin [email protected]:%ИМЯ_АККАУНТА%/first-project.git
```Команде необходимо передать два параметра: имя удалённого репозитория и его URL. В качестве имени используйте слово `origin`. А URL вы скопировали со страницы удалённого репозитория.
`origin` (англ. «источник») — стандартный псевдоним, с помощью которого можно обращаться к главному удалённому репозиторию (обычно такой репозиторий один).
#### Убедиться, что репозитории связаны, — git remote -v
```bash
$ git remote -v
origin [email protected]:%ИМЯ_АККАУНТА%/%ИМЯ-ПРОЕКТА%.git (fetch)
origin [email protected]:%ИМЯ_АККАУНТА%/%ИМЯ-ПРОЕКТА%.git (push)
```Флаг `-v` — короткая форма флага `--verbose` (англ. «подробный»). Он позволяет показать больше информации в выводе.
### 3.4 Синхронизируем локальный и удалённый репозитории
#### Отправить изменения на удалённый репозиторий — git push
`git push` (от англ. *push* — «толкать») - загружает содержимое локального репозитория на GitHub.
В первый раз эту команду нужно вызвать с флагом `-u` и параметрами `origin` (имя удалённого репозитория) и `main` или `master` (название текущей ветки). Флаг `-u` свяжет локальную ветку с одноимённой удалённой.
```bash
$ git push -u origin main # Если команда приведёт к ошибке, попробуйте
# заменить main на master.
```В дальнейшем при работе с удалённым репозиторием флаг `-u` можно опустить и писать просто `git push`.
## 4. Навигация по коммитам
### 4.1 Хеш — идентификатор коммита
#### Что такое хеш. Хеширование коммитов
**Хеширование** (от англ. *hash*, «рубить», «крошить», «мешанина») — это способ преобразовать набор данных и получить их «отпечаток» (англ. *fingerprint*).
Информация о коммите — это набор данных: когда был сделан коммит, содержимое файлов в репозитории на момент коммита и ссылка на предыдущий, или **родительский** (англ. *parent*), коммит.
Git хеширует (преобразует) информацию о коммите с помощью алгоритма **SHA-1** (от англ. Secure Hash Algorithm — «безопасный алгоритм хеширования») и получает для каждого коммита свой уникальный **хеш** — результат хеширования.
Обычно хеш — это короткая (4040 символов в случае SHA-1) строка, которая состоит из цифр 0— 9 и латинских букв *A*—*F* (неважно, заглавных или строчных). Она обладает следующими важными свойствами:
- если хеш получить дважды для одного и того же набора входных данных, то результат будет гарантированно одинаковый;
- если хоть что-то в исходных данных поменяется (хотя бы один символ), то хеш тоже изменится (причём сильно).#### Хеш — основной идентификатор коммита
Git хранит таблицу соответствий `хеш → информация о коммите`. Если вы знаете хеш, вы можете узнать всё остальное: автора и дату коммита и содержимое закоммиченных файлов. Можно сказать, что хеш — основной идентификатор коммита.
Все хеши и таблицу `хеш → информация о коммите` Git сохраняет в служебные файлы. Они находятся в скрытой папке `.git` в репозитории проекта.
### 4.2 Исследуем лог
#### Элементы описания коммита
После вызова `git log` появляется список коммитов.
Элементы, из которых состоит описание:
* строка из цифр и латинских букв после слова commit — это хеш коммита;
* Author — имя автора и его электронная почта;
* Date — дата и время создания коммита;
* в конце находится сообщение коммита.#### Получить сокращённый лог —`git log --oneline`
Получить сокращённый лог можно с помощью команды `git log` с флагом `--oneline` (англ. «одной строкой»). В терминале появятся только первые несколько символов хеша каждого коммита и их комментарии. Команда автоматически подберёт оптимальную длину хеша.
### 4.3 HEAD
Файл `HEAD` (англ. «голова», «головной») — один из служебных файлов папки `.git`. Он указывает на коммит, который сделан последним (то есть на самый новый).
Внутри `HEAD` — ссылка на служебный файл: `refs/heads/master` (или `refs/heads/main` в зависимости от названия ветки). Если заглянуть в этот файл, можно увидеть хеш последнего коммита.
Когда вы делаете коммит, Git обновляет `refs/heads/master` — записывает в него хеш последнего коммита. Получается, что `HEAD` тоже обновляется, так как ссылается на `refs/heads/master`.
`HEAD` указывает на последний коммит. Если передать его в качестве параметра, Git поймёт вас.
### 4.4 Статусы файлов в Git
#### Статусы `untracked` / `tracked`, `staged` и `modified`
- **`untracked`** (англ. «неотслеживаемый»)
Новые файлы в Git-репозитории помечаются как `untracked`, то есть неотслеживаемые. Git «видит», что такой файл существует, но не следит за изменениями в нём. У `untracked`файла нет предыдущих версий, зафиксированных в коммитах или через команду `git add`.
- **`staged`** (англ. «подготовленный»)
После выполнения команды `git add` файл попадает в **staging area** (от англ. *stage* — «сцена» и *area* — «область»), то есть в список файлов, которые войдут в коммит.
- **`tracked`** (англ. «отслеживаемый»)
Состояние `tracked` — это противоположность `untracked`. Оно довольно широкое по смыслу: в него попадают файлы, которые уже были зафиксированы с помощью `git commit`, а также файлы, которые были добавлены в staging area командой `git add`. То есть все файлы, в которых Git так или иначе отслеживает изменения.
- **`modified`** (англ. «изменённый»)
Состояние `modified` означает, что Git сравнил содержимое файла с последней сохранённой версией и нашёл отличия. Например, файл был закоммичен и после этого изменён.#### Про `staged` и `modified`
Команда `git add` добавляет в staging area только текущее содержимое файла. Если вы, например, сделаете `git add file.txt`, а затем измените `file.txt`, то новое содержимое файла не будет находиться в staging.
Git сообщит об этом с помощью статуса `modified`: файл изменён относительно той версии, которая уже в staging. Чтобы добавить в staging последнюю версию, нужно выполнить `git add file.txt` ещё раз.
#### Типичный жизненный цикл файла в Git
```mermaid
graph LR;
untracked -- "git add" --> staged+tracked;
staged+tracked -- "git commit" --> comitted+tracked;
staged+tracked -- "изменения" --> modified+tracked;
modified+tracked -- "git add" --> staged+tracked;
comitted+tracked -- "изменения" --> modified+tracked;
```