Editing files in your repository
Note: GitHub’s file editor uses CodeMirror.
-
In your repository, browse to the file you want to edit.
-
In the upper right corner of the file view, click to open the file editor.
Note: Instead of editing and committing the file using the default file editor, you can optionally choose to use the github.dev code editor by clicking the dropdown menu next to and selecting Open in github.dev.
-
On the Edit file tab, make any changes you need to the file.
-
Above the new content, click Preview changes.
-
At the bottom of the page, type a short, meaningful commit message that describes the change you made to the file. You can attribute the commit to more than one author in the commit message. For more information, see «Creating a commit with multiple co-authors.»
-
If you have more than one email address associated with your account on GitHub.com, click the email address drop-down menu and select the email address to use as the Git author email address. Only verified email addresses appear in this drop-down menu. If you enabled email address privacy, then
<username>@users.noreply.github.com
is the default commit author email address. For more information, see «Setting your commit email address.»
-
Below the commit message fields, decide whether to add your commit to the current branch or to a new branch. If your current branch is the default branch, you should choose to create a new branch for your commit and then create a pull request. For more information, see «Creating a new pull request.»
-
Click Propose file change.
Editing files in another user’s repository
When you edit a file in another user’s repository, we’ll automatically fork the repository and open a pull request for you.
-
In another user’s repository, browse to the folder that contains the file you want to edit. Click the name of the file you want to edit.
-
Above the file content, click . At this point, GitHub forks the repository for you.
-
Make any changes you need to the file.
-
Above the new content, click Preview changes.
-
At the bottom of the page, type a short, meaningful commit message that describes the change you made to the file. You can attribute the commit to more than one author in the commit message. For more information, see «Creating a commit with multiple co-authors.»
-
If you have more than one email address associated with your account on GitHub.com, click the email address drop-down menu and select the email address to use as the Git author email address. Only verified email addresses appear in this drop-down menu. If you enabled email address privacy, then
<username>@users.noreply.github.com
is the default commit author email address. For more information, see «Setting your commit email address.»
-
Click Propose file change.
-
Type a title and description for your pull request.
-
Click Create pull request.
Renaming a file on GitHub
Renaming a file also gives you the opportunity to move the file to a new location
Tips:
- If you try to rename a file in a repository that you don’t have access to, we will fork the project to your personal account and help you send a pull request to the original repository after you commit your change.
- File names created via the web interface can only contain alphanumeric characters and hyphens (
-
). To use other characters, create and commit the files locally and then push them to the repository. - Some files, such as images, require that you rename them from the command line. For more information, see «Renaming a file using the command line.»
- In your repository, browse to the file you want to rename.
- In the upper right corner of the file view, click to open the file editor.
- In the filename field, change the name of the file to the new filename you want. You can also update the contents of your file at the same time.
- At the bottom of the page, type a short, meaningful commit message that describes the change you made to the file. You can attribute the commit to more than one author in the commit message. For more information, see «Creating a commit with multiple co-authors.»
- Below the commit message fields, decide whether to add your commit to the current branch or to a new branch. If your current branch is the default branch, you should choose to create a new branch for your commit and then create a pull request. For more information, see «Creating a new pull request.»
- Click Propose file change.
Renaming a file using the command line
You can use the command line to rename any file in your repository.
Many files can be renamed directly on GitHub, but some files, such as images, require that you rename them from the command line.
This procedure assumes you’ve already:
- Created a repository on GitHub, or have an existing repository owned by someone else you’d like to contribute to
- Cloned the repository locally on your computer
- Open TerminalTerminalGit Bash.
- Change the current working directory to your local repository.
- Rename the file, specifying the old file name and the new name you’d like to give the file. This will stage your change for commit.
$ git mv OLD-FILENAME NEW-FILENAME
- Use
git status
to check the old and new file names.$ git status > # On branch YOUR-BRANCH > # Changes to be committed: > # (use "git reset HEAD ..." to unstage) > # > # renamed: OLD-FILENAME -> NEW-FILENAME > #
- Commit the file that you’ve staged in your local repository.
$ git commit -m "Rename file" # Commits the tracked changes and prepares them to be pushed to a remote repository. # To remove this commit and modify the file, use 'git reset --soft HEAD~1' and commit and add the file again.
- Push the changes in your local repository to GitHub.com.
$ git push origin YOUR_BRANCH # Pushes the changes in your local repository up to the remote repository you specified as the origin
Из этой статьи вы узнаете
-
Зачем нужны системы контроля версий
-
Откуда взялся Git
-
Как создать свой репозиторий на GitHub и внести в него изменения
-
Что такое fork, branch и другие интересные слова из мира Git
-
Как создать свой Pull Request
Вступление
Бывает, что начинающие разработчики проблематично осваивают Git и не с первого захода понимают логику работы сервиса. Но стоит создать пару репозиториев или, ещё лучше, погрузиться в реальную историю по установке стартапа на рельсы DevOps, как работа с ветками станет дружелюбной, а PR и MR больше не вызовут путаницы. Ошибки в любом случае появятся, но вы будете к ним готовы!
Начало
Когда вы пишете первую программу, всё кажется таким лаконичным, простым и понятным. Но по мере развития ваша программа обрастает новой функциональностью, становится сложнее и больше. Потом и вовсе появляются первые баги. И было бы здорово помнить или иметь возможность смотреть историю изменений, что добавили или убрали в коде, по какой причине мог появиться баг.
Первое и самое просто решение — «А давайте перед каждым изменением сохранять копию программы (просто копировать папку с кодом)?»
На самом деле это будет работать, но до поры до времени. Проект продолжит расти и станет полезным не только вам, но и вашим друзьям, которые захотят добавить в код что-то своё. В рядах программистов прибывает, и надо как-то договариваться, кто какой кусочек кода трогает, а потом ещё синхронизировать изменения, чтобы все фичи добрались до прода.
Настал звёздный час для систем контроля версий, которые запоминают, какое изменение и в каком файле было сделано, а также могут показать историю этих изменений.
Про Git
Существует несколько систем контроля версий: Git, Subversion, Team Foundation Server, Mercurial. Сегодня познакомимся с Git — самой популярной из них, по скромному признанию более 90% разработчиков.
Git появился 7 апреля 2005 года и был создан для управления разработкой ядра Linux. Кстати, создал его тот самый Линус Торвальдс, а сегодня его развитием и поддержкой занимается Дзюн Хамано.
Git — это распределённая система управления версиями: есть один сервер, через который разработчики обмениваются кодом. Разработчик копирует (клонирует) проект к себе на локальную машину, делает изменения и сохраняет их на удалённый сервер. При необходимости другие разработчики могут скопировать эти изменения к себе.
История и копия проекта хранятся локально и чаще всего не нужна дополнительная информация с других клиентов. Вы можете работать с репозиторием и при отсутствии интернета (например, в самолёте), а когда он появится, просто загрузить изменения в удалённый репозиторий на выделенном сервере.
Если у разработчика сломается компьютер, то проект не потеряется, а будет лежать на выделенном сервере. Такой выделенный сервер можно поднять и настроить самостоятельно либо использовать готовые решения.
GitHub — крупнейший веб-сервис, который позволяет заниматься совместной разработкой с использованием Git и сохранять изменения на своих серверах. На самом деле функциональность GitHub намного больше, но сейчас нас интересует только совместная разработка и история изменений. Ещё есть Gitlab, Bitbucket и другие, но мы будем использовать GitHub как самый популярный в настоящее время.
Предварительная настройка
Займёмся предполётной подготовкой.
Для начала зарегистрируйтесь на GitHub: задайте логин, почту и придумайте пароль. После «Создать аккаунт» не забудьте проверить почту и подтвердить её (опрос от Github после подтверждения почты можно пропустить).
В GitHub есть разграничение прав на работу с репозиториями. Можно задавать различные политики: сделать репозиторий публичным и приватным, ограничить права кругу пользователей или кому-то одному, например, разрешить просматривать репозиторий, но не изменять в нём данные.
Для того чтобы сервис определил, кто вы и имеете ли право работать с тем или иным репозиторием, нужно представиться — пройти процесс аутентификации.
GitHub поддерживает безопасность за счёт двух сетевых протоколов, HTTPS и SSH, и вся работа с сервисом происходит через один из них.
Работать с GitHub будем через терминал по SSH. Для этого один раз сгенерируем специальные ключи и добавим один из них в наш аккаунт на GitHub.
Можно работать и через HTTPS, но нужно будет каждый раз вводить пароль и специальный token.
Пара слов про SSH и как он работает. SSH — это сетевой протокол для зашифрованного соединения между клиентом и сервером, через который можно безопасно передавать данные.
При подключении используется пара ключей — открытый (публичный, public) и закрытый (приватный, private). Пользователь создаёт пару ключей при помощи специальной команды и сохраняет закрытый ключ у себя, а открытый кладёт на сервер (в нашем случае на GitHub). А работает это всё благодаря асимметричному шифрованию.
Алгоритм следующий: отправитель (GitHub) шифрует сообщение публичным ключом и передаёт сообщение клиенту (нам), а мы его расшифровываем при помощи приватного ключа, который предусмотрительно сохранили у себя. То, что зашифровано публичным ключом, расшифровать сможет только приватный ключ.
Давайте создадим пару ключей и добавим открытый ключ на GitHub.
Чтобы создать пару ключей, в терминале нужно ввести команду, задать путь для хранения ключей и указать пароль к ключу (необязательно).
Далее будем опираться на то, что путь для ключей дефолтный и пароль на ключи не установлен.
Пароль для ключей нужен как дополнительная мера безопасности, если вдруг ваш приватный ключ попадёт не в те руки.
$ ssh-keygen
Generating public/private rsa key pair.
# путь до ключей, в скобках путь по умолчанию
Enter file in which to save the key (/Users/ifireice/.ssh/id_rsa):
# пароль для ключей, при задании пароля в консоли не отображается ничего, даже звёздочки
# если нажать Enter, ничего не вводя, пароль будет пустым
Enter passphrase (empty for no passphrase):
# повторите пароль
Enter same passphrase again:
# после появится сообщение такого вида
Your identification has been saved in /Users/ifireice/.ssh/id_rsa
Your public key has been saved in /Users/ifireice/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:Zu+HkZPC4ZP0veRmVjuKgylVvljHBNO8mHs+ieFFPvs ifireice@ifireice-osx
The key's randomart image is:
+---[RSA 3072]----+
| o |
| o o |
| = . |
| o + + |
| +S* X |
| oB.@ X . |
| . O.# * . |
| . +.*.% o |
| . o*.+E. |
+----[SHA256]-----+
Бинго, ключи сгенерированы: в заданной директории появятся два файла, id_rsa и id_rsa.pub.
Теперь надо добавить публичный ключ в аккаунт на GitHub:
# выведите содержимое публичного ключа в консоль
$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDDJfHIi73sKd6cqm3RwKuY1zl46aAaE6X9Gp
/6zJiY3BiJj95oJjPdpfpPhVFWLIbmT8zFAtOLbX9N4C3b0enHUzgMacP/Kl4AbrAkhLqaua9iD
VNxxiTVxADG1M5525oc/eAvx7y0pXIb9ouWdYJSKa8/TUYFhWlCzV2quY9SA0FaMs7eY41+KWYpG.....
tA0oGxv+7WmXQmQzleLIRG13KQ+VAbL2vabdPcRoGuZavh0smOr/GtVSnLdspZ5RgONMSPWlF2I1YHMR
Q7CIKPs= ifireice@ifireice-osx
$
Скопируйте ключ от символов ssh-rsa и до конца файла и вставьте его в ваш аккаунт на GitHub.
Ну что, с настройкой GitHub пока закончили, осталось установить Git на компьютер. Сделать это можно по официальной инструкции (выберите пункт для вашей ОС).
Терминология
Самое время пополнить ваш Git-словарик, прежде чем создадим первый Pull Request.
Репозиторий (repository) — директория проекта, который отслеживается Git. В директории хранится проект, история изменений и мета-информация проекта (в скрытой директории .git
).
Индекс — хранилка, где лежат имена файлов и их изменения, которые должны быть в следующем коммите. По факту индекс — просто файл. В индекс файлы сами не попадают, их нужно явно добавлять при помощи git add
.
Коммит (commit) — это фиксация изменений в истории проекта (изменения, которые внесены в индекс). Коммит хранит изменённые файлы, имя автора коммита и время, в которое был сделан коммит. Кроме того, каждый коммит имеет уникальный идентификатор, который позволяет в любое время к нему откатиться. Можете считать коммит этакой точкой сохранения.
Ветка (branch) — последовательность коммитов. По сути — ссылка на последний коммит в этой ветке. Ветки не зависят друг от друга — можно вносить изменения в одну, и они не повлияют на другую (если вы явно этого не попросите). Работать вы начинаете в одной ветке — main, увидите чуть позже.
Форк (Fork) — собственное ответвление (fork
) какого-то проекта. Это означает, что GitHub создаст вашу собственную копию проекта, данная копия будет находиться в вашем пространстве имён, и вы сможете легко делать изменения путём отправки (push) изменений.
Пул-реквест — pull request PR (пиар, он же merge request MR(мр)) — предложение изменения кода в чужом репозитории. Допустим, вы забрали к себе чужой репозиторий, поработали с ним и теперь хотите, чтобы ваши изменения попали в оригинальный репозиторий — тогда вы создаёте создаёте PR с просьбой добавить ваши изменения в репозиторий.
Начало работы
Начнём с простого — создадим свой репозиторий и сделаем наш первый коммит.
Зададим параметры:
-
(1) Repository name: имя репозитория.
-
(2) Description: описание репозитория.
-
(3) Тип репозитория: Public (публичный) или Private (приватный). Сейчас выберем публичный — кто угодно может видеть содержимое репозитория.
-
(4) Ставим галку на «Создать README файл». В этом файле в формате MarkDown описывают проект или прочую документацию. Именно содержимое этого файла можно увидеть, когда заходим на главную страницу репозитория. Примеры 1, 2, 3.
-
(5) Если известно, на каком языке будет проект, можем добавить шаблон
.gitignore
для этого языка. Сейчас у нас нет какого-то языка, поэтому не будем создавать.gitignore
. -
(6) Выбираем тип лицензии для нашего кода. В лицензии оговариваются права на проект. Стоит обратить внимание на BSD 3 или MIT, так как они предоставляют хороший баланс прав и ответственности.
(7) По умолчанию имя основной ветки в GitHub носит имя main, но до недавнего времени было master
.
И нажимаем кнопку «Create repository». Успех, у нас есть первый репозиторий!
А что будет, если не добавим README и .gitignore?
На самом деле ничего страшного не произойдёт, но придётся выполнить ещё ряд шагов, чтобы проинициализировать git-репозиторий, прежде чем начать с ним работать.
Итак, мы создали репозиторий на удалённом сервере, теперь пора «забрать» его к себе на локальную машину и внести какие-то изменения.
Чтобы забрать репозиторий, его надо склонировать к себе при помощи команды git clone
и пути до репозитория.
Для начала получим путь до репозитория.
Теперь идём в консоль, переходим в директорию, где хотим хранить проекты, и выполним (git@github.com:ifireiceya/MyFirstRepo.git
— путь, который мы скопировали ранее):
$ git clone git@github.com:ifireiceya/MyFirstRepo.git
Cloning into 'MyFirstRepo'...
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (4/4), done.
Переходим в новый каталог, где теперь лежит копия нашего проекта с GitHub:
$ cd MyFirstRepo
Можем посмотреть, что уже есть в этой директории:
$ ls -a
.git LICENSE README.md
Видим два знакомых файла,LICENSE
и README.md
, а также одну скрытую директорию .git.
В .git
хранится метаинформация и вся история для проекта. На каждый проект есть только одна директория .git
, и лежит она в корне проекта.
$ ls .git
HEAD # указатель на вашу активную ветку
config # персональные настройки для проекта
description # описание проекта
hooks # pre/post action hooks
index # индексный файл
logs # история веток проекта (где они располагались)
objects # ваши объекты (коммиты, теги и тд)
packed-refs refs # указатели на ваши ветки разработки
Давайте немного настроим Git под себя. Делать это нужно только один раз, потом настройки сохранятся, но при необходимости их можно изменить.
При установке Git была добавлена утилита git config
, которая позволяет просматривать и изменять большинство параметров работы Git’а. Если речь о данных пользователя или способе работы репозитория — git config
будет самым удобным способом настройки.
Настроим имя пользователя и адрес электронной почты. Эта информация важна, потому что включается в каждый коммит.
Поэтому в терминале переходим в Git-репозиторий, для которого задаём настройки, и выполняем:
$ git config user.name "Дарья Меленцова"
$ git config user.email ifireice@example.com
# Если добавить опцию --global, то эти настройки запишутся в настройки пользователя и будут действовать для всех проектов.
# Мы выполняем эту команду без параметра --global, чтобы настройки касались только вашего проекта.
Чтобы настраивать ещё больше параметров с помощью
git config
, прочитайте эту документацию.
Вносим изменения
Теперь нужно внести изменения в проект. Но перед этим посмотрим две полезных команды:
-
git status
— показывает текущее состояние файлов в репозитории (какие файлы изменились, удалились, добавились); -
git log
— показывает историю изменений (это про зафиксированные изменения, то есть коммиты).
Выполним эти команды и посмотрим, что они выведут для нашего репозитория.
Вбиваем git status
:
$ git status
On branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree clean
И видим, что у нас нет изменений. Говорят, «нет коммитов в репозитории». Конечно, мы успели только клонировать репозиторий и ещё ничего не делали.
Идём дальше и пробуем git log
, который покажет, что в проекте был только один Initial commit
— когда мы создавали репозиторий с README.md
:
$ git log
commit 9ae1cbcc77f3b64d604612d4a599bdbb8b1cf204 (HEAD -> main, origin/main, origin/HEAD)
Author: ifireiceya <117034707+ifireiceya@users.noreply.github.com>
Date: Mon Oct 31 00:01:05 2022 +0300
Initial commit
(END)
Убедились, что у нас нет неучтённых изменений. Пора бы уже что-то сделать!
Открываем любимый текстовый редактор и создаём новый файл с именем hw.py
.
Это будет небольшая программа на Python, которая при запуске печатает «Hello World!» (внезапно):
$ vi hw.py
print("Hello World!")
Отлично, код написан и даже хранится локально в нашем репозитории (мы же в директории проекта всё делали).
Теперь наша задача — сохранить изменения в «оригинальный» (удалённый) репозиторий. Для этого нужно:
-
Познакомить Git с новым файлом, то есть добавить файл в индекс —
git add
. -
Зафиксировать (закоммитить) изменения —
git commit
. -
Синхронизировать изменения с сервером —
git push
. -
Посмотреть в репозиторий и убедиться, что всё сработало.
Делаем!
Появился файл hw.py
, но он красный. Паника! Всё сломалось?!
Нет, всё идёт по плану, но прежде чем продолжить, стоит обсудить состояние файлов с точки зрения Git’а.
По мнению Git’а, файл может пребывать в одном из четырёх состояний:
-
Неотслеживаемый (untracked).
-
Изменённый (modified) — файл, в котором есть изменения, но он ещё не добавлен в коммит (не зафиксирован).
-
Отслеживаемый (staged) — файл, который добавили в индекс.
-
Зафиксированный (committed) — файл уже сохранён в локальной базе, и в нём не было изменений с последнего коммита.
В связке с состоянием файлов используют три основных секции проекта:
-
Рабочая директория (working directory) — это директория, которая содержит в себе то, с чем вы работаете, или то, что вы извлекли из истории проекта в данный момент. Рабочая директория — это временное место, где вы можете модифицировать файлы, а затем выполнить коммит.
-
Область индексирования (staging area) — индекс-файл в каталоге Git, который содержит информацию о том, что попадёт в следующий коммит.
-
Каталог Git — место, где Git хранит метаданные и базу объектов вашего проекта. Помните ещё про
.git
?
Что происходит на практике
Мы добавили новый файл hw.py
и видим, что у него состояние untracked
, то есть неважно, что мы делаем с файлом, Git проигнорирует любые изменения в нём.
Чтобы Git начал следить за изменениями в файле, его нужно добавить в индекс.
Для этого используем команду git add <имя файла>
.
Кстати, вы заметили, что Git довольно дружелюбный и часто подсказывает команды, которые нужно выполнить?
$ git add hw.py
# если нужно добавить много файлов и не хочется описывать, можно использовать команду
# git add .
# но стоит точно понимать, что добавляем, иначе придётся потом удалять файлы из индекса
# кстати, для удаления используется команда git rm, но стоит почитать доку перед использованием
И ещё не забывайте о файле .gitignore
, где перечислены папки и файлы репозитория, которые Git не должен отслеживать и синхронизировать их состояние (не добавлять их в индекс). Обычно в него добавляют файлы логов, результаты сборки и другое. Поддерживает шаблоны. Кстати, .gitignore — тоже файл, который надо добавить в индекс.
-
Если файл попадает в правила
.gitignore
, то он не появится вgit status
. -
Если файл был добавлен в индекс, а потом добавлено правило для файла в
.gitignore
— файл всё равно будет отслеживаться и его надо явно удалить из индекса.
Посмотрим, как изменилось состояние нашего файла:
Давайте зафиксируем изменения, так как наша задача сейчас решена: мы написали программу на Python и хотим сказать Git, что вот теперь мы закончили работать с файлом и надо запомнить текущее состояние.
Для этого нужно закоммитить файл с помощью команды git commit
.
При создании обычно лаконично описывают коммит, используя ключ -m
:
$ git commit -m "add python hello world"
[main 6d8a5c3] add python hello world
1 file changed, 1 insertion(+)
create mode 100644 hw.py
Пара слов о том, как писать сообщения для коммитов:
-
максимум 50 символов;
-
осознанно и понятно, как будто пишете для человека, который должен понять, что происходит внутри коммита;
-
сообщение стоит начинать с заглавной буквы;
-
если меняли код, пишите исходный код в сообщении.
$ git log
$ git push
Counting objects: 100% (4/4), done.
Delta compression using up to 12 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 341 bytes | 341.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:ifireiceya/MyFirstRepo.git
9ae1cbc..6d8a5c3 main -> main
Предлагаем проверить, что наши изменения есть на GitHub. Идём в репозиторий и смотрим на него.
Задача немного посложнее
Всё здорово, но мы не всегда создаём репозитории, и часто нам нужно добавлять новые фичи или исправления в уже существующий репозиторий, да ещё и в чужой.
Например, есть у нас любимый опенсорсный проект, в который мы хотим принести добро и закрыть им какой-нибудь Issue.
В учебных целях используем репозиторий из этой статьи на GitHub. Там нужно исправить опечатку, которую нашли в статье. Например, вот эту очепятку.
Но будем делать это с позиции внешних пользователей в чужом репозитории.
Репозиторий хранится в ifireice/git, а изменения делает пользователь ifireiceya.
Пользователь ifireiceya не имеет доступа в ifireice/git, и ему придётся работать через Fork, то есть нужно сперва сделать копию этого репозитория к себе и вести разработку у себя, а потом отправить в основной репозиторий запрос на изменения — Pull Request.
Но обо всём по порядку. Сначала делаем Fork.
Откроется окно для создания нового форка (fork).
Изменится владелец репозитория (1), и опционально можно изменить описание проекта.
Вы можете делать любые изменения в собственной копии, и они никак не отразятся в оригинальном репозитории.
Теперь клонируем форк-репозиторий к себе на машинку и ведём разработку.
Только мы будем работать чуть-чуть по-другому, не как с нашим репозиторием.
В нашем репозитории мы работали в ветке main
и все изменения сохраняли в ней.
А теперь у нас большой проект, и над ним одновременно могут трудиться несколько разработчиков. Чтобы разные изменения не смешивались в кучу и чтобы один разработчик не мешал другому, разработка ведётся в разных независимых версиях продукта — ветках (branch). Когда работа закончена, все изменения сливаются в одну главную ветку.
Клонируем репозиторий и создаём отдельную ветку, в которой будем устранять опечатку:
$ git clone git@github.com:ifireiceya/git.git
$ cd git
# создадим новую ветку и сразу же переключимся на неё, чтобы работать там
$ git checkout -b fix-misprint
Switched to a new branch 'fix-misprint'
Чтобы посмотреть, какие ветки есть в проекте и какая сейчас активна, используется команда git branch
:
$ git branch
* fix-misprint
main
# * помечена текущая активная ветка
На самом деле практика работать с ветками распространена не только при разработке в чужих репозиториях (collaborators), куда у вас нет доступа, но и в своих. Есть несколько стратегий выделения веток, но об этом не сейчас. Просто знайте, что есть ветки и с их помощью удобно вести разработку.
Можем посмотреть, что изменилось с последнего коммита, при помощи команды git diff (красным с “-” то, что было, зелёным с “+” — то, что стало):
$ git diff
$ git status
On branch fix-misprint
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: README.md
no changes added to commit (use "git add" and/or "git commit -a")
$ git commit -am "Поправили опечатку"
[fix-misprint 188caa7] Поправили опечатку
1 file changed, 1 insertion(+), 1 deletion(-)
$ git push
fatal: The current branch fix-misprint has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin fix-misprint
Упс, fatal. Читаем подсказку от Git и выполняем:
$ git push --set-upstream origin fix-misprint
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 12 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 402 bytes | 402.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
remote:
remote: Create a pull request for 'fix-misprint' on GitHub by visiting:
remote: https://github.com/ifireiceya/git/pull/new/fix-misprint
remote:
To github.com:ifireiceya/git.git
* [new branch] fix-misprint -> fix-misprint
Branch 'fix-misprint' set up to track remote branch 'fix-misprint' from 'origin'.
Успех!
Почему произошёл fatal: простой git push предполагает, что ветка, которую отслеживает текущая локальная ветвь, уже существует на удалённом сервере. У нас ветка новая и была создана только локально, поэтому нам нужно её создать, указав --set-upstream
.
Проверим, что ветка появилась на GitHub.
Форк сделали, ветку отвели, ошибку поправили, осталось отправить изменения в оригинальный репозиторий.
Для этого создаём Pull request.
И увидим такую картину.
(1) репозиторий, в который хотим добавить изменения. — ifireice/git
(2) ветка, в которую хотим добавить изменения — main
(3) репозиторий, из которого хотим добавить изменения — ifireiceya/git
(4) ветка, из которой хотим добавить изменения — main
На этом сейчас наша работа завершена. Ответственные за репозиторий посмотрят ваши изменения, примут их, или попросят что-то дописать, или отклонят изменения.
Будем считать, что у нас всё хорошо и наши изменения приняли без вопросов.
Как это выглядит на стороне ревьюверов:
На этом пока всё. Увидимся в следующих выпусках про Git и не только.
Что изучили
-
Поговорили про системы контроля версий
-
Настроили себе GitHub
-
Создали первый репозиторий и внесли в него изменения
-
Узнали про ветки, форки и остальное
-
Сделали первый ПР
Что НЕ изучили
-
Конфликты
-
Откат изменений (reset, revert)
-
Как забрать файл из другой ветки (Cherry-pick)
-
rebase
Что ещё почитать
-
Отличная книга Pro Git (есть на русском и английском)
-
Курс «DevOps для эксплуатации и разработки»
-
Trunk-Based Development — стратегия отведения веток
-
GitFlow — другая стратегия отведения веток
Git — распределенные системы контроля версий, которые помогают обмениваться кодом и «ковать» проекты в команде — отслеживать и контролировать все изменения в коде. Если вы занимаетесь разработкой приложений, веб-сайтов или игр, то наверняка сталкивались с этим.
Одна из таких систем — GitHub — платформа для хостинга репозиториев. Расскажем о ней подробнее: как зарегистрироваться, создать проект, вносить в него изменения и не столкнуться с конфликтами версий.
Для работы с платформой нужно создать аккаунт. Для этого переходим по ссылке и тапаем по кнопке Sign up.
На странице регистрации вводим данные:
- Адрес электронной почты. Если на почту уже был зарегистрирован аккаунт, на странице появится сообщение об ошибке: «Email is invalid or already taken».
- Пароль. Система рекомендует использовать для пароля последовательность из 15 символов или 8, но с использованием хотя бы одной цифры и строчной буквы.
- Имя пользователя. «Юзернейм» должен быть уникальным. При этом он не может начинаться или заканчиваться дефисом.
Теперь нужно нажать кнопку Continue, принять или отклонить предложение о подписке на рассылку и пройти экстравагантную валидацию:
Затем подтвердите адрес электронной почты.
Во всплывающих окнах указывайте настройки на свое усмотрение. Для ознакомления и некоммерческого использования достаточно бесплатного тарифа. Регистрация завершена.
Установка Git
Для работы с репозиторием необходимо скачать Git-терминал или GitHub Desktop. Что из этого выбрать — решать вам. Но предпочтительней уметь работать с командной строкой Git. Такое требование часто можно встретить в вакансиях. Вдобавок, знание командной строки позволяет работать с другими платформами, подобными GitHub.
Терминал
Если у вас установлен Linux, смело пропускайте раздел. С Mac и Windows другая история.
Mac OS
Если вы пользовались XCode, вероятно, Git уже установлен. В противном случае зайдите в терминал, выполните команду git и нажмите кнопку Установить.
После установки можно узнать версию Git.
git --version
Windows
На винду Git можно скачать с официального сайта или через пакет Git Chocolatey. Дополнительная информация о Git Windows доступна по ссылке.
GitHub Desktop. Краткий обзор
Непривычна работа в командной строке — установите «десктопную» версию (доступна на всех ОС). Она хорошо подходит для базовых операций.Установщик есть на официальной странице GitHub Desktop. Там же и наиболее подробное описание программы.
При первом запуске пользователя встречает окно с авторизацией.
А после — интерфейс с привычным функционалом: можно создавать и клонировать репозитории.
Важно отметить, что установка GitHub Desktop на Linux может отличаться в зависимости от дистрибутива. Рекомендуем ознакомиться с официальной инструкцией.
Создание первого репозитория
После регистрации и настройки рабочего окружения можно приступить к работе с проектом. Для начала создадим репозиторий на GitHub — облачное пространство, в котором размещаются файлы проекта и его документация. Существует несколько способов.
Первый способ — синхронизация с локальным репозиторием
Допустим, нам нужно выложить в открытый доступ код программы Selectel — определитель динозавров по фотографиям.
Перед его загрузкой в глобальный репозиторий можно создать локальный.
Для этого необходимо зайти в терминал, перейти в директорию проекта и ввести команду:
git init
Загрузка файлов в репозиторий. Создание коммитов
Далее следует добавить все файлы проекта в своеобразный пакет изменений и сделать commit («закоммитить») — загрузить изменения.
git add main.py
git add GAN_core.py
git add dino_ds_api.py
git commit -m “первый коммит”
Последняя команда делает сам «коммит», а флаг -m указывает на сообщение «первый коммит».
В примере были «закоммичены» несколько python-файлов: main, GAN_core и dino_ds_api. Если вам нужно добавить в «коммит» все, что есть в директории, — используйте команду:
git add .
Теперь создадим репозиторий на GitHub. Для этого нужно нажать на кнопку Create repository.
В открывшемся окне обязательно к заполнению только поле с названием проекта. Оно должно быть кратким, но понятным. В нашем примере это gan-dino (gan от generative adversarial networks и dino от dinosaur).
Все остальное опционально:
- Описание. Поле с кратким описанием проекта.
- Режим доступа. Для коммерческих или корпоративных продуктов обычно устанавливается режим private (репозиторий доступен ограниченному кругу лиц). В остальных случаях — public (доступно по ссылке).
- Файл README. Если в репозитории нужно подробное описание проекта — поставьте галочку рядом с Add a README file. Но есть нюанс: для первого способа создания репозитория галочки быть не должно.
- Конфигурация .gitignore. Бывает, что в проекте нужно разместить невидимые для Git файлы. Чтобы как-то их обозначить, придумали конфигурацию .gitignore, в которой их можно перечислить.
- Лицензия. Чтобы никто не использовал ваш код в коммерческих целях без спроса, необходимо добавить файл с лицензией. В нем правообладатели прописывают правила использования своей интеллектуальной собственности.
Создадим public-проект gan-dino, без файла README и конфигурации .gitignore.
Далее GitHub показывает наборы команд, необходимые для загрузки исходного кода в репозиторий. Нас интересует второй блок.
git remote add origin https://github.com/t-rex-general/gan-dino.git
git branch -M main
git push -u origin main
Первая строка загружает origin — прообраз нашего проекта в глобальном репозитории. Со второй командой мы познакомимся позже. Третья команда загружает (пушит) изменения в GitHub-репозиторий.
После ввода команд система попросит авторизоваться с помощью пароля и названия профиля.
После 13 августа 2021 года вместо пароля нужно вводить токен.
Откройте настройки вашего аккаунта, выберите пункт меню Developer settings, кликните по Personal access tokens и generate new token. А затем повторите попытку.
Получилось! В репозиторий загрузились нужные файлы. Можно смело делиться ссылкой на него.
Второй способ — от глобального к локальному
Бывает другая ситуация, когда кода программы нет и нужно создать пустой репозиторий на GitHub, а после — сделать его локальный дубликат. Данный процесс называется локальным развертыванием.
Повторяем все действия из первого способа (заполняем поля с названием, описанием, присваиваем режим доступа), но ставим галочку напротив README. Тогда непустой новый репозиторий, в который не нужно ничего подгружать из локального проекта.
Чтобы клонировать этот репозиторий себе на компьютер, нужно нажать на зеленую кнопку Code, скопировать HTTPS-адрес, перейти в терминал, в нужную директорию и ввести команду:
git clone https://github.com/t-rex-general/gan-dino2.git
В результате файл README.md появится в выбранной директории — локальном репозитории.
С помощью этой же команды можно клонировать и чужие проекты. Например, чтобы не писать все модули для определителя динозавров самостоятельно, можно клонировать чужой репозиторий себе на компьютер. Или сделать fork («форк»), то есть скопировать чей-то проект в свой GitHub-профиль для его доработки.
Третий способ — внутри GitHub
Если нет возможности использовать Git-терминал или GitHub Desktop, можно работать напрямую с GitHub. Перед этим создаем репозиторий с файлом README.
Внутри GitHub есть онлайн-редактор кода и интерфейс работы с пространством имен (создание файлов, директорий и загрузка других элементов).
Например, для создания нового файла достаточно нажать на кнопку Create new file. Откроется встроенный редактор кода.
Потом необходимо сделать коммит.
Работа с ветками
С точки зрения Git, весь процесс разработки — это история коммитов. Такие истории называются ветками — своеобразными указателями на последний коммит.
Представьте ситуацию:
Два программиста работают над одним контроллером для авторизации. Первому нужно написать шифрование пароля по заданному «юзер-токену», а второму — запрограммировать регистрацию информации в базу данных. Разработчики обнаружили, что у токена не тот тип данных, и решают преобразовать его, используя новую переменную. Они это сделают по-разному. Но ничего страшного: каждый из них работал в своей ветке и заметит конфликт при их слиянии.
Создание веток через Git
Чтобы создать ветку (например, dev) в проекте, нужно ввести команду:
git branch dev
После ветка появится в общем списке.
git branch
Видно, что выбрана ветка main, то есть все коммиты загружаются в нее. Чтобы работать с веткой dev, нужно переключиться.
git checkout dev
Попробуем изменить файл проекта и загрузить коммит.
git add main.py
git commit -m “добавили if”
Теперь можно посмотреть логи — историю добавления коммитов.
Действительно, второй коммит «улетел» в ветку dev. Если нас не устроили изменения, можно откатиться до предыдущего (любого) коммита по его номеру.
git checkout 61a8f08226eb8067d4e356387f1dcce5c79812dd
Чтобы запушить ветку в онлайн-репозиторий введем команду:
git push --set-upstream origin dev
Открываем репозиторий в GitHub и видим, что добавилась ветка dev:
Но если мы зайдем в main.py, то никаких изменений там не обнаружим, пока не выберем ветку dev.
Чтобы изменения затронули и main-ветку, нужно сделать merge — слияние веток.
Создание веток через GitHub
Как и в случае создания репозитория, можно быстро создавать новую ветвь в GitHub и переключаться между существующими ветками.
В рамках веток можно также вносить изменения — механизм работы не меняется.
Слияние веток проекта
Мы почти разработали свой проект. Самое время объединить ветки dev и main.
Первым шагом необходимо переместиться в ветку main:
git checkout main
Вторым шагом — сделать merge с веткой dev и запушить изменения:
git merge dev
git push
Теперь в GitHub-репозитории отображается актуальная информация.
Работа в команде: конфликты версий и git pull
После релиза нашего приложения прошло немало времени. Пользователи приложения требуют обновлений, а в команду пришли еще два разработчика — Василий и Григорий.
Было принято решение добавить в программу новую функцию — определитесь массы динозавра на изображении.
Однако в команде не была налажена совместная работа, и оба программиста внесли изменения, не посоветовавшись друг с другом. Помимо прочего, у них были равносильные права доступа к репозиторию, из-за чего Вася даже успел запушить обновление на GitHub.
Код различается: в программе слева выводится максимальная масса динозавра, а справа — последовательность из возможных значений.
Гриша пытается сделать коммит и пуш своей программы, но сталкивается с ошибкой — конфликтом версий, когда изменения от разных кодеров накладываются друг на друга.
Перед тем как пушить файл на сервер, Гриша должен был получить последние изменения:
git pull
Если это сделать, в файле main.py появится структура, в которой будут видны изменения, которые внесли Вася и Гриша.
Теперь, если Василий считает свою версию более важной, он может убрать код Гриши из программы, и сделать пуш:
git add main.py
git commit -m “dino_weight”
git push
Репозиторий успешно обновлен.
На практике конфликтов гораздо больше и разрешаться они могут по-разному. Важно научиться серфить по руководству git и гуглить. Впрочем, это относится ко всему процессу изучения Git и GitHub.
Fork и Pull Request
Бывает, что ваш репозиторий кто-то форкает и вносит свои коррективы. Вы можете даже не знать, кто инициатор. Если он захочет поделиться корректировками с вами, то создаст запрос слияния (Pull Request).
Зайдем с другого аккаунта, найдем репозиторий gan-dino через поисковую систему в GitHub и сделаем форк.
В нашем списке репозиториев появился новый gan-dino-FORK — это форк-образ gan-dino. Теперь можно внести изменения, например, в main.py, и сделать pull request.
Затем владельцу репозитория нужно подтвердить или отклонить запрос. Чтобы это сделать, нужно перейти во вкладку «Pull requests», выбрать интересующий pull-запрос и нажать одну из предложенных кнопок.
Домашнее задание
Любой конкурентоспособный разработчик должен разбираться в Git. Нелишним будет и знание GitHub, в котором есть много возможностей, значительно упрощающих работу над проектами в команде (project management). Например, дашборды во вкладке Projects, повторяющие функционал Trello и Jira.
GitHub — это целая социальная сеть для разработчиков из разных частей света.
На этом наш краткий обзор GitHub и Git подошел к концу. Мы рассмотрели, как создавать аккаунты GitHub и работать с репозиториями через терминал Git (регистрация и установка, коммиты, пуши и пулы изменений). Это основное. Более подробную информацию можно найти в справочниках Git и GitHub.
Используем GitHub в разработке сервисов
Присоединяйтесь к нашей команде и погрузитесь в наши git-проекты.
Ознакомиться с вакансиями
Если у вас остались вопросы по работе с Git или GitHub, напишите нам.
В рамках данного урока рассмотрим вопросы, касающиеся добавления, удаления и переименования файлов в git репозитории.
- Добавление файлов в git репозиторий
- Удаление файлов из git репозитория и из stage
- Удаление файла из stage
- Удаление файлов из git репозитория
- Первый способ
- Второй способ
- Переименование файлов в git репозитории
- Первый способ
- Второй способ
Добавление файлов в git репозиторий
Добавление файлов в репозиторий – это достаточно простая операция, мало чем отличающаяся от отправки изменений в отслеживаемых файлах в репозиторий. Мы уже не раз выполняли эту операцию в предыдущих уроках, но сделаем это ещё раз. Создадим новый репозиторий, для этого перейдите в каталог, в котором вы хотите его расположить и введите команду git init.
> git init
Создайте в каталоге файл README.md любым удобным для вас способом, мы сделаем это с помощью команды touch.
> touch README.md
Теперь проверим состояние отслеживаемой директории.
> git status On branch master Initial commit Untracked files: (use "git add <file>..." to include in what will be committed) README.md nothing added to commit but untracked files present (use "git add" to track)
Как вы можете видеть: в рабочей директории есть один неотслеживаемый файл README.md. Git нам подсказывает, что нужно сделать для того, чтобы начать отслеживать изменения в файле README.md: необходимо выполнить команду git add, сделаем это.
> git add README.md
Посмотрим ещё раз на состояние.
> git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README.md
Видно, что информация о появлении нового файла попала в stage. Для того чтобы это изменение зафиксировалось в репозитории необходимо выполнить команду git commit.
> git commit -m "add README.md file"
[master (root-commit) 0bb6c94] add README.md file
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README.md
Теперь в рабочей директории и в stage нет объектов, информацию об изменении которых необходимо внести в репозиторий.
> git status
On branch master
nothing to commit, working tree clean
В репозиторий был сделан один коммит.
> git log --oneline
0bb6c94 add README.md file
Удаление файлов из git репозитория и из stage
Удаление файла из stage
Вначале разберемся со stage. Создадим ещё один файл.
> touch main.c
“Отправим” файл main.c в stage.
> git add main.c
Внесем изменения в README.md.
> echo "# README" > README.md
Информацию об этом также отправим в stage.
> git add README.md
Посмотрим на состояние stage.
> git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: README.md new file: main.c
Если нам необходимо убрать из stage, какой-то из этих файлов (main.c или README.md), то для этого можно воспользоваться командой git –rm cashed <filename>, сделаем это для файла main.c.
> git rm --cached main.c
rm 'main.c'
Теперь посмотрим на состояние рабочей директории и stage.
> git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: README.md
Untracked files:
(use "git add <file>..." to include in what will be committed)
main.c
Видно, что изменения в файле README.md готовы для коммита, а вот файл main.c перешел в состояние – неотслеживаемый. Отправим main.c в stage и, после этого, сделаем коммит в репозиторий.
> git add main.c > git commit -m "add main.c and do some changes in README.md" [master 49049bc] add main.c and do some changes in README.md 2 files changed, 1 insertion(+) create mode 100644 main.c
Удаление файлов из git репозитория
Удалить файл из репозитория можно двумя способами: первый – удалить его из рабочей директории и уведомить об этом git; второй – воспользоваться средствами git. Начнем с первого способа. Для начала посмотрим, какие файлы у нас хранятся в репозитории.
> git ls-tree master
100644 blob 7e59600739c96546163833214c36459e324bad0a README.md
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 main.c
Удалим файл main.c из рабочей директории.
> rm main.c > ls README.md
Уведомим об этом систему git.
> git rm main.c
rm 'main.c'
Вместо команды git rm можно использовать git add, но само слово add в данном случае будет звучать несколько неоднозначно, поэтому лучше использовать rm. На данном этапе еще можно вернуть все назад с помощью команды git checkout — <filename>, в результате, в нашу рабочую директорию будет скопирован файл из репозитория. Создадим коммит, фиксирующий удаление файла.
> git commit -m "remove main.c"
[master d4e22ae] remove main.c
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 main.c
Теперь в репозитории остался только один файл README.md.
> git ls-tree master
100644 blob 7e59600739c96546163833214c36459e324bad0a README.md
Второй способ – это сразу использовать команду git rm без предварительного удаления файла из директории. Вновь создадим файл main.c и добавим его в репозиторий.
> touch main.c > git add main.c > git commit -m "add main.c file" [master 6d93049] add main.c file 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 main.c > git ls-tree master 100644 blob 7e59600739c96546163833214c36459e324bad0a README.md 100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 main.c
Удалим файл из репозитория.
> git rm main.c rm 'main.c' > git commit -m "deleted: main.c file" [master ba7d027] deleted: main.c file 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 main.c
Файла main.c больше нет в репозитории.
> git ls-tree master
100644 blob 7e59600739c96546163833214c36459e324bad0a README.md
Его также нет и в рабочем каталоге.
> ls
README.md
Удалите файл README.md из репозитория самостоятельно.
Переименование файлов в git репозитории
Как и в случае с удалением, переименовать файл в git репозитории можно двумя способами – с использованием и без использования средств операционной системы.
Первый способ. Создадим файл test_main_file.c и добавим его в репозиторий.
> touch test_main_file.c > git add test_main_file.c > git commit -m "add test_main_file.c" [master 6cf53ac] add test_main_file.c 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test_main_file.c
Содержимое репозитория после этого будет выглядеть так.
> git ls-tree master
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 test_main_file.c
Переименуем его на test_main.c.
Сделаем это в рабочей директории.
> mv test_main_file.c test_main.c
Теперь отправим изменение в репозиторий.
> git add . > git commit -m "Rename test_main_file.c" [master 79528c4] Rename test_main_file.c 1 file changed, 0 insertions(+), 0 deletions(-) rename test_main_file.c => test_main.c (100%)
В репозитории и в рабочей директории будет находится только файл test_main.c.
> git ls-tree master 100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 test_main.c > ls test_main.c
Второй способ.
В рамках второго способа рассмотрим работу с командой git mv. Переименуем файл test_main.c в main.c. Текущее содержимое репозитория и рабочего каталога.
> git ls-tree master 100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 test_main.c > ls test_main.c
Переименуем файл test_main.c на main.c средствами git.
> git mv test_main.c main.c > git commit -m "Rename test_main.c file" [master c566f0e] Rename test_main.c file 1 file changed, 0 insertions(+), 0 deletions(-) rename test_main.c => main.c (100%)
Имя файла изменилось как в репозитории так и в рабочем каталоге.
> git ls-tree master 100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 main.c > ls main.c
Отличный курс по git делают ребята из GeekBrains, найдите в разделе “Курсы” курс “Git. Быстрый старт”, он бесплатный!
<<<Часть 7. Поговорим о HEAD и tree-ish Часть 9. Как удалить коммит в git?>>>
Самая короткая инструкция о том, как сохранить файлы в GitHub и ничего не сломать. И самое главное — никакой консоли, всё через окошки и с помощью мышки. Для этого используем GitHub Desktop.
Внимание! GitHub Desktop не работает на Windows 7×32, поэтому если у вас эта версия системы, обновитесь до Windows 10 или воспользуйтесь программой GitKraken на свой страх и риск.
В этой статье идёт рассказ о системах контроля версий. Если вы совсем ничего о них не знаете, прочитайте статьи «Словарь терминов для Git и GitHub» и «Введение в системы контроля версий», чтобы понять терминологию и разобраться, зачем мы вообще это делаем.
Регистрация и вход
Если у вас ещё нет аккаунта на GitHub, то о его создании есть отдельная статья в блоге Академии.
После первого входа в GitHub Desktop вас попросят ввести ваши логин и пароль от GitHub. com. После этого у вас появится доступ ко всем репозиториям, сохранённым в профиле.
Создание репозитория
Если вы никогда не пользовались гитхабом, нужно будет создать репозиторий для работы над проектом.
На главном экране GitHub Desktop выбираем пункт «Create a New Repository on your hard drive».
Нужно будет ввести название репозитория, его описание и выбрать папку на компьютере, куда будут сохраняться файлы.
После этого нажимаем на Create repository, ждём несколько секунд и готово — на компьютере появилась папка, которой можно пользоваться для разработки вашего проекта.
Клонирование репозитория
Если у вас уже какой-нибудь репозиторий на Гитхабе, его можно клонировать. Клонировать — это скачать все файлы к себе на компьютер, чтобы можно было их изменять и потом загружать обратно.
Выбираем Add -> Clone Repository…
В открывшемся окне выбираем один из имеющихся репозиториев. В данном случае он называется zaverstai, но у вас может быть любой другой.
После этого файлы репозитория начнут скачиваться — если их много, то это займет некоторое время.
Работа с репозиторием. Меняем файлы и сохраняем обратно
Вне зависимости от того, создали вы репозиторий или клонировали его, так выглядит GitHub Desktop с открытым репозиторием, в котором мы пока ничего не меняли.
Слева — поле для измененных файлов, справа — служебная информация. Слева снизу — поле для коммитов.
Если не усложнять, то склонированный репозиторий это просто каталог на компьютере. Можно нажать «Show in Finder» на Mac или «Show in Explorer» в Windows и откроется папка, где лежат все файлы, которые есть в репозитории.
Давайте добавим какой-нибудь файл. Например, я добавил в локальный репозиторий (скопировал в папку) файл index. html, который взял отсюда. Вы можете загрузить файл с кодом вашего проекта или изменить уже существующий.
Сразу после добавления или изменения файла в окне GitHub Desktop будет видно, что изменилось — если мы добавили целый новый файл, то все строчки будут с плюсиками и зелёные. Это значит, что они были добавлены в файл и GitHub Desktop раньше их никогда не видел.
Загружаем новый репозиторий на GitHub
Если вы не создавали новый репозиторий, а склонировали старый, то можете пропустить этот пункт.
После того, как мы добавили какой-то код в свежесозданный репозиторий, нужно сделать коммит, то есть зафиксировать все сохранённые изменения и дать им название. Текст должен быть лаконичным и в то же время сообщать о том, что делает коммит. Например, «добавляет имя наставника в Readme», «вводит функцию сортировки изображений», «правит ошибку в поиске городов на карте». Вводим имя жмём большую синюю кнопку «Commit to main»
Изменения, которые мы внесли и сохранили, пока локальны. Их нужно послать на GitHub. Чтобы опубликовать свежесозданный репозиторий на GitHub, нажмите Publish repository.
Появится подтверждение о публикации репозитория — проверяем название и описание, если нужно, ставим галочку о том, что код приватный, и публикуем.
Готово — после этого репозиторий появится в вашем профиле на GitHub. com.
Добавляем код и коммитим изменения
Репозиторий создан и загружен на GitHub, теперь нужно добавить немного кода.
Когда вы допишете код в файлы, которые находятся в репозитории, вы сможете просмотреть все их изменения в окне GitHub Desktop. Вот здесь, например, мы изменили «второй» на «третий» в тексте страницы — и изменения сразу видны, можно проверить, что всё исправленное будет загружено.
Дальше действуем по проверенной схеме — коммитим изменения.
В центре главного экрана появится предложение запушить коммит в удалённый репозиторий. Соглашаемся и жмём Push origin.
Готово! Теперь, если зайти на GitHub. com, в наш репозиторий, увидим уже изменённый файл, который мы только что отправили.
Всё получилось — теперь вы можете создать или склонировать репозиторий, добавить туда файлы, опубликовать всё это на GitHub. com, не прикасаясь к консоли. Это ли не чудо!
В этой статье была показана работа только с основной веткой репозитория. Если вы хотите разобраться, как создавать новые ветки (и зачем это нужно) и добавлять их в основную ветку, прочитайте статью «Работа с git через консоль». Это более сложная статья, поэтому можете сделать небольшой перерыв и вернуться к ней позже.
Больше статей
- Полезные команды для работы с Git
- Введение в системы контроля версий
- Шпаргалка по Git
- →
В предыдущей статье были рассмотрены основы систем контроля версий, их виды, а также выполнена установка и настройка Git, создан аккаунт на GitHub. В этой публикации мы продолжим изучения этих инструментов и подробно разберем базовые команды Git, которые используются в повседневной работе.
Начинающие программисты часто хватаются за голову от количества возможностей, которые предлагает Git и логики его работы. Да, понять все и сразу — задача сложно выполнимая. Но мы, чтобы все же с чего-то начать, пройдём для начала самые часто используемые команды. Это позволит вам поверить в себя и начать применять данный инструмент в своих проектах.
1. Основные термины Git
В Git используется своя терминология, которую я решил вынести в отдельный раздел, как глоссарий, чтобы вы могли к нему обращаться по мере необходимости.
Индекс — это часть локального репозитория (ЛР), хранящая не зафиксированные с помощью команды git add изменения файлов. Еще ее называют областью подготовки файлов. Эту область можно сравнить с черновиком (промежуточным этапом), из которого разработчик по завершению своей работы выбирает, какие изменения нужно зафиксировать (добавить в тот или иной коммит).
Индексирование — добавление изменений в индекс. После этой операции файлы попадают под версионный контроль Git (если они для него были незнакомы). Если файлы уже были под контролем Git, то их изменения просто попадают очередной раз в черновик, чтобы потом быть зафиксированными.
Коммит (commit) — фиксация изменений, взятых из индекса. Это действие заносит изменения в репозиторий Git. Его можно сравнить со слепком текущего состояния вашего ЛР. Вы берете из черновика (индекса) нужные изменения и коммитите текущее состояние файлов и папок. Это действие похоже на создание точки восстановления в Windows. Каждый коммит также является итогом вашей работы.
Закоммитить/коммитить — зафиксировать изменения, сделать слепок текущего состояния файлов и папок.
Клонирование репозитория (clone) — процесс скачивания копии УР к себе на компьютер. При этом создание ЛР происходит автоматически, без явного ввода git init.
Подтягивание изменений (pull) — работать с одним УР могут как разные люди, так и один разработчик с разных устройств. При такой ситуации, перед тем, как приступить к изменению файлов, необходимо начинать свою работу с получения всех коммитов, которые есть на УР. Коммиты в ЛР всегда должны совпадать с коммитами на УР, а иначе будут проблемы, решение которых мы рассмотрим в следующей статье.
Если упрощенно объединить все, что было сказано в этом разделе, то процесс работы с Git сводится к следующим шагам:
Ветка (branch) — это одно из направлений развития вашего проекта. Git позволяет вести параллельную работу (в разных ветках), в рамках одного репозитория, над одними и теми же файлами. У каждой ветки есть имя. Имя основной ветки — master (main).
Например, вам необходимо реализовать какую-то фичу (или исправить баг в коде) и чтобы не испортить уже работающую программу, которая находится в основной ветке, вы можете создать дополнительную, где будет вестись ее разработка. Таким образом, вы ничего не сломаете в основном коде, а если фича (или исправление ошибок) окажется удачной, то ваши наработки можно будут перенести в master (сделать слияние). Таких веток можно создавать сколько угодно. При необходимости удалять, объединять между собой.
Создавать новые ветки в данной статье мы пока не будем, т. к. эта тема требует отдельного рассмотрения.
2. Создание локального репозитория
В предыдущей статье, с помощью команды git init, мы создали ЛР — место на компьютере для хранения файлов и отслеживания в них любых изменений. Именно с этого шага начинается работа с Git.
Выполните команду git init в корне вашего проекта, как показано в образце ниже, если не делали этого ранее:
D:JavaStartJava
> git init
Initialized empty Git repository in D:/Java/StartJava/.git/
В результате, в папке StartJava появится скрытая директория .git (с точкой в начале), где и будет в дальнейшем храниться информация обо всех изменениях, сделанных в репозитории.
3. Связывание удаленного и локального репозитория
На следующем шаге свяжем ЛР с УР, чтобы код, хранящийся на вашем компьютере, можно было размещать на GitHub (или брать с него).
URL на ваш УР скопируйте, зайдя на github.com и выбрав протокол, который вы настроили для взаимодействия с GitHub в прошлой статье.
В итоге команда будет выглядеть так (используйте ссылку на свой репозиторий!):
> git remote add origin https://github.com/ichimax/startjava2.git
- git — используется приложение git
- remote — управляет удаленным репозиторием
- add — добавляет информацию об УР в ЛР
- origin — общепринятый псевдоним для URL УР
- https://github.com/ichimax/startjava2.git — ссылка на УР
Эту длинную команду можно трактовать так: Git, добавь к себе информацию о связи между УР github.com/ichimax/startjava2.git, которому я хочу дать псевдоним origin, с ЛР.
Проверим, что получилось, введя git remote -v:
> git remote -v
origin https://github.com/ichimax/startjava2.git (fetch)
origin https://github.com/ichimax/startjava2.git (push)
Взаимосвязь установлена успешно: напротив псевдонима origin размещается ссылка на УР.
4. Состояние репозитория
Одной из самых популярных и простых команд, которая используется постоянно, является git status. Она показывает в каком состоянии в текущий момент находится ЛР (какие файлы были изменены, что нового добавилось и т. д.).
Файлы в репозитории могут находиться в следующих состояниях:
- не отслеживаемые (untracked) — находящиеся в ЛР, но еще не добавленные в индекс (под версионный контроль). Это могут быть новые файлы
- индексированные (staged) — новые файлы, добавленные впервые в индекс
- зафиксированные (committed) — попавшие в коммит
- измененные (modified) — модифицированные после коммита
Файлы все время меняют свое состояние. Их жизненный цикл повторяется снова и снова.
Введем в консоли git status:
D:JavaStartJava (master)
> git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
about.txt
src/
nothing added to commit but untracked files present (use "git add" to track)
Команда вывела сообщение, которое означает, что Git видит src и about.txt, но не отслеживает, вносимые в них изменения. В связи с этим, он предлагает добавить файлы в индекс. Тут следует запомнить одну важную деталь: добавленные в репозиторий новые файлы не попадают сразу под версионный контроль. Git их просто видит, но не фиксирует в них изменения.
Если бы файлы сразу попадали в индекс, то тогда любые случайные файлы (с настройками, class, временные и т. д.) попадали бы под версионный контроль — был бы хаос. Git защищает нас от этого, требуя, чтобы мы сами контролировали этот процесс.
А теперь разберем все, что вывела команда git status:
- On branch master — [находимся] в ветке master
- No commits yet — нет коммитов [которые можно запушить]
- Untracked files — [имеются] неотслеживаемые файлы
- (use «git add <file>…» to include in what will be committed) — используйте «git add <file> …» для включения файлов в коммит, состояние [изменения] которых нужно зафиксировать.
Git увидел, что в ЛР есть не занесенные в индекс и незафиксированные изменения. Т.к. он src и about.txt видит впервые, то для него они по умолчанию являются измененными. Поэтому Git предлагает закоммитить (зафиксировать) их текущее состояние, чтобы уже от него учитывать все последующие изменения. - nothing added to commit but untracked files present (use «git add» to track) — ничего не добавлено в коммит, но присутствуют не отслеживаемые файлы (для отслеживания используйте «git add»)
Для того чтобы существующие файлы попали под версионный контроль (чтобы Git начал отслеживать изменения), их нужно добавить в индекс Git.
5. Добавление файлов в индекс
Добавим файлы в индекс, запустив команду git add . (с точкой в конце), а затем снова выполним git status.
D:JavaStartJava (master)
> git add .
D:JavaStartJava (master)
> git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: about.txt
new file: src/MyFirstApp.java
Точка, идущая после add означает, что в индекс будут добавлены все изменения, которые были сделаны в текущей папки и ее подпапках.
Если вам требуется добавить вообще все изменения, которые были сделаны в репозитории, начиная с его корня, то для этого нужно использовать параметр -A вместо точки.
В выводимом сообщении произошли изменения: src и about.txt перестали быть untracked, а позеленели и теперь находятся в индексе.
Git предлагает зафиксировать их текущее состояние, т. е. сделать коммит. При этом подсказывает, что если файлы по ошибке были добавлены в индекс, их можно из него удалить (привет class-файлам), сделав снова untracked. Эта возможность бывает полезна, когда в индекс по ошибке добавляются файлы, которые Git должен игнорировать.
Ситуацию с игнорированием файлов мы разберем ниже, когда будем говорить про .gitignore.
6. Коммит файлов
Осталось зафиксировать изменения из индекса с помощью команды commit. Это можно сделать двумя основными способами.
6.1. Первый способ
Напишем в консоли команду git commit. Откроется указанный ранее при настройке (установке) текстовый редактор. В нашем случае откроется новая вкладка, содержащая следующий шаблонный текст:
При этом в консоли отобразится текст «hint: Waiting for your editor to close the file…» (благодаря параметру —wait, который мы установили в предыдущей статье).
Текст во вкладке COMMIT_EDITMSG частично напоминает то, что выводил git status. В начале каждой строки идет символ #, говорящий о том, что текст закомментирован и несет только информационную нагрузку. На него можно не обращать внимание (или удалить полностью), он все равно не попадет в коммит или его описание.
Осталось ввести сообщение, содержащее краткое описание тех изменений, которые были сделаны в файлах. Такое сообщение называется описание к коммиту. В качестве примера запишем многострочное описание:
В многострочном описании первая строка является заголовком, включающим в себя общий смысл проделанных изменений. Она не должна превышать 50 символов и не имеет точку в конце. Далее обязательно должна идти пустая строка. А затем уже идет перечисление конкретных изменений.
Из заголовка видно, что данный коммит является первым (root-commit), т. к. в нем присутствует слово «Инициализация». Далее указаны пункты с теми изменениями, которые мы внесли в файлы проекта.
Сохраните, а затем закройте вкладку. Git создаст коммит, добавит к нему описание и выведет о нем информацию в консоль:
D:JavaStartJavasrc (master)
> git commit
[master (root-commit) 1e36e0f] Инициализация проекта
2 files changed, 6 insertions(+)
create mode 100644 about.txt
create mode 100644 src/MyFirstApp.java
Сообщение содержит следующие данные о коммите:
- master — для какой ветки он был выполнен
- root-commit — является корневым (первым) коммитом
- 1e36e0f — уникальный идентификатор (контрольная сумма)
- Инициализация проекта — описание (заголовок). При этом другие пункты — не отображаются
- 2 files changed — количество измененных файлов
- 6 insertions(+) — количество добавленных в файлах строк
- create mode 100644 — права доступа к файлам в Unix-стиле
6.2. Второй способ
Есть и другой способ создания коммита. Если комментарий к коммиту короткий, то его можно набрать прямо в командной строке.
Изменим название файла about.txt на README.md («Прочитай меня») и внесем в него изменения. В этом файле принято размещать описание проекта, который находится в репозитории.
GitHub позволяет форматировать текст в файлах, используя облегчённый язык разметки Markdown. Маркдаун-файлы как раз имеют расширение md.
Изменим имя файла с помощью Git и отобразим результат:
D:JavaStartJava (master)
> git mv about.txt README.md && ls
README.md src/
Откроем README.md, написав в консоли его имя, и жмем Enter. Затем, используя маркдаун, внесем в него следующие изменения:
# [StartJava](https://topjava.ru/startjava) — курс на Java для начинающих
## Используемые на курсе инструменты и технологии
1. Java
1. Git/GitHub
1. Командная строка
1. Sublime Text
1. Intellij IDEA
1. SQL
1. PostgreSQL
1. psql
Отобразим данный файл в браузере. Для этого необходимо нажать Ctrl + Shift + P, написать preview и выбрать первую строку с надписью «MarkDown Preview: Preview in Browser» (при этом пакет Markdown Preview должен быть установлен):
Откроется страница в браузере с отформатированным текстом:
Далее проверим статус файла (вывод дан в сокращенном виде):
D:JavaStartJava (master)
> git status
Changes to be committed:
renamed: about.txt -> README.md
Changes not staged for commit:
modified: README.md
Видим, что Git сам переименовал about.txt в README.md, а также пометил README.md как измененный.
Добавим все изменения в индекс, выполнив команду git add README.md с явным указанием имени измененного файла.
Перед тем как выполнить коммит, посмотрим, какие изменения мы хотим зафиксировать. Для этого пишем git status -v (вывод дан в сокращенном виде):
> git status -v
Changes to be committed:
new file: README.md
deleted: about.txt
diff --git a/README.md b/README.md
+++ b/README.md
+# [StartJava](https://topjava.ru/startjava) — курс на Java для начинающих
+
+## Используемые на курсе инструменты и технологии
+
+1. Java
+1. Git/GitHub
+1. Командная строка
+1. Sublime Text
+1. Intellij IDEA
+1. SQL
+1. PostgreSQL
+1. psql
diff --git a/about.txt b/about.txt
--- a/about.txt
-Интенсив StartJava - программирование на Java для начинающих!
На этот раз информации отобразилось значительно больше. В сообщении используется результат работы команды diff, которая сравнивает текущее состояние файла с последним коммитом и отображает все изменения.
Плюсом обозначаются добавленные в файл строки (выделены зеленым), а минусом удаленные (красные).
> git commit -m "Переименовал about.txt в README.md и внес в него описание проекта"
[master 39ba195] Переименовал about.txt в README.md и внес в него описание проекта
2 files changed, 12 insertions(+), 1 deletion(-)
create mode 100644 README.md
delete mode 100644 about.txt
Очень важно запомнить, что текст к коммиту (описание) должен максимально точно и кратко отражать те изменения, которые были сделаны. Не пишите в него бессмыслицу, и не копируйте один и тот же текст из предыдущих коммитов.
В итоге мы имеем еще один коммит. В консоли отобразился уже знакомый нам текст. В нем новой для нас является информация об удаленном файле. Остальную часть сообщения мы уже разбирали.
В каких случаях и как часто необходимо делать коммит:
- вы закончили создание нового функционала
- вы завершили запланированное исправление ошибок в коде
- в конце рабочего дня
Дополнительные правила создания коммита смотрите по ссылке.
7. Список коммитов
Чтобы посмотреть список (историю) всех имеющихся коммитов, воспользуемся командой git log (1, 2):
> git log
commit 39ba195cf96f555aaf2d9f0a2f3ffcfb37e0c536 (HEAD -> master)
Author: ichimax <myEmail>
Date: Thu Sep 22 16:31:55 2022
Переименовал about.txt в README.md и внес в него описание проекта
commit 1e36e0f6daf70d936627c444f8cb082bfffb9b17
Author: ichimax <myEmail>
Date: Thu Sep 22 13:02:17 2022
Инициализация проекта
- добавил файл с описанием проекта
- добавил реализацию первого класса
(END)
Команда отобразила информацию о каждом коммите, расположив их в обратном порядке: последний коммит всегда будет вверху.
Вывод заканчивается строкой с надписью (END), сообщающей, что список коммитов выведен в полном объеме. Для выхода из режима отображения — нажмите клавишу q (язык раскладки должен быть английским).
Информация к коммиту в себя включает следующие метаданные:
- уникальный идентификатор коммита по которому можно его найти (длинный набор букв и цифр)
- данные автора коммита, который его создал
- дату создания коммита
- краткое описание сделанных изменений
С помощью git log можно выводить информацию о конкретном количестве коммитов, а также видеть все изменения, содержащиеся в них:
Параметр -p позволяет отображать изменения (что добавили в файлы, что удалили), а -1 отвечает за количество отображаемых коммитов (в данном случае — один).
Если вам не требуется выводить подробную информацию по каждому коммиту, то можно воспользоваться сокращенным выводом с помощью опции —oneline, которая выводит каждый коммит в одну строку:
> git log --oneline
39ba195 (HEAD -> master) Переименовал about.txt в README.md и внес в него описание проекта
1e36e0f Инициализация проекта
8. Отправка коммитов на удаленный репозиторий
Сейчас оба наших коммита являются локальными — находятся в директории .git у вас на компьютере. Необходимо их загрузить (запушить) на УР на GitHub, используя команду push.
Предварительно введем git status:
> git status
On branch master
nothing to commit, working tree clean
Видим, что коммитить нам нечего, файлов, которые нужно добавить в индекс тоже нет. Выполним пуш, введя команду git push -u origin master:
> git push -u origin master
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 8 threads
Compressing objects: 100% (7/7), done.
Writing objects: 100% (8/8), 1.17 KiB | 238.00 KiB/s, done.
Total 8 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/ichimax/startjava2.git
* [new branch] master -> master
branch 'master' set up to track 'origin/master'.
Данная команда помимо того, что отправит на удаленный репозиторий коммиты, установит связь (с помощью параметра -u) между локальной и удаленной веткой master. В будущем, чтобы сделать пуш, достаточно будет ввести git push. Все остальные параметры указывать уже не обязательно.
После пуша, зайдите на ваш репозиторий на GitHub и убедитесь, что src/MyFirstApp.java и README.md были загружены.
9. Подтягивание изменений с УР
А теперь представим ситуацию, что вы работаете с УР на разных компьютерах (на работе и дома). Внеся какие-то изменения в файлы и запушив их, вы идете домой, где планируете вечером еще немного поработать над проектом.
Или возможна другая ситуация, когда над проектом работает команда программистов, каждый из которых вносит изменения в файлы и пушит их на УР.
Дома, вы открываете свой проект и хотите продолжить над ним работу. И тут вам приходит в голову мысль, а как мне получить с УР все изменения, которые сделали как вы, так и другие программисты, чтобы ваш домашний ЛР был в актуальном состоянии?
Для этого в Git предусмотрена команда pull, которая скачивает с GitHub к вам на компьютер все коммиты, которых нет в вашем ЛР.
Для простоты эксперимента внесем изменения прямо на GitHub (да, это возможно) и подтянем их в свой ЛР.
Изменим код в файле MyFirstApp.java на следующий:
public class MyFirstApp {
public static void main(String[] args) {
System.out.print("Написано однажды, ");
System.out.println("работает везде!");
}
}
Пример того, как это можно сделать на GitHub, включая создание коммита:
Затем подтянем новый коммит в ЛР:
> git pull
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), 942 bytes | 40.00 KiB/s, done.
From https://github.com/ichimax/startjava2
39ba195..b59d871 master -> origin/master
Updating 39ba195..b59d871
Fast-forward
src/MyFirstApp.java | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
Теперь количество коммитов в ЛР и УР совпадают — ЛР содержит данные в актуальном состоянии. Можно спокойно продолжить работу.
Выполняйте команду git pull всякий раз перед тем, как начинаете работать над своим проектом (пишите код, вносите какие-то изменения). Эта привычка защитит вас от множества проблем.
10. Клонирование репозитория
После того, как ваш (или чей-то) проект оказался на GitHub, любой желающий может скачать его копию с помощью git clone.
Для примера скачаем какой-нибудь другой репозиторий, но не в наш проект, а в любое место на жестком диске:
D:Java
> git clone https://github.com/ichimax/Java-Style-Guide.git
Cloning into 'Java-Style-Guide'...
remote: Enumerating objects: 69, done.
remote: Counting objects: 100% (69/69), done.
remote: Compressing objects: 100% (66/66), done.
Receiving objects: 33% (23/69)
Receiving objects: 100% (69/69), 22.24 KiB | 1.71 MiB/s, done.
Resolving deltas: 100% (19/19), done.
При этом новый ЛР создастся автоматически с уже прописанным УР и будет содержать всю историю изменения проекта.
Зайдем в новый репозиторий и введем уже известные нам команды:
> cd Java-Style-Guide && ls -a && git status && git remote -v
./ ../ .git/ guide.md README.md
On branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree clean
origin https://github.com/ichimax/Java-Style-Guide.git (fetch)
origin https://github.com/ichimax/Java-Style-Guide.git (push)
11. Игнорирование файлов и папок
Обычно в любом проекте имеются файлы или целые директории, которые не несут никакого практического смысла. Зачастую их даже не безопасно помещать в коммит, а тем более загружать на УР на всеобщее обозрение. В таких случаях, чтобы исключить их случайное попадание под версионный контроль, в Git есть механизм их игнорирования с помощи специального файла .gitignore (с точкой в начале), который содержит список файлов и папок (каждый на новой строке), которые Git должен игнорировать и не добавлять под версионный контроль.
Давайте поэкспериментируем, создав условия для использования данного файла. Самое простое, что мы можем сделать — это скомпилировать MyFirstApp.java, чтобы в репозитории появился class-файл. Делать это мы уже умеем (если кто-то пропустил, то данная тема разбиралась ранее).
> javac MyFirstApp.java && ls
MyFirstApp.class MyFirstApp.java
Нужный нам class-файл появился. С этого момента все class-файлы для нас являются «мусорными». Ни при каких обстоятельствах их нельзя включать в коммит, а тем более пушить в удаленный репозиторий.
На GitHub нужно хранить только разные версии ваших файлов к которым в будущем можно вернуться (откатиться). class-файлы нужны только для запуска программ. Для версионного контроля они не представляют никакой ценности.
Создадим .gitignore в корне нашего проекта:
D:JavaStartJava (master -> origin)
> touch .gitignore
Отобразим все файлы и папки:
> tree /F
D:.
│ .gitignore
│ README.md
│
└───src
MyFirstApp.class
MyFirstApp.java
Не лишним будут посмотреть статус репозитория:
> git status
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
src/MyFirstApp.class
Репозиторий содержит два новых неотслеживаемых файла. Один из них нужно игнорировать (чтобы Git его даже не отображал).
Для этого откроем .gitignore и пропишем в нем правило (шаблон), которое позволит игнорировать любые class-файлы. Для этого воспользуемся маской и расширением *.class. Эта запись означает, что все файлы (не важно, как они названы), которые имеют расширение class, будут игнорироваться Git. Это максимально универсальный способ, который позволяет не писать явно имя каждого class-файла, который нужно игнорировать.
Если требуется добавить в него папку, которая находится в одной директории с .gitignore, достаточно написать ее имя. Например, .gitignore может содержать следующее:
*.class
*.DS_Store
*.iml
out/
lib/
.idea/
После имени директории можно указывать /, говорящий о том, что это директория, но так делать не обязательно.
В данный файл, по мере изучения Java, мы будем добавлять новые шаблоны. Не скачивайте из интернета универсальные шаблоны с множеством непонятных и не нужных вам записей. Добавляйте в .gitignore правила по мере необходимости.
Снова проверим статус репозитория:
> git status
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
Вуаля, class-файла, как не бывало (при этом он, конечно же, не удалился, а просто не отображается и игнорируется Git).
Осталось проделать привычные действия с новым файлом, которые уже не нуждаются в пояснении:
git add .
git commit -m "Добавил .gitignore с шаблоном *.class"
git push
git log --oneline
12. Список команд
Список команд, разобранных в статье, с кратким описанием.
Заключение
В данной статье мы рассмотрели самые популярные и часто используемые команды Git. Это очень мощный и многофункциональный инструмент, возможности которого нужно изучать по мере необходимости. Вам же остается не останавливаться в его познании самостоятельно углубляться во все его тонкости.
Оцените статью, если она вам понравилась!