Skip to main content

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

Перебазирование ветки, сдвигаем первый коммит дочерней ветки в состояние последнего коммита родительской.

Актуально, когда родительская ветка наполниласть новыми коммитами после создания дочерней ветки и при этом перебазировании можно заблаговременно исправить все конфликты, находясь в дочерней ветке.

  1. Переключаемся в родительскую ветку

    git checkout <parent_brunch_name>
  2. Забираем все новые коммиты

    git pull origin <parent_brunch_name>
  3. Переключаемся в дочернюю ветку

    git checkout <child_brunch_name>
  4. Перебазируемся в родительскую ветку. При этом могут возникать конфликты, которые нужно разрешать

    git rebase <parent_brunch_name>
  5. Разрешаем конфликты, сохраняем, добавляем разрешенные файлы в отслеживание

    git add <conflict_file_name>
  6. Продолжаем перебазирование (5 и 6 пункты могут повторяться несколько раз)

    git rebase --continue
  7. Если все конфликты решены и перебазирование закончено, то можно форсированно пушить изменения дочерней ветки

    git push origin -f
  8. Cвязываем ветку с origin и пушим её на сервер

    git push -u origin deploy

Squash commits

Схлопывание нескольких коммитов в один.

Актуально, когда мы имеем много непонятных коммитов в процессе разработки и хотим оставить один понятный, когда работа по созданию нового функционала уже закончена, и при этом в истории останется один понятый коммит.

  1. Делаем ребейз ветки (интелектуальный), возможны моменты, описанные выше.
git rebase -i <parent_brunch_name>

1. pick
2. pick -&gt; s
3. pick -&gt; s
...
10. pick -&gt; s
  1. Меняем в vim pick -> s (или squash), кроме первого коммита

  2. Пишем финальный commit-message "Add new feature"

  3. Форсированно пушим эти изменения

    git push origin -f

Cherry pick

git cherry-pick <commit-hash> - Влить изменения определенного коммита в текущую ветку

Git clone + SSH

  1. Во время установки Git устанавливаем OpenSSH-клиент
  2. В директории пользователя ОС создаём папку .ssh
  3. В этой директоии создаём файл 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
  1. Пишем команду в этой директории для гинерации ключей ssh-keygen -C "Jenya@FERMA21"
  2. Добавляем содержимое сгенерированого публичного ключа id_rsa.pub в конец строки файла .ssh/autorized_keys на сервере
  3. Можно заходить на сервер командой ssh some_server и пользоваться гитом

Personal Access token

Gitlab link


Редактирование последнего коммита

Допустим, что вы создали коммит и сохранили его в текущую ветку или уже запушили в репозиторий

  • git log -1 - Посмотреть последний коммит
  • git commit --amend -m "New message" - Создать (только для истории, без файлов)
  • git push -f - Форсированный пуш в репо

В логе коммитов не останется старого коммита, новый отредактированный перезатрет старый при форс пуше.


Редактирование коммитов (изменение истории)

  1. Начинаем rebase, указываем кол-во коммитов в HEAD
git rebase -i HEAD~10 - Запустить интерактивный ребейс текущей ветки 10 коммитов
  1. Редактируем
  • Попадаем в VIM, нажимаем на i для редактирования

  • Снизу свежие, наверху старые

    Команды:

    • p(pick) - Остается без изменения (по умолчанию)
    • r(reword) - Изменить коммит-месседж
    • f(fixup) - Склейка коммита (приклеиваются к первому) без коммит-мессаджа
    • s(squash) - Склейка коммита
    • d(drop) - Удалить коммит
  1. После редактирования нажимаем Ctrl + C, :wq + Enter - сохраняем

  2. Пишем новый коммит-мессадж, Ctrl + C, :wq + Enter - сохраняем

  3. Делаем форсированный пуш

    • 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