Page N.

Git

Что мы знаем о данном инструменте?

План

  • Кратко о git. что это такое...
  • Настройка гита. Установка. Авторизация.
  • Настройка гита. Генерация персонального ключа.
  • Настройка гита. Настройка ключа.
  • Общий принцип работы гита.
  • Просмотр изменений и текущих изменений.
  • Получение изменений pull / fetch.
  • Крутотеньки. Rebase.
  • Крутотеньки. Fixup коммиты.

Кратко о git. что это такое...

Это децентрализованная система контроля версий

1. Контроль версий представляется так что в каждом ТЕКСТОВОМ файле мы можем посмотреть кто и что менял и когда.

2. Все именения выглядят как patch, то есть в каком файле в после каких строк надо добавить новые строки

3. Некоторое количество изменений то есть коммит (некая минимальная структурная единица информации определенная одним автором как логически завершенные изменения)

4. Мы можем пользоваться гитом локально а также менять/добавлять цдаленные хранилища

5. изменения в гите это коммиты которые представляют собой граф (позже поглядим на них)

Также есть отличная книга по гиту https://git-scm.com/book/ru/v2

Настройка гита. Установка.

Вначале надо установить на систему git.

Под linux на базе дебиан (ubuntu): apt install git

Под windows: скачать с оффициального сайта

Под mac: раньше через brew можно было поставить на текущий момент я без понятия

Настройка гита. Авторизация.

Есть два типа авторизации в гите (мне известно только о них):

  • Через basic auth то есть типа
    git clone http://user:pass@site.com/repos/repo1 repo1_via_basicauth.git
  • или через ssh-ключ
    git clone git@site.com:repos/repo1 repo1_via_ssh.git
    (но ключ надо предварительно настроить см далее)

repo1_via_basicauth.git - директория в куда сколонировать репозиторий

repo1_via_ssh.git - диреткория в куда сколонировать репозиторий

Настройка гита. Генерация персонального ключа.

Сгенерируем ключ (при геннерации указываем путь до ключв ~/.ssh/test и пассфразу оставляем пустую):

$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com" -f ~/.ssh/test
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/seakg/.ssh/test
Your public key has been saved in /home/seakg/.ssh/test.pub
The key fingerprint is:
SHA256:tMSgiRfuDgtU3AOMxZ2zlDmVlTAyHzJy9wCmLUgtCeI your_email@example.com
The key's randomart image is:
+---[RSA 4096]----+
....
+----[SHA256]-----+

Статья от github: connecting-to-github-with-ssh

Публичный ключ test.pub - содержимое его как раз и закидываем в github / gitlab / bitbucket / gitverse и так далее

Настройка гита. Настройка ключа.

в ~/.ssh/config можем прописать какой ключ и для какого сервера надо использовать (удобно для разделения рабочих ключей и личного а также для работы с разными серверами).

Host github.com
  User git
  IdentityFile ~/.ssh/test

Host 192.168.1.1
  User git
  Port 8022
  IdentityFile ~/.ssh/test

Host bitbucket.org
  User git
  IdentityFile ~/.ssh/test2
              

~/.ssh/test - будет использоваться для работы с github.com

~/.ssh/test2 - будет использоваться для работы с bitbucket.org

Кроме IdentityFile можно всякого там настроить напрмиер User а остальное лучше погуглить

Также в этом файле можно настраивать ключи для доступа к сервера по ssh (чтобы также можно было использовать разные ключи к разным серверам)

Переодически возникает проблема с правами до конфига и до ключей, потому выставляем такие вот права:

$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/*
              

Общий принцип работы гита.

Картинку

Просмотр изменений и текущих изменений.

Показывает изменные файлы и файлы добавленные для коммита:

$ git status

Показывает все ветки

$ git branch -a -v

показывает историю изменений на текущей ветки

$ git log

Тоже что и git log но только в однострочном формате

$ git log --oneline

Тоже что и git log но только в однострочном формате и в виде графа

$ git log --oneline --graph

Показывает историю изменений в однострочном формате, в виде графа для всех веток

$ git log --oneline --graph --all

Показывает изменёные файлы из коммита

$ git diff-tree --no-commit-id --name-only -r 61ea1ed552f06612c2cbeec48c85c23fbf9495c4

Получение изменений pull / fetch.

Забирает изменение из внешнего репозитория и пытается применить их на текущей ветке (если таковые есть):

$ git pull

Делает тоже что и pull + удаляет те ветки которые были удалены во внешнем репозитории (только в origin):

$ git pull -p

Получает все изменения из внешнего репозитория но не применяет их:

$ git fetch

Крутотеньки. Rebase.

Удобно для персональных веток (!!!) или еще не закомиченных изменений или приведение в порядок ветки:

$ git rebase origin/master

Можем поменять порядок коммитов или засквошить (то есть обьеденить коммиты):

$ git rebase -i HEAD~5

Крутотеньки. Fixup коммиты.

Удобно для персональных веток (!!!) или еще не запушенных коммитов:

$ git add some_file
$ git commit --fixup=7da9c4f09995bb0f02bd77e125fd5d50c5039a1b
$ git rebase -i --autosquash 7da9c4f09995bb0f02bd77e125fd5d50c5039a1b~1
# git push -f
              

Свой git-сервер. Gogs.

Вот и пришло время делать свой гит/джит-сервер: https://github.com/gogs/

Создаем docker-compose.yml:

services:
  my_gogs:
    image: gogs/gogs:0.13
    ports:
      # - 10022:22
      - 10880:3000
    volumes:
      - ./gogs:/data
    restart: always
    networks:
      - gogs_net

networks:
  gogs_net:
    driver: bridge
              

Запускаем командой 'docker compose up'

Открываем на порту 10880 - Делаем найстройки первый раз

Готово можно пользоваться через http