Git
- Version Control System. Обратите внимание, что с октября 2020 года GitHub изменил название ветки по умолчанию с
masterнаmain.
Система контроля версий, которая позволяет осуществлять:
- Возврат к любой прошлой версии кода
- Просмотр истории изменений
- Восстановление любых данных.
- Совместная работа без риска потерять данные или перезаписать чужую работу.
- Можно пользоваться как через CLI, так и помощью спец. программ git-клиентов
Install
MacOS git install: brew install git
MacOS openssh install: brew install openssh
Настройка
git config --list- Показывает список конфигурацийgit config --global user.name "Evgeny Leukhin"- Установить глобальное имя пользователяgit config --global user.email "EvgenyLeukhin@yandex.ru"- Установить глобально адрес почты пользователяgit config --global push.default simple- Настройка команды git push. Будет пушить только в текущую веткуgit help <git_command>- Справочник для отдельных гит-команд
Репозиторий
git init (--bare)- Создать (только для истории, без файлов)git clone <path> (.)- Склонировать (в текущую директорию)git remote add <rep_name> <path>- Привязать удаленный репозиторийgit remote rm <rep_name>- Отвязать удаленный репозиторийgit remote -v- Посмотреть привязанные репозитории
Ветки
git branch (-v)- Показать все ветки репозитория (с инфой), текущую веткуgit branch <branch_name>- Создать новую веткуgit checkout <branch_name>- Переключиться в указанную веткуgit checkout -f <branch_name>- Переключиться фосированно в указанную ветку (с удалением зезакоммиченных изменений)git checkout (-b) <branch_name>- Создать новую ветку (и сразу переключиться в неё)git checkout -b <branch_name> <commit_hash>- Создать новую ветку (и сразу переключиться в неё) от указанного коммитаgit branch -d (-D) <branch_name>- Удалить указанную ветку (принудительно)git merge <branch_name>(--ff-only) - Сделать слияние указанной ветки с текущей (принудительно)git merge --abort- Отменить слияние
Изменения
git status- Статус файловgit commit -am "commit message"- Добавление измененных файлов в коммит и коммит (одновременно)git add <filename> <filename2>- Добавить указанные измененные файлы в индексgit add .||git add -A (--all)- Добавить все указанные измененные в индексgit restore <filename1> <filename1- Восстановить удаленный файлgit restore --staged <filename1> <filename1- Убрать файлы из индексаgit checkout <filename> <filename2>- Убрать указанные измененные файлы из коммитаgit checkout <filename> <commit_hash>- Вернуть состояние файла, какое оно было в указанном коммитеgit checkout -- .- Убрать измененния во всех файлахgit reset HEAD <filename>- Если случайно добавили файл, а потом решили, что нужно его убрать из коммита, но при этом не удалять в нём измененияgit rm (--cached) <filename>- Удалить файл из коммита и с диска (не удалять с диска), если случайно добавили ненужный файл в коммит и закоммитили его, далее выполнить команду нижеgit commit --amend --no-edit- Измнить последний коммит, без изменения сообщения, если удалялись или изменялись файлы в коммитеgit commit -m "<commit_message>"- Создать коммитgit commit --amend -m "<commit_message>"- Измнить коммит-сообщениеgit diff <filename>- Посмотреть непроиндексированные изменения (до git add)git diff --staged <filename>- Посмотреть проиндексированные изменения (после git add)git log (-3)- Получить список коммитов до текущего (последних трёх)git log --oneline- Получить список коммитов до текущего в одну строкуgit log --all- Получить всю историю (не только до текущего)git log -p -3- ... с выводом диффа по каждому коммитуgit log --oneline --all --graph- Получить всю историю (с графиком)git cat-file -p <commit_hash>- Посмотреть информацию о коммитеgit checkout <commit_hash>- Переключиться в указанный коммитgit checkout <branch_name>- Переключиться в последний коммит указанной веткиgit reset <commit_hash> (--hard)- Сбросить историю до указанного коммита (принудительно)git clean -f -d- Удалить лишние файлы
git show <commit_hash>- Посмотреть дифф в этом коммитеgit blame filename- Посмотреть историю изменений файлаgit grep import- Показать список файлов, где есть строка "import"
git checkout -b new-branch-name <new-branch-name>- Удалить лишние файлы
git revert comit_hash- Удалить изменеия комита в текущей ветке (будет создан новый коммит, который удаляет дифф указанного коммита)git revert comit_hash1 comit_hash2 comit_hash3- Удалить изменеия комитов в текущей ветке (будет создан новый коммит, который удаляет дифф указанного коммита)
Сбросить ветку до той, которая находится в romote. Допустим в вас локально есть какие-то неотправленные коммиты в ветке main и вы не хотите их отправлять и хотите сбросить до состояния, которое в репозитории:
git reset --hard origin/main- Удалить изменеия комитов в текущей ветке (будет создан новый коммит, который удаляет дифф указанного коммита)
Отправка / Принятие
git pull <remote_name> <branch_name>- Принять измененияgit push <remote_name> <branch_name>:<remote_branch_name> (-f)- Отправить изменения (принудительно)
Rebase
Перебазирование ветки, сдвигаем первый коммит дочерней ветки в состояние последнего коммита родительской.
Актуально, когда родительская ветка наполниласть новыми коммитами после создания дочерней ветки и при этом перебазировании можно заблаговременно исправить все конфликты, находясь в дочерней ветке.
Переключаемся в родительскую ветку
git checkout <parent_brunch_name>Забираем все новые коммиты
git pull origin <parent_brunch_name>Переключаемся в дочернюю ветку
git checkout <child_brunch_name>Перебазируемся в родительскую ветку. При этом могут возникать конфликты, которые нужно разрешать
git rebase <parent_brunch_name>Разрешаем конфликты, сохраняем, добавляем разрешенные файлы в отслеживание
git add <conflict_file_name>Продолжаем перебазирование (5 и 6 пункты могут повторяться несколько раз)
git rebase --continueЕсли все конфликты решены и перебазирование закончено, то можно форсированно пушить изменения дочерней ветки
git push origin -fCвязываем ветку с origin и пушим её на сервер
git push -u origin deploy
Squash commits
Схлопывание нескольких коммитов в один.
Актуально, когда мы имеем много непонятных коммитов в процессе разработки и хотим оставить один понятный, когда работа по созданию нового функционала уже закончена, и при этом в истории останется один понятый коммит.
I. Делаем ребейз ветки (интелектуальный), возможны моменты, описанные выше.
git rebase -i <parent_brunch_name> 1. pick
2. pick -> s
3. pick -> s
...
10. pick -> s
II. Меняем в vim pick -> s (или squash), кроме первого коммита
III. Пишем финальный commit-message "Add new feature"
IV. Форсированно пушим эти изменения
git push origin -fCherry pick
git cherry-pick <commit-hash> - Влить изменения определенного коммита в текущую веткуGit clone + SSH
I. Во время установки Git устанавливаем OpenSSH-клиент II. В директории пользователя ОС создаём папку .ssh III. В этой директоии создаём файл config без разрешения, в котором будет находиться список хостов.
# github.com
Host github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa
# gitlab.com
Host gitlab.com
Preferredauthentications publickey
IdentityFile ~/.ssh/id_rsa
// old
# github.com
HostName github.com
User git
AddKeysToAgent yes
PubkeyAuthentication yes
IdentityFile ~/.ssh/id_rsa
PreferredAuthentications publickey
# Some site
Host some_server
Hostname 192.168.12.12
# gitLab.com
Host gitlab.com
RSAAuthentication yes
IdentityFile ~/.ssh/id_rsa
# git.codenetix.com
Host git.codenetix.com
RSAAuthentication yes
IdentityFile ~/.ssh/id_rsa
# github.com
Host github.com
RSAAuthentication yes
IdentityFile ~/.ssh/id_rsa
IV. Пишем команду в этой директории для гинерации ключей ssh-keygen -C "Jenya@FERMA21"
V. Добавляем содержимое сгенерированого публичного ключа id_rsa.pub в конец строки файла .ssh/autorized_keys на сервере
VI. Можно заходить на сервер командой ssh some_server и пользоваться гитом
Personal Access token
Редактирование последнего коммита
Допустим, что вы создали коммит и сохранили его в текущую ветку или уже запушили в репозиторий
git log -1- Посмотреть последний коммитgit commit --amend -m "New message"- Создать (только для истории, без файлов)git push -f- Форсированный пуш в репо
В логе коммитов не останется старого коммита, новый отредактированный перезатрет старый при форс пуше.
Редактирование коммитов (изменение истории)
I. Начинаем rebase, указываем кол-во коммитов в HEAD
git rebase -i HEAD~10 - Запустить интерактивный ребейс текущей ветки 10 коммитовII. Редактируем
Попадаем в VIM, нажимаем на i для редактирования
Снизу свежие, наверху старые
Команды:
- p(pick) - Остается без изменения (по умолчанию)
- r(reword) - Изменить коммит-месседж
- f(fixup) - Склейка коммита (приклеиваются к первому) без коммит-мессаджа
- s(squash) - Склейка коммита
- d(drop) - Удалить коммит
III. После редактирования нажимаем Ctrl + C, :wq + Enter - сохраняем
IV. Пишем новый коммит-мессадж, Ctrl + C, :wq + Enter - сохраняем
V. Делаем форсированный пуш
git push -f- пушим с форсом
GitHub CLI (https://cli.github.com/)
# install github cli
brew install gh
# authorization --> Пройти авторизацию через браузер
gh auth login
# clone repo
gh repo clone EvgenyLeukhin/product-hired-admin
# show readme
gh repo view
# Релиз
gh release create 1.0
GitLens
TODO