User Tools

Site Tools


workbook:pyneng:pyneng-intro

PyNEng: Вводная тема

Темы:

  • Git
  • GitHub

Git

Git - это система контроля версий файлов (VCS - Version Control System) которая позволяет:

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

Терминалогия:

  • репозиторий - это директория с файлами за которыми будет следить git.
  • snapshot - это снимок состояния репозитория в какой-то конкретный момент, делается командой git commit -m “Some Comment”.

Файл, относительно Git, может находиться в одном из 4 состояниях:

  • untracked - файл находится в директории репозитория, но не добавлен в репозиторий, git за файлом не следит.
  • modified - файл был изменен, но еще не помечен как кандидат для комита.
  • staged - файл пометили как кандидат для ближайшего комита.
  • unmodified - файл не менялся с последнего комита.

Составные части проекта Git:

  • Каталог git (.git) - служебная информация, в частности снапшоты.
  • Рабочая директория - тут хранится текущая версия файлов
  • Staged area - список файлов которые будет добавлены при следющем комите.

В каждом снапшоте записываются изменения 3


Установка git

root@aee3:~# apt-get install git

Базовая настройка git

Что бы можно было комитить изменения нужно глобально настроить имя и почту, анонимные комиты не принимаются.

$ git config --global user.name "somename"
$ git config --global user.email "somename@someserver.ru" 

Посмотреть базовые настройки.

$ git config --list
user.name=somename
user.email=somename@someserver.ru
core.editor=nano
core.whitespace=off
core.excludesfile=~/.gitignore
advice.statusuoption=false
color.ui=true
push.default=current

Создание нового репозитория git

Сначала создаем директорию для репозитория и переходим в нее.

[~/workspace]
ubuntu@5260087: 
$ pwd
/home/ubuntu/workspace

[~/workspace]
ubuntu@5260087: 
$ mkdir pyneng

[~/workspace]
ubuntu@5260087: 
$ cd pyneng 

Для инициализации репозитория даем команду git init.

[~/workspace/pyneng]
ubuntu@5260087: 
$ git init
Initialized empty Git repository in /home/ubuntu/workspace/pyneng/.git/

[~/workspace/pyneng]
ubuntu@5260087: $  [master L|✔] 
11:09 $ 

Вся служебная информация git будет находиться в каталоге /home/ubuntu/workspace/pyneng/.git/.


Основные команды Git

git status - посмотреть текущее состояние git.

[~/workspace/pyneng]
ubuntu@5260087: $  [master L|✔] 
11:17 $ git status
On branch master

Initial commit

nothing to commit (create/copy files and use "git add" to track)

Это состояние сразу после инициализации, комитить еще нечего.
Создадим файл и посмотрим состояние.

[~/workspace/pyneng]
ubuntu@kostyana-kostyana-5260087: $  [master L|✔] 
11:17 $ touch TEST-FILE

[~/workspace/pyneng]
ubuntu@kostyana-kostyana-5260087: $  [master L|…1] 
11:22 $ git status
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        TEST-FILE

nothing added to commit but untracked files present (use "git add" to track)

Новый файл находится в состоянии untracked.

git add - этой командой сообщаем git, что надо следить за файлом

[~/workspace/pyneng]
ubuntu@5260087: $  [master L|…1] 
11:22 $ git add TEST-FILE 

[~/workspace/pyneng]
ubuntu@5260087: $  [master L|●1] 
11:25 $ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   TEST-FILE

 

Так же командой git add в stage area добавляются подредактированные файлы готовые к комиту.

git commit - комитим файлы, обязательно с коментарием.

[~/workspace/pyneng]
ubuntu@kostyana-kostyana-5260087: $  [master L|●1] 
11:27 $ git commit -m "Creatre TEST-FILE"
[master (root-commit) 69df590] Creatre TEST-FILE
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 TEST-FILE

[~/workspace/pyneng]
ubuntu@kostyana-kostyana-5260087: $  [master L|✔] 
11:31 $ git status
On branch master
nothing to commit, working tree clean

Таким образом, в общем случае, последовательность работы git будет такая:

  1. Создаем или редактируем файл
  2. git status - смотрим статус
  3. git add - добавляем файл в stage area
  4. git commit -m ““ - разом комитим все фаhttps://mykb.ru/lib/images/wrap.gifйлы находящиеся в stage area


GitHub

GitHub это крупнейший публичный git репозиторий, aka социальная сеть для разработчиков=).
Задания курса будут располагаться в приватном репозитории, туда же их надо будет сдавать на проверку.

Аунтификация на GitHub

Работать с github будем через ssh c аутентификацией по ключам.

Генерируем ssh ключ сдедующей командой:

kostya@blackpc:~/.ssh$ ssh-keygen -t rsa -b 4096 -C "git-email@someserver.ru"

Вывод команды:

