Литература
PDF часто используемых команд
https://about.gitlab.com/images/press/git-cheat-sheet.pdf
Соглашение о коммитах
https://www.conventionalcommits.org/ru/v1.0.0/
Книга
https://git-scm.com/book/ru/v2
Установка git
Ubuntu
sudo apt update # на всякий случай смотрим новые версии
sudo apt install git-all
После установки Git нужно зайти в терминал и проверить, что он работает:
git --version
git version 2.28.0
# Ваша версия может отличаться, но важно, чтобы она была не ниже 2.23.0
Если у установлена более старая версия git
sudo apt install software-properties-common
sudo add-apt-repository ppa:git-core/ppa
sudo apt update
sudo apt install git
После установки Git нужно настроить.
git config --global user.name "<имя фамилия>"
git config --global user.email "<ваш емейл>"
Аккаунт на GitHub
сгенерировать ssh-ключ
# Создание ssh-ключей
ssh-keygen -t ed25519 -C "your_email@example.com"
# Дальше будет несколько вопросов. На все вопросы нужно нажимать Enter.
# Запуск агента ssh, который следит за ключами
eval "$(ssh-agent -s)"
# Добавления нового ssh-ключа в агент
ssh-add ~/.ssh/id_ed25519
Когда ssh-ключи созданы и добавлены в систему, можно приступать к интеграции с GitHub.
1. Выведите содержимое файла ~/.ssh/id_ed25519.pub и скопируйте его:
cat ~/.ssh/id_ed25519.pub
2. Добавьте ssh-ключ в аккаунт GitHub. При добавлении вас попросят назвать ключ. Напишите что-нибудь в стиле home.
Интеграция с GitHub
1. Создать репозитарий
Важно, чтобы репозиторий создавался пустым, поэтому не отмечайте галочки, добавляющие файлы.
2. На стр. репозитария увидим команды
Используем команды из "…or push an existing repository from the command line"
Git add
-i - интерактивное индексирование. Книга h
Git checkout
Команда переключения между коммитами.
git checkout [хеш коммита]
^ - переключение на родителя коммита
^^ - на два уровня вверх.
Команда переключения между ветками
git checkout [название ветки]^
с использование HEAD
git checkout head^
~ - (тильда) переключение на N родителей
git checkout [название коммита]~
Можно указать количество переходов (в примере 5)
git checkout [название ветки]~5
git branch
узнать место нахождения
-f Перемещение ветки
Команда
git branch -f main HEAD~3
Переместит (принудительно) ветку main на три родителя назад от HEAD.
Git clean
Команда git clean удаляет файлы (и директории), которые не находятся под версионным контролем в текущей директории и всех поддиректориях.
Git commit
--amend - можно добавить изменения в текущий коммит. Книга, a
--no-edit - Чтобы не открывался редактор для ввода описания коммита к команде git commit --amend можно добавить опцию --no-edit.
Git Blame
А что если мы не знаем коммита, но нам интересно, кто последним менял конкретную строчку в файле?
Git Grep
Ищет совпадение с указанной строкой во всех файлах проекта.
Git diff
Показывает разницу между тем, что было и что стало
Для перемещения вниз по дифу нужно нажать f, для перемещения наверх — b или u. Для выхода из режима просмотра нажмите q.
Git Log
Показывает список всех выполненных коммитов, отсортированных по дате добавления (сверху самые последние).
--oneline - показывает сокращенный вывод
-p - выводит диф для каждого коммита
git log -2 - вывести две последних строки
Git restore
Git reset
--hard - удаление коммита
git reset --hard HEAD~ - удаление одного коммита на который указывает HEAD
git rm
--cached - файл будет удалён из репозитория, но не из рабочей директории
Git Show
У каждого коммита есть идентификатор (говорят "хеш"), уникальный набор символов. С помощью хеша можно посмотреть все изменения, сделанные в рамках одного коммита.
git stash
# Прячем файлы. После этой команды пропадут все измененные файлы # независимо от того, добавлены они в индекс или нет
git stash pop
# Вернутся последние изменения
Git status
Git switch -
git merge
Команда
git merge [название ветки]
git rebase
Второй способ объединения изменений в ветках - это rebasing. При ребейзе Git по сути копирует набор коммитов и переносит их в другое место.
Команда
git rebase [название ветки]
git rebase [название ветки 1] [название ветки 2]
Преимущество rebase в том, что с его помощью можно делать чистые и красивые линейные последовательности коммитов. История коммитов будет чище, если вы применяете rebase.
-i
git rebase -i HEAD~3
Отмена изменение в Git
git reset
git reset отменяет изменения, перенося ссылку на ветку назад, на более старый коммит.
Команда
git reset HEAD~1
Reset отлично работает на локальных ветках, в локальных репозиториях. Но этот метод переписывания истории не сработает на удалённых ветках, которые используют другие пользователи.
git revert
Отменить изменения и поделиться отменёнными изменениями с остальными.
Команда
git revert HEAD~2
Появился новый коммит. Дело в том, что новый коммит C2' просто содержит изменения, полностью противоположные тем, что сделаны в коммите C2.
После revert можно сделать push и поделиться изменениями с остальными.
Перемещение изменений
git cherry-pick
Это очень простой и прямолинейный способ сказать, что ты хочешь копировать несколько коммитов на место, где сейчас находишься (HEAD)
git cherry-pick основывается на именах коммитов!
git cherry-pick <Commit1> <Commit2> <...>
Важно помнить, что cherry-pick поместит любой коммит сразу после HEAD (только если этот коммит не является предком HEAD)
Теги
git tag
Важно, что после создания теги никогда не сменят своего положения, так что можно с лёгкостью сделать checkout конкретного момента в истории изменений
git tag v1 c1
Если конкретный коммит не указан, гит пометит тегом HEAD.
Git describe
git describe <ref>
Где ref — это что-либо, что указывает на конкретный коммит. Если не указать ref, то git будет считать, что указано текущее положение (HEAD).
.gitignore
HEAD
HEAD - это символическое имя текущего выбранного коммита — это, по сути, тот коммит, над которым мы в данным момент работаем.
HEAD всегда указывает на последний коммит из вашего локального дерева. Большинство команд Git, изменяющих рабочее дерево, начнут с изменения HEAD.
Обычно HEAD указывает на имя ветки. Когда вы делаете коммит, статус ветки меняется и это изменение видно через HEAD.
PS — Prompt Statement PS1
добавьте в файл .bashrc такой код:
export PS1="\W\$(__git_ps1) $ "
или
export PS1="💻 \[\e[1;34m\]\W\[\e[m\]\[\033[32m\]\$(__git_ps1)\[\033[00m\] $ "