Удалённый репозиторий: origin
Чтобы загрузить проект на GitHub, нужны два шага: сказать Git, куда отправлять (git remote add origin <адрес>), и отправить коммиты (git push). Сейчас вы сделаете оба и увидите свою визитку на сайте. Пустой репозиторий на GitHub уже ждёт, но Git о нём не знает: ему нужно дать адрес.
Представьте записную книжку с контактами. Вы не набираете длинный номер каждый раз, а записываете человека под коротким именем и потом звоните по имени. В Git роль такого контакта играет удалённый репозиторий (remote): адрес чужого репозитория, записанный под коротким именем. По традиции главный удалённый репозиторий называют **origin** («источник, откуда всё пошло»). Это обычное имя, а не ключевое слово, но весь мир говорит origin.
Записываем адрес: git remote add
Выполните в папке проекта, подставив свой логин:
$ cd ~/projects/portfolio
$ git remote add origin https://github.com/alex-ivanov/portfolio.git
$ git remote -v
origin https://github.com/alex-ivanov/portfolio.git (fetch)
origin https://github.com/alex-ivanov/portfolio.git (push)
Разбор по строкам
git remote add origin <адрес>— «запомни адрес под именемorigin». Команда ничего не отправляет и в интернет не ходит, только пишет запись в настройки репозитория (файл.git/config).git remote -v— показать записанные адреса (-vот verbose, «подробно»). Без-vкоманда напечатает только имена.origin ... (fetch)— отсюда Git будет забирать изменения.origin ... (push)— сюда Git будет отправлять изменения. Сейчас адреса одинаковые, хотя в сложных случаях они бывают разными.
Если origin уже есть
Повторный git remote add origin ... выдаст error: remote origin already exists. («удалённый репозиторий origin уже существует»). Это не страшно: значит, имя занято. Чтобы заменить адрес, пользуйтесь git remote set-url origin <новый адрес>.
Вход без пароля
Первый push потребует доказать GitHub, что репозиторий ваш. Привычный пароль от аккаунта здесь не работает: по документации GitHub, вход по паролю для Git убран в пользу более безопасных способов. Это первая ловушка для новичков, поэтому разберём способы входа заранее. Сейчас нужен один из них, самый простой для вашей системы.
Основной путь в курсе — HTTPS-адрес и программа, которая входит в аккаунт за вас через браузер:
- Windows: программа Git Credential Manager идёт в комплекте с Git for Windows. Делать ничего не нужно: при первой отправке откроется окно входа в GitHub, вы войдёте и разрешите доступ, а менеджер запомнит это в системе.
- macOS и Linux: установите GitHub CLI — программу
gh— и выполните вход. На Mac:brew install gh(нужен Homebrew). На Linux команды зависят от дистрибутива, их собрали в инструкции gh для Linux.
Вход через GitHub CLI выглядит так:
$ gh auth login
Программа задаст несколько вопросов. На вопрос о предпочитаемом протоколе для операций Git выберите HTTPS. На вопрос, хотите ли вы авторизовать Git своими данными GitHub, ответьте Y. Способ входа выберите через браузер: откроется страница GitHub, вам покажут одноразовый код, который нужно ввести. Этот путь рекомендует сам GitHub (документация по хранению учётных данных). После входа git push будет работать без вопросов.
Запасной путь: токен вместо пароля
Если ни менеджер, ни gh не подошли, Git спросит имя пользователя и «пароль». В поле пароля нужно вставить personal access token (PAT) — длинную строку, которую создаёт GitHub. Открыть можно так: Settings, Developer settings, Personal access tokens, Fine-grained tokens, Generate new token. Выберите ваш репозиторий и в правах поставьте Contents: Read and write. Токен — тот же пароль: не пишите его в файлы проекта и не присылайте никому.
Подробно: управление токенами.
Первый push
Push («толкнуть», «отправить») — это команда git push: она отправляет ваши коммиты в удалённый репозиторий. Вот первая отправка:
$ git push -u origin main
Enumerating objects: 31, done.
Counting objects: 100% (31/31), done.
Delta compression using up to 8 threads
Compressing objects: 100% (29/29), done.
Writing objects: 100% (31/31), 3.74 KiB | 3.74 MiB/s, done.
Total 31 (delta 13), reused 0 (delta 0), pack-reused 0 (from 0)
To https://github.com/alex-ivanov/portfolio.git
* [new branch] main -> main
branch 'main' set up to track 'origin/main'.
Числа у вас будут другими. Между строками могут встретиться строки с remote: — это сообщения самого GitHub. Главное — последние три строки.
Разбор по строкам
git push -u origin main— «отправь веткуmainв удалённый репозиторийoriginи запомни эту пару».Enumerating objects,Counting objects,Compressing objects— Git считает и упаковывает то, чего ещё нет на GitHub. Сюда входят не только файлы, но и сами коммиты.Writing objects: 100% (31/31), 3.74 KiB— упакованное отправлено; весь проект уместился в несколько килобайт.Total 31 (delta 13)— итог: 31 объект, часть записана как разница с похожими.To https://github.com/alex-ivanov/portfolio.git— куда отправляли.* [new branch] main -> main— на GitHub появилась новая ветка. Записьmain -> mainчитается «локальнаяmainстала веткойmainна сервере».branch 'main' set up to track 'origin/main'.— веткаmainтеперь связана сorigin/main. Это результат флага-u.
Что делает флаг -u
-u — это сокращение от --set-upstream («задать вышестоящую ветку»). Он говорит: «запомни, что моя main связана с main на origin». После этого git push и git pull без аргументов знают, куда идти, а git status умеет сравнивать вас с GitHub. Флаг нужен один раз для каждой новой ветки. Если его забыть, Git при следующей отправке сам подскажет: fatal: The current branch main has no upstream branch. и предложит команду git push --set-upstream origin main.
Обновите страницу репозитория на GitHub: там появятся файлы вашей визитки, а над списком файлов — последний коммит.
Частая путаница: push отправляет коммиты, а не файлы
Push переносит коммиты вашей ветки, которых ещё нет на сервере. Правки, которые вы не закоммитили, никуда не уйдут. Если вы изменили файл, но не сделали коммит, на GitHub он останется прежним.
Дальше просто git push
Теперь рабочий цикл дополняется ещё одним шагом: правка, add, commit — и затем push. Допишите в конец README.md пустую строку и фразу «Чтобы посмотреть сайт у себя, откройте index.html в браузере.», а затем закоммитьте:
$ git commit -am "Дополнить README"
[main a3bf107] Дополнить README
1 file changed, 2 insertions(+)
$ git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
Строка Your branch is ahead of 'origin/main' by 1 commit. — не ошибка, а информация: «ваша ветка на один коммит впереди». origin/main — это ваша локальная пометка о том, где была main на GitHub при последнем обмене данными. Когда появляется коммит, которого нет на сервере, ветка оказывается впереди, и Git подсказывает git push. Отправим его:
$ git push
To https://github.com/alex-ivanov/portfolio.git
0f8efd8..a3bf107 main -> main
Больше ни origin, ни main указывать не нужно — Git берёт их из связи, настроенной флагом -u. Строка 0f8efd8..a3bf107 показывает, какой отрезок истории уехал: от прежнего конца main на GitHub до нового. Теперь git status снова скажет Your branch is up to date with 'origin/main'. («ваша ветка совпадает с origin/main»).
Практика у себя
- Откройте терминал в папке
~/projects/portfolio.git statusдолжен ответитьOn branch mainиnothing to commit, working tree clean. - Свяжите папку с GitHub:
git remote add origin https://github.com/alex-ivanov/portfolio.git(со своим логином), затемgit remote -v. Должны появиться две строки,(fetch)и(push). - На macOS и Linux выполните
gh auth loginи ответьте на вопросы по инструкции выше. На Windows этот шаг пропустите: окно входа откроется само. - Отправьте историю:
git push -u origin main. На Windows при первой отправке войдите в GitHub в открывшемся окне. Последняя строка вывода:branch 'main' set up to track 'origin/main'. - Обновите страницу репозитория на GitHub: файлы
index.html,projects.html,style.css,README.md,.gitignoreна месте. Папкиnotesтам нет — она в.gitignore, и Git её не отслеживает. - Допишите в
README.mdстроку «Чтобы посмотреть сайт у себя, откройте index.html в браузере.» (через пустую строку), выполнитеgit commit -am "Дополнить README", посмотритеgit status(тамahead ... by 1 commit), затемgit push. - Перейдите на GitHub, откройте
README.mdи убедитесь, что новая строка видна.
Проверьте себя
git remote -vпоказывает ваш адрес на GitHub в двух строках.git statusсообщаетYour branch is up to date with 'origin/main'.- На странице репозитория видны все файлы, кроме
notes, и последний коммит — «Дополнить README». - Вы можете объяснить, зачем нужен флаг
-uи почему во второй раз он не потребовался.
Частые ошибки
Пароль не принимается
Что видно: после ввода логина и пароля Git пишет, что вход не удался. В сообщении звучит фраза о том, что поддержка входа по паролю убрана:
remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/alex-ivanov/portfolio.git/'
Дословный текст может отличаться, смысл один: пароль от аккаунта для Git больше не годится. Исправление: войдите через Git Credential Manager или gh auth login, либо введите вместо пароля токен PAT.
src refspec main does not match any
error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/alex-ivanov/portfolio.git'
Почему: в вашем репозитории нет ветки main, ведь отправлять нечего. Это бывает в двух случаях: нет ни одного коммита, или ветка называется master. Проверьте git branch и git log --oneline. Если коммитов нет, сделайте первый; если ветка master, переименуйте её: git branch -M main.
Опечатка в адресе
Если адрес записан неверно (чужой логин, лишняя буква), git push сообщит, что репозиторий не найден. Исправьте адрес: git remote set-url origin https://github.com/alex-ivanov/portfolio.git, затем проверьте git remote -v.
Push отклонён
Ответ ! [rejected] main -> main (fetch first) значит, что на GitHub есть коммиты, которых нет у вас. Что с этим делать, разберём в уроке про fetch и pull; принудительную отправку --force не используйте.
Подробно о командах — в документации Git: git remote и git push.
Что важно запомнить
git remote add origin <адрес>записывает адрес GitHub под именемorigin;git remote -vпоказывает записи.- Пароль от аккаунта для Git не работает: входите через Git Credential Manager (Windows),
gh auth loginили токен PAT. git push -u origin mainотправляет ветку и связывает её сorigin/main; дальше хватаетgit push.- Push отправляет только коммиты.
Your branch is ahead of 'origin/main' by 1 commit— подсказка, что пора делать push, а не ошибка. - Ошибки:
src refspec main does not match any— нет коммитов или веткаmaster; неверный адрес —git remote set-url.
Проект теперь на GitHub, а вход настроен через браузер. Но есть и более «взрослый» способ входа — по SSH-ключу, без токенов и окон. Как он устроен и стоит ли им пользоваться, расскажет следующий урок.