Просто про Git




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

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

Системы контроля изменений встроена почти в каждый текстовый редактор. Когда в "Word" или в "sublime text", "VScode", нажимаем комбинацию из клавиш: `ctrl + z` - тогда в последние изменения в файле отменяются, а если мы нажмем: `ctrl + shift + z` - в таком случае отмененные изменения вновь применяться.*


* "ctrl + z" - в ОС windows для OC linux или macOS - "cmd + z"
"ctrl+shift+z"-в ОС windows для OC linux или macOS - "cmd+shift+z" 

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

Вернемся к git, если работая с классическими редакторами мы имеем только "одну тропинку", то git позволяет нам создавать много таких тропинок и по необходимости перепрыгивать с одной на другую, мы можем создавать новую тропинку из старой а потом совмещать их в одну. С git мы можем жестко фиксировать каждый шажок - изменение, и как-будто используя 'ctrl+z' откатываться на предыдущий шаг и т.д. Но довольно аналогии, надеюсь вы поняли общую концепцию git. В любом случае хочу посоветовать следующие материалы:

В целом, git - набор консольных утилит, безусловно у него есть надстройки в виде GUI, но вернемся к ним чуть позже, пока сосредоточимся на работе git в cli.

Работа с git репозиторием может строиться по нескольким сценариями:

  • Нет локального репозитория ни удаленного
  • Есть удалленный репозиторий но нет локального
  • Есть локальный репозиторий и удаленный - классическая работа

Сценарий №1

Для начала рассмотрим вариант когда у нас нет ни какого репозитория, есть только папка нашего проекта, проект может состоять из одного файла.

Нам необходимо в консоле нашей ОС зайти в папку проекта, и первым делом инициализировать в папке наш репозиторий - объявить что данная папка это репозиторий, инициализация происходи одной командой:

git init

* Внимание: инициализировать репозиторий необходимо один раз на одной компьютере, и только в корневой папке проекта

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

 
git add .

* Внимание: данная команда добавит для отслеживания все объекты в директории, иногда это может быть не желательно т.к. директория проекта может содержать объекты которые не надо добавлять в git и в репозиторий, например: файл БД, конфигурационные файлы с паролями, медиа файлы (картинки, видео, аудио файлы)

После указания гиту файлов для отслеживания, мы должны зафиксировать (закомитить - от слова комит, commit) изменения в выше указанных файлах, сделаем это командой:

git commit -m "first commit"

* примечание: данную команду всегда используем с флагом "-m" и аргументом, который является комментарием

Далее нам необходимо указать адрес удаленного сервера, где будет храниться "главная копия" нашего репозитория.

 
git remote add origin git@github.com:username/name_project.git

* примечание: адрес можно получить при создании репозитория, через интерфейс

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

git push -u origin master

* примечание:

Готово! Мы создали репозитория и сохранили (запушили) его на сервере.

Миссия выполнена ‎‎✅

Сценарий №2

Рассмотрим сценарий, когда нас пригласили работать над новым для нас, проектом, но проект уже существует в удаленном репозитории, и нам нужно клонировать репозиторий к себе локально. Клонирование репозитория происходи следующей командой:

git clone git@github.com:username/name_project.git

* примечание: адресы репозитория нам должен сообщить хозяин репозитория

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

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

git add name_file.py

* примечание: также можно указывать список файлов через пробел, например: "git add file1.py file2.py file3.py"

Создаем комит - фиксируем все изменения из файлах которые мы добавили предыдущей командой 'добавить'.

 
git commit -m "first commit"

* Обратите внимание, что вводить комментарий необходимо каждый раз, в ваших же интересах писать как можно более осмысленны message :)

Работая в ветке которая уже есть на удаленном сервере, необходимо помнить что её могут изменить, и ваша локальная версия ветки может устареть, для этого необходимо скачать последние версию с сервера, что можно сделать командой:

 
git pull

* примечание: При работе с данной командой может возникнуть конфликт - двух версий (между вашей локальной копией и копией на сервере), требующего решения

Пройдя весь путь, нам теперь необходимо сохранить наши изменения на сервере, возвращаясь к началу напоминаю что git - распределенная система, чтобы все кто работает над проектом вместе с вами увидели ваши изменения, и просто чтобы сделать резервную копию на удаленном сервере, мы должны послать (в дословном переводе "толкнуть") наши изменения, командой:

git push

* Надо помнить, при работе с веткой внося изменения, мы создаем новую версию, но тем временем кто-то тоже может работать с вашей веткой и обновлять версию на сервере быстрее и чаще чем вы, поэтому не забывайте делать "git pull"

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

Некоторые другие другие команды git.

Работа с git предполагает наличие нескольких веток

Чтобы посмотреть список всех локальных "веток", воспользуемся командой:

git branch 

* примечание: команда 'git branch' выведет список лишь тех веток которые вы создали на локальной машине, они отличаются от тех что хранятся на сервере

Переключение между ветками

 
git checkout <name_branch>

* примечание: в качестве аргумента, куда переключаться, можно указывать не только имя ветки но и hash commit

 

Работая с несколькими ветками и переключаясь между ними может появляться

git checkout .

* примечание: будте осторожны используя данную команду, она удалит все не за комментируемые (зафиксированные) измененния

 

Для просмотра не зафиксированных изменений, используем команду:

git status

 

Более краткую версию можно прочитать здесь.