Page N.

Git

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

План

  • Слайд 2: Кратко о git. что это такое...
  • Слайд 3: Настройка гита. Установка.
  • Слайд 4: Настройка гита. Авторизация.
  • Слайд 5: Настройка гита. Генерация персонального ключа.
  • Слайд 6: Настройка гита. Настройка ключа.
  • Слайд 7: Общий принцип работы гита.
  • Слайд 8: Просмотр изменений и текущих изменений.
  • Слайд 9: Получение изменений pull / fetch.
  • Слайд 10: Коммиты. Закрепление изменений.
  • Слайд 11: Стеш. Временное хранилище изменений..
  • Слайд 12: Крутотеньки. Rebase.
  • Слайд 13: Крутотеньки. Fixup коммиты.
  • Слайд 14: Свой git-сервер. Gogs.
  • Слайд 15: Свой git-сервер. Forgejo.

Кратко о 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

Также есть удобная комманда обновления локальных изменений (если кто то раньше вас закомитил а вы хотите историю оставить линейной):

$ git pull --rebase

Коммиты. Закрепление изменений

В гите для изменений у файлов есть пару состояний. А именно это состояния "изменен файл" и "изменений попадут в коммит"

Чтобы добавить файл целиком к будущему коммиту:

$ git add here_file_path_or_dir

Чтобы добавить только часть изменений из файла к будущему коммиту:

$ git add -p here_file_path

Сделать коммит (закрепить изменения) с сообщением:

$ git commit -m "Fixed some..."

Нууу и отправить сделанные коммиты но удаленный сервер:

$ git push

Стеш. Временное хранилище изменений.

Если вы делаете rebase или просто надо сохранить временно изменения или перенести на другую ветку.

Посмотреть список сохраненых изменений

$ git stash list

Добавить в стеш (все локальные изменененные файлы о которых знает гит туда попадут)

$ git stash

Вытащить из стеша обратно:

$ git stash pop

Крутотеньки. 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

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

Вот тут оффициальный ман для установки и настройки: https://forgejo.org/docs/latest/admin/installation/docker/

Платформа Forgejo является форком проекта Gitea, который в свою очередь ответвился от платформы Gogs. Ключевыми особенностями Forgejo является низкое потребление ресурсов (может использоваться в дешёвых VPS) и простой процесс установки. Предоставляются типовые возможности работы с проектами, такие как управление задачами, отслеживание проблем (issues), pull-запросы, wiki, средства для координации групп разработчиков, подготовка релизов, автоматизация размещения пакетов в репозиториях.

Создаем docker-compose.yml (взято с офф примера):

networks:
  forgejo:
    external: false

services:
  server:
    image: codeberg.org/forgejo/forgejo:11
    container_name: forgejo
    environment:
      - USER_UID=1000
      - USER_GID=1000
    restart: always
    networks:
      - forgejo
    volumes:
      - ./forgejo:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - '3000:3000'
      - '222:22'