====== 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 <хэш_коммита>