====== git ======
[[https://git-scm.com/docs|доки]]
[[https://learngitbranching.js.org|интерактивная обучалка]]
[[https://habr.com/ru/articles/416887/|о комментариях к коммиту]]
Представьте, что вы пишете код и внезапно понимаете, что предыдущая версия работала лучше. Или вы работаете с командой, и нужно объединить изменения нескольких человек. Git решает эти задачи, сохраняя историю всех изменений и позволяя безопасно экспериментировать с кодом.
Git хранит снимки вашего проекта в специальном хранилище, которое называется **репозиторием**. Каждое сохранение изменений называется **коммитом**, и вы всегда можете вернуться к любому из них.
===== Настройка =====
{{fixme}}
===== Создание репозитория =====
# Создаёт новый локальный репозиторий с заданным именем
git init <название проекта>
# Скачивает репозиторий вместе со всей его историей изменений
git clone
===== Внесение изменений =====
# Перечисляет все новые или изменённые файлы, которые нуждаются в фиксации
git status
# Показывает различия по внесённым изменениям в ещё не проиндексированных файлах
git diff
# Индексирует указанный файл для последующего коммита
git add <файл>
# Показывает различия между проиндексированной и последней зафиксированной версиями файлов
git diff --staged
# Отменяет индексацию указанного файла, при этом сохраняет его содержимое
git reset <файл>
# Фиксирует проиндексированные изменения и сохраняет их в историю версий
git commit -m "<сообщение с описанием>"
===== Операции с файлами =====
# Удаляет конкретный файл из рабочей директории и индексирует его удаление
git rm <файл>
# Убирает конкретный файл из контроля версий, но физически оставляет его на своём месте
git rm --cached <файл>
# Перемещает / переименовывает указанный файл, сразу индексируя его для последующего коммита
$ git mv <оригинальный файл> <новое имя>
===== Просмотр истории =====
# История коммитов для текущей ветки
git log
# История изменений конкретного файла, включая его переименование
git log --follow <файл>
# Показывает разницу между содержанием коммитов двух веток
git diff <первая ветка>...<вторая ветка>
# Выводит информацию и показывает изменения в выбранном коммите
git show <коммит>
===== Фрагменты =====
# Временно сохраняет все незафиксированные изменения отслеживаемых файлов
git stash
git stash push -m "имя какое тебе удобно для обозначения твоих изменения"
# Восстанавливает состояние ранее сохранённых версий файлов
git stash pop
git stash apply stash@{<тут номер стэша>}
# Выводит список всех временных сохранений
git stash list
# Сбрасывает последние временно сохранённыe изменения
git stash drop
===== Branching =====
# Список именованных веток коммитов с указанием выбранной ветки
git branch
# Создание ветки
git branch имя_ветки
# удаляет выбранную ветку
git branch -d <имя ветки>
# Переключение активной ветки
git checkout имя_ветки
# Слияние веток
git checkout master # входим в ветку, которую хотим слить
git merge <имя_ветки> # сливаем с другой веткой
===== Remotes ======
# Добавляет новый удалённый репозиторий с указанным именем
git remote add <имя>
# Удаляет удалённый репозиторий с указанным именем
git remote remove <имя>
# Переименовывает удалённый репозиторий с указанным старым именем на новое имя
git remote rename <старое_имя> <новое_имя>
# Обновляет URL удалённого репозитория
git remote set-url <имя> <новый_URL>
# Показывает список всех удалённых репозиториев
git remote -v
# Показывает подробную информацию о конкретном удалённом репозитории
git remote show <имя>
# Скачивает всю историю из удалённого репозитория
git fetch <удалённый репозиторий>
# Вносит изменения из ветки удалённого репозитория в текущую ветку локального репозитория
git merge <удалённый репозиторий>/<ветка>
# Загружает все изменения локальной ветки в удалённый репозиторий
git push <удалённый репозиторий> <ветка>
# Загружает историю из удалённого репозитория и объединяет её с локальной. pull = fetch + merge
git pull
===== Merge =====
{{fixme}}
===== Tegging =====
{{fixme}}
===== Rewrite history =====
Удаление ошибок и корректировка созданной истории
# Отменяет все коммиты после заданного, оставляя все изменения в рабочей директории
git reset <коммит>
# Сбрасывает всю историю вместе с состоянием рабочей директории до указанного коммита.
git reset --hard <коммит>
# Отмена последнего коммита
# На самом деле это несовсем отмена коммита, а создание нового, идентичного пред-предыдущему
git revert HEAD
# Отмена конкретного коммита
git revert <хэш_коммита>