Работа с двух компьютеров

Рассмотрим в этом уроке как получить проект из 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

Т.е. мы не вводили имена веток.