Удалённые репозитории
Удалённый репозиторий - это сервис, который будет хранить все изменения не локально на нашем компьютере, а на удалённом устройстве.
Это даёт нам:
- Дополнительную безопасность в том случае, если мы сотрём проект на нашем локальном устройстве
- Возможность разрабатывать совместно в несколько лиц
Создание репозитория
При создании репозитория можно выбрать:
- Владельца (профиль/организация)
- Имя репозитория (уникальное для владельца)
- Описание
- Доступность видимости
- Начальный README\
- Начальный гитигнор
- Выбор типа лицензии
Дабы подключиться к интересующему нас репозиторию, нам нужно будет выполнить команду над удалённым репозиторием remote
и добавить add
сам репозиторий по имени origin
, который будет распологаться по ссылке, указывающей на этот удалённый репозиторий.
Далее нам нужно будет воспользоваться командой для отправки репозитория на удалённый сервер push
, в которой нужно будет указать основное имя удалённого репозитория origin
а затем указать имя отправляемой ветки
Но, если мы создали приватный репозиторий, то доступа отправлять на него запросы по https - у нас нет.
Создание SSH-ключа
SSH-ключи нужны для безопасного взаимодействия между локальным и удалённым репозиторием. SSH предоставляет доступ и права для безопасного выполнения команд на удалённой машине.
- SSH-ключ: состоит из приватной и публичной части, позволяет безопасно отправлять изменения в удаленные репозитории.
- Приватный ключ: хранится на локальной машине и используется для аутентификации.
- Публичный ключ: размещается на сервере или сервисе (например, GitHub), подтверждает, что изменения отправлены именно вами.
Первым делом нужно создать новый ключ. Сгенерировать его можно с помощью дефолтной утилиты системы.
При создании ключа стоит сохранить его с предлагаемым наименованием (обычно id_rsa
или id_ed
) для удобства.
Можно пропустить ввод парольной фразы (passphrase) для простоты, хотя она добавляет дополнительный уровень безопасности на случай того, если наш секретный ключ узнали.
Публичная часть ключа (id_ed.pub
) может делиться с сервисами типа GitHub для идентификации
Приватная часть (id_ed
) остаётся у вас и не должна передаваться никому.
На примере гитхаба, создание SSH-ключа будет выглядеть следующим образом:
И в поле key при создании ключа, мы должны будем добавить сгенерированный fingerprint (который есть в выводе сверху)
После всех действий мы наконец можем клонировать проекты по SSH и пушить в них изменения
Важно: Если публичный ключ мы можем предоставлять любому сервису, то уже с приватной частью ключа следует обращаться аккуратно, не распространять и не хранить в общем доступе.
Git Remote
Команда get remote
позволяет работать с удалёнными репозиториями
Первым делом получим список удалённых репозиториев. Пока что мы тут получим только origin
Далее узнаем url на свой репозиторий. Тут у нас стоит пока https-соединение, которое нужно будет заменить на ssh.
А уже потом заменим подключение на ssh, чтобы работать полностью в рамках него, а не только через ssh-ключик.
И теперь у нас есть доступ к пушу изменений на удалённый репозиторий
Отправка новых изменений
При создании нового коммита можно заметить, что у нас добавилась новая ветка origin/master
, которая уже отвечает за ветку, совместимую с нашей, но которая находится на удалённом репозитории.
С помощью команды push
, мы отправляем наши сделанные коммиты на удалённый репозиторий origin
(который мы определили ранее)
И все коммиты находятся в нашей истории коммитов
С помощью branch
с флагом --all
можно просмотреть так же и удалённые ветки
RTB - Remote tracking branches
Прцоесс отправки локальных изменений в удалённый репозиторий происходит не простым копированием из локального репозитория на удалённый. Всё происходит через посредника в виде tracking branch.
tracking branch (TB) - это представление удалённого репозитория локально.
remote
- удалённая / origin
- название удалённого репозитория / master
- наша основная ветка. Из этого представления изменения отправляются на удалённый сервер remote
Когда мы пушим через git push
, мы закидываем изменения в TB, который отправляет изменения на сервер.
Когда мы выполняем git pull
(подтягиваем изменения с сервера), мы подтягиваем список изменений в наш TB и потом объединяем изменения с локальным репозиторием.
Когда мы выполняем git pull
, то у нас под капотом выполняются git fetch
на первом этапе (подтягивание изменений с remote), а потом git merge
(объединение списка изменений с нашим локальным репозиторием).
Сам TB отслеживает изменения и сообщает о конфликтах
Пуш новой ветки
Когда мы попытаемся запушить дев ветку в первый раз на удалённый репозиторий, нам там так же придётся создавать представление dev ветки для нашего удалённого репозитория
Подтягивание удалённых изменений
Представим, что другой разработчик создал новую ветку и работает теперь в ней. Чтобы просмотреть изменения по веткам, нужно будет воспользоваться командой для отслеживания изменений в RTM
LTB - Local tracking branches
LTB находятся локально и связаны с другими удалёнными ветками для реализации бесшовного пула и пуша.
Флаг -vv
позволит вывести боллее подробную информацию по веткам.
После идентификатора ветки идёт его отношение к LTB, который и общается с RTB.
Отслеживание новых созданных веток в удалённом репозитории
И для того, чтобы научиться создавать локальные ветки, которые будут тречить удалённые изменения, нам нужно воспользоваться
Upstream
У нас есть более простой метод для связывания локальной ветки с удалённой через специальный флаг и указания имени удалённого репозитория
Таким образом мы легко создадим нужную нам LTB, которая будет бесшовно общаться с RTB
Клонирование репозитория
Для клонирования репозитория с удалённого ресурса существует git clone
Сейчас все наши локальные ветки пропали и подтянулись с удалённого репозитория только RTB и ветка master
Но чтобы автоматически создать LTB по нашим RTB, можно просто чекаутнуться в существующую на удалённом репозитории ветку и она автоматически подхватится без git branch --track
И вот в списке веток у нас автоматически созданные LTB
Удаление веток
И таким образом мы можем удалить удалённую ветку по её наименованию
Через эту команду можно посмотреть все удалённые ветки
Однако после локального удаления удалённой ветки, при поптыке пула изменений с удалённого репозитория, мы будем получать эту ветку обратно
Если мы хотим удалить удалённую ветку, то нам нужно будет запушить ивент по удалению определённой ветки через push
с флагом --delete
Force Push
Представим ситуацию, когда нам нужно удалить коммит не только локально, но и на удалённом репозитории
Для этого нам не достаточно будет просто откатить и запушить изменения, потому что при пуле мы получим этот коммит обратно
А при попытке запушить всю эту историю, нам TB высветит, что мы пушим неактуальные изменения
Чтобы обойти это ограничение и всё-таки запушить это изменение, мы можем отправить изменения с флагом --force