Рассмотрим в этом уроке как получить проект из GitHub на локальную машину и как работать с проектом на двух компьютерах, например, из дома и с работы.
Клонирование - получение всего репозитория. На гитхабе раньше была кнопка Clone or Download. Но затем этот блок изменили и теперь есть кнопка Code при нажатии на которую появляются инструменты клонирования и скачивания.
Самое популярное решение - клонирование репозитория по протоколу SSH (см. скриншот). Но также можно выбрать HTTPS протокол или просто скачать ZIP-архив.
Раньше при использовании HTTPS и каждой отправке изменения или получении репозитория нужно было вводить пароль от Гитхаба. При использовании SSH мы один раз генерируем ключи на каждом компьютере и добавляем их в Гитхаб.
При этом мы уже знаем, что приватный SSH ключ мы можем защитить паролем, что улучшает безопасность использования данного метода.
Даже если кто-то украдет ваш ключ, вы просто удалите его из Гитхаба в Настройках (Settings) и зададите новый.
Но бывает так, что SSH не работает по каким-либо причинам - настройка сети в организации или по другой причине. Тогда у нас остается вариант работы только с HTTPS.
Мы выбираем SSH. Копируем на github адрес и вставляем в терминал:
$ git clone <ssh_key>
Вот так проходит процесс клонирования:
Теперь посмотрим лог:
$ git log --oneline
Мы увидим все коммиты:
Также мы видим, что находимся в ветке master. Кроме того есть еще два дополнительных указателя - origin/master и origin/HEAD.
Указатель origin - это имя удаленного репозитория и так принято его называть в мире разработчиков. Мы можем проверить это таким образом:
$ git remote -v
В гитхабе HEAD всегда будет указывать на master, если вы не измените этого сами в настройках репозитория на самом Гитхабе.
Теперь, если после клонирования мы сделаем новый коммит, то он не появится на Гитхабе, а будет только на локальной машине. Поэтому для отправки изменений в удаленный репозиторий есть команда push (рус. толкать или отправить), а для получения pull (рус. - тянуть).
Отправляем новые изменения следующей командой:
$ git push origin master
Этот процесс займет немного времени и терминал выведет:
Если мы создаем ветки и коммиты локально, что они не появляются на Гитхабе автоматически. Если мы создаем ветку comments, то команда отправки на Гитхаб всех изменений будет выглядеть так:
$ git push origin comments
И мы увидим отчет в терминале, что изменения отправлены:
При этом мы теперь на самом GitHub сможем выбрать нужную нам ветку:
При этом важно понимать, что для разных веток состояние репозитория будет отличаться, если в ветках сделаны разные изменения.
Если мы сделали ошибку в названии ветки, но хотим это исправить, то нам нужно сделать пуш в правильную ветку вот такой командой:
$ git push origin cmments:comments
Таким образом можно отправить любую локальную ветку в удаленную ветку даже если у них разные имена. При этом старая ветка на GitHub останется.
Чтобы удалить старую ветку, которая нам теперь не нужна, мы используем команду:
$ git push origin :cmments
Т.е. мы, условно, пушим "ничего" в старую ветку в удаленный репозиторий. Но теперь на удаленном репозитории старой ветки нет, а локально она есть со старым названием. Нам нужно использовать на локальной машине в терминале такую команду:
$ git branch -m comments
Команда branch может переименовывать, создавать и удалять ветки.
git checkout -b branch-name
создаст ветку с указанным именем и автоматически переключится на неё. Для переключения на существующую ветку выполните команду git checkout
. Для переключения, например, на ветку testing используем команду $ git checkout testing
. В результате указатель HEAD переместится на ветку testing.Чтобы нам наглядно посмотреть ветки в CMDER мы используем команду:
$ git log --oneline --graph --all
Допустим, вы сделали коммиты на рабочем компьютере и теперь хотите поработать дома. Нам нужно получить эти коммиты на домашний компьютер.
Если нам нужно получить изменения ветки master, значит нам нужно быть в ветке master. Для этого убеждаемся, что мы находимся в ветке master:
$ git status
И далее вводим команду:
$ git pull origin master
Что делать, если кроме ветки master нам нужна ветка, которая создана в удаленном репозитории и про которую локальный Git ничего не знает?
Для этого мы используем команду fetch (рус. -получить, принести):
$ git fetch origin
Эта команда позволит забрать изменения из удаленной ветки:
Схематично это выглядит так:
Указатели origin/master и origin/comments (из примера) нельзя удалить или переименовать.
Теперь для примера мы создадим ветку comments, которая будет указывать на тот же коммит, что и origin/comments:
$ git checkout -b comments origin/comments
Если вы внесли изменения в файлы и сделали новые коммиты на домашнем компьютере, то нам нужно отправить их в GitHub, чтобы иметь возможность работать с новыми изменениями с рабочего компа.
Для ветки comments мы можем написать следующую команду:
$ git push origin comments
Но что, если мы хотим всё время пушить comments в comments на GitHub, а локальный master в удаленный master? У нас есть возможность связать локальную ветку с удаленной:
$ git branch --set-upstream-to=origin/comments
В примере выше вместо origin/comments вы можете указать имя удаленной ветки с которой вы хотите связать текущую.
Теперь находясь в этой ветке нет необходимости писать названия веток для команды git push или git pull.
Чтобы посмотреть какие локальные ветки связаны с удаленными мы используем:
$ git branch -vv
Терминал нам покажет какие ветки с какими связаны:
Видно, что comments связана с веткой origin/comments и отмечена звездочкой - мы в ней находимся, а master связан с origin/master.
Теперь мы просто можем писать в терминале:
$ git push
Т.е. мы не вводили имена веток.