kostya@blackpc:~/.ssh$ ssh-keygen -t rsa -b 4096 -C "git-email@someserver.ru"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/kostya/.ssh/id_rsa): /home/kostya/.ssh/github_rsa
/home/kostya/.ssh/github_rsa already exists.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/kostya/.ssh/github_rsa.
Your public key has been saved in /home/kostya/.ssh/github_rsa.pub.
The key fingerprint is:
SHA256:Q1S...QB8Ui...OZOi/xWo git-email@someserver.ru
The key's randomart image is:
+---[RSA 4096]----+
|   .. .....      |
|  ...... .       |
| .....  . .      |
|.. . ... .       |
|. . . .....      |
|.  .   ....      |
| .    . ..       |
|  .    ....      |
|   .........     |
+----[SHA256]-----+

В результате сгенерируется два ключа, открытую часть (github_rsa.pub) надо скопировать на GitHub:
Логинемся –> Кликаем на картинку профиля –> Settings –> SSH and GPG keys –> New SSH key

Еще раз, командой git config –list, проверяем, что в глобальных настройках git задано имя и почта используемые на github.
Если все хорошо, то тестируем соединение с github, должно быть так:

kostya@blackpc:~$ ssh -T git@github.com
Hi SomeOne! You've successfully authenticated, but GitHub does not provide shell access.

Работа с GitHub

Копирование репозитория с GitHub

Клонируем публичный репозиторий через https.

kostya@blackpc:~$ git clone https://github.com/magicmonty/bash-git-prompt.git .bash-git-prompt --depth=1
Cloning into '.bash-git-prompt'...
remote: Counting objects: 47, done.
remote: Compressing objects: 100% (39/39), done.
remote: Total 47 (delta 16), reused 16 (delta 7), pack-reused 0
Unpacking objects: 100% (47/47), done.
Checking connectivity... done.

Клонируем приватный репозиторий через ssh, аутентификацию по ключам сделали выше.

kostya@blackpc:~/pyneng$ git clone ssh://git@github.com/pyneng/online-3-konstantin
Cloning into 'online-3-konstantin'...
remote: Counting objects: 231, done.
remote: Compressing objects: 100% (178/178), done.
remote: Total 231 (delta 45), reused 227 (delta 44), pack-reused 0
Receiving objects: 100% (231/231), 92.75 KiB | 0 bytes/s, done.
Resolving deltas: 100% (45/45), done.
Checking connectivity... done.

kostya@blackpc:~/pyneng$ ll
total 12
drwxrwxr-x  3 kostya kostya 4096 сен  6 22:59 ./
drwxr-xr-x 35 kostya kostya 4096 сен  6 22:55 ../
drwxrwxr-x  4 kostya kostya 4096 сен  6 22:59 online-3-konstantin/

kostya@blackpc:~/pyneng$ cd online-3-konstantin/
✔ ~/pyneng/online-3-konstantin [master|✔] 
23:02 $ ll
total 24
drwxrwxr-x  4 kostya kostya 4096 сен  6 22:59 ./
drwxrwxr-x  3 kostya kostya 4096 сен  6 22:59 ../
drwxrwxr-x 17 kostya kostya 4096 сен  6 22:59 exercises/
drwxrwxr-x  8 kostya kostya 4096 сен  6 23:02 .git/
-rw-rw-r--  1 kostya kostya  550 сен  6 22:59 .gitignore
-rw-rw-r--  1 kostya kostya   30 сен  6 22:59 README.md

Последовательность работы с GitHub

Типовая последовательность работы будет такой:

  1. Переходим в локальный каталог репозитория
  2. git pull - синхронизируем локальный репозиторий с github
  3. Редактируем файлы
  4. git add - добавляем отредактированные файлы в stage area
  5. git status - смотрим че-как
  6. git commit -m ”“ - комитим изменения
  7. git push - отправляем изменения на github

git pull

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

✔ ~/pyneng/online-3-konstantin [master|✔] 
23:13 $ git pull
Already up-to-date.

Если иззменения были, то такой:

✔ ~/pyneng/online-3-konstantin [master|✔] 
23:13 $ git pull
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
Unpacking objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
From ssh://github.com/pyneng/online-3-konstantin
   958572d..bf58638  master     -> origin/master
Updating 958572d..bf58638
Fast-forward
 README.md | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

git push

Команда git push origin master отправляет изменения на github.

Изменили файл README.md и смотрим статус.

File README.md saved
✔ ~/pyneng/online-3-konstantin [master|✚ 1…1] 
23:18 $ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   README.md

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	README.md~

no changes added to commit (use "git add" and/or "git commit -a")

Добавляем файл README.md в stage area.

✔ ~/pyneng/online-3-konstantin [master|✚ 1…1] 
23:18 $ git add README.md

Локально комитим изменения.

✔ ~/pyneng/online-3-konstantin [master|●1…1] 
23:19 $ git commit -m "One more commit"
[master 2f368ca] One more commit
 1 file changed, 1 insertion(+)

Отправляем изменения на github.

✔ ~/pyneng/online-3-konstantin [master ↑·1|…1] 
23:19 $ git push origin master
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 373 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://git@github.com/pyneng/online-3-konstantin
   bf58638..2f368ca  master -> master
✔ ~/pyneng/online-3-konstantin [master|…1] 
workbook/pyneng/pyneng-intro.txt · Last modified: 2021/08/12 08:35 (external edit)

Page Tools