Git
Version Control System. Обратите внимание, что с октября 2020 года GitHub изменил название ветки по умолчанию с master
на main
.
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 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 --oneline --all --graph
- Получить всю историю (с графиком)git show <commit_hash>
- Посмотреть какие были изменения в этом коммитеgit cat-file -p <commit_hash>
- Посмотреть информацию о коммитеgit checkout <commit_hash>
- Переключиться в указанный коммитgit checkout <branch_name>
- Переключиться в последний коммит указанной веткиgit reset <commit_hash> (--hard)
- Сбросить историю до указанного коммита (принудительно)git clean -f -d
- Удалить лишние файлы
git checkout -b new-branch-name <new-branch-name>
- Удалить лишние файлы
git revert comit_hash
- Удалить изменеия комита в текущей ветке (будет создан новый коммит, который удаляет дифф указанного коммита)git revert comit_hash1 comit_hash2 comit_hash3
- Удалить изменеия комитов в текущей ветке (будет создан новый коммит, который удаляет дифф указанного коммита)
Отправка / Принятие
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 -f
Cвязываем ветку с origin и пушим её на сервер
git push -u origin deploy
Squash commits
Схлопывание нескольких коммитов в один.
Актуально, когда мы имеем много непонятных коммитов в процессе разработки и хотим оставить один понятный, когда работа по созданию нового функционала уже закончена, и при этом в истории останется один понятый коммит.
- Делаем ребейз ветки (интелектуальный), возможны моменты, описанные выше.
git rebase -i <parent_brunch_name>
1. pick
2. pick -> s
3. pick -> s
...
10. pick -> s
Меняем в vim pick -> s (или squash), кроме первого коммита
Пишем финальный commit-message "Add new feature"
Форсированно пушим эти изменения
git push origin -f
Cherry pick
git cherry-pick <commit-hash>
- Влить изменения определенного коммита в текущую веткуGit clone + SSH
- Во время установки Git устанавливаем OpenSSH-клиент
- В директории пользователя ОС создаём папку .ssh
- В этой директоии создаём файл 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
- Пишем команду в этой директории для гинерации ключей
ssh-keygen -C "Jenya@FERMA21"
- Добавляем содержимое сгенерированого публичного ключа
id_rsa.pub
в конец строки файла.ssh/autorized_keys
на сервере - Можно заходить на сервер командой
ssh some_server
и пользоваться гитом
Personal Access token
Редактирование последнего коммита
Допустим, что вы создали коммит и сохранили его в текущую ветку или уже запушили в репозиторий
git log -1
- Посмотреть последний коммитgit commit --amend -m "New message"
- Создать (только для истории, без файлов)git push -f
- Форсированный пуш в репо
В логе коммитов не останется старого коммита, новый отредактированный перезатрет старый при форс пуше.
Редактирование коммитов (изменение истории)
- Начинаем rebase, указываем кол-во коммитов в HEAD
git rebase -i HEAD~10
- Запустить интерактивный ребейс текущей ветки 10 коммитов- Редактируем
Попадаем в VIM, нажимаем на i для редактирования
Снизу свежие, наверху старые
Команды:
- p(pick) - Остается без изменения (по умолчанию)
- r(reword) - Изменить коммит-месседж
- f(fixup) - Склейка коммита (приклеиваются к первому) без коммит-мессаджа
- s(squash) - Склейка коммита
- d(drop) - Удалить коммит
После редактирования нажимаем
Ctrl + C
,:wq
+ Enter - сохраняемПишем новый коммит-мессадж,
Ctrl + C
,:wq
+ Enter - сохраняемДелаем форсированный пуш
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