Git работа с удаленным репозиторием, основные команды.

В прошлый раз мы создали новый репозиторий и залили в него тестовый файл. Сегодня рассмотрим основные команды для работы с удаленным репозиторием. Запускаем терминал Git Bash и переходим в директорию нашего репозитория:

waky@DESKTOP-A92D0OT MINGW64 ~
$ cd repositories/useful_scripts/

waky@DESKTOP-A92D0OT MINGW64 ~/repositories/useful_scripts (main)
$

Мы оказались в главной ветке main. Первым делом убедимся, что наша локальная ветка имеет актуальную версию. Для этого надо спулить ветку из репы GitHub. Выполним команду:

waky@DESKTOP-A92D0OT MINGW64 ~/repositories/useful_scripts (main)
$ git pull origin main
From https://github.com/waky-ru/useful_scripts
* branch            main      -> FETCH_HEAD
Already up to date.

Ожидаемо, никто не вносил изменения в ветку после нас, поэтому можем продолжать. В тот раз, мы записывали изменения сразу в главную ветку, но это не правильно с точки зрения организации контроля версий. Представим, что наш тестовый файл участвует в некоторой разработке, в ходе которой он будет меняться. Создадим локально новую ветку:

waky@DESKTOP-A92D0OT MINGW64 ~/repositories/useful_scripts (main)
$ git checkout -b develop
Switched to a new branch 'develop'

waky@DESKTOP-A92D0OT MINGW64 ~/repositories/useful_scripts (develop)

Команда checkout с аргументом -b создает новую ветку, а без него переключает на существующую. Мы создали ветку develop и переключились на нее. Внесем изменения в файл test.txt можете использовать текстовый редактор, а можете непосредственно из консоли:

waky@DESKTOP-A92D0OT MINGW64 ~/repositories/useful_scripts (develop)
$ cat test.txt
TEST

waky@DESKTOP-A92D0OT MINGW64 ~/repositories/useful_scripts (develop)
$ echo "changes made during develop" >> test.txt

waky@DESKTOP-A92D0OT MINGW64 ~/repositories/useful_scripts (develop)
$ cat test.txt
TEST
changes made during develop

Теперь тестовый файл, находящийся в ветке develop, содержит дополнительную строку, по сравнению с версией файла из ветки main. Проверим статус текущей ветки:

waky@DESKTOP-A92D0OT MINGW64 ~/repositories/useful_scripts (develop)
$ git status
On branch develop
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git restore ..." to discard changes in working directory)
modified:  test.txt

no changes added to commit (use "git add" and/or "git commit -a")

Git сообщает нам что у нас изменился файл test.txt Давайте восстановим его прежнее состояние:

waky@DESKTOP-A92D0OT MINGW64 ~/repositories/useful_scripts (develop)
$ git restore test.txt

waky@DESKTOP-A92D0OT MINGW64 ~/repositories/useful_scripts (develop)
$ cat test.txt
TEST

Если с командой restore вместо имени файла использовать точку( git restore . ) , то откатятся все изменения. Ладно, нам все равно нужны изменения в файле для наших экспериментов, поэтому внесем в файл еще одну строку:

waky@DESKTOP-A92D0OT MINGW64 ~/repositories/useful_scripts (develop)
$ echo "another changes made during develop" >> test.txt

waky@DESKTOP-A92D0OT MINGW64 ~/repositories/useful_scripts (develop)
$ cat test.txt
TEST
another changes made during develop

Чтобы отправить наши изменения в удаленный репозиторий нужно добавить изменения и закоммитать их:

waky@DESKTOP-A92D0OT MINGW64 ~/repositories/useful_scripts (develop)
$ git add test.txt

waky@DESKTOP-A92D0OT MINGW64 ~/repositories/useful_scripts (develop)
$ git commit -m 'new line in test.txt'
[develop 71142ad] new line in test.txt
 1 file changed, 1 insertion(+)

Если изменениям подверглись сразу несколько файлов в репе, необязательно перечислять их всех. Можно использовать флаг -A ( git add -A ), чтобы сразу добавить все изменения. Нам осталось только запушить нашу ветку в удаленный репозиторий:

waky@DESKTOP-A92D0OT MINGW64 ~/repositories/useful_scripts (develop)
$ git push origin develop
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 290 bytes | 290.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
remote:
remote: Create a pull request for 'develop' on GitHub by visiting:
remote:      https://github.com/waky-ru/useful_scripts/pull/new/develop
remote:
To https://github.com/waky-ru/useful_scripts
 * [new branch]      develop -> develop

Заходим в наш репозиторий на GitHub. Переходим во вкладку Code и открываем наш тестовый файл. Переключаемся между ветками и видим, что в разных ветках содержимое файла отличается:

Представим, что на данном этапе разработки мы достигли своей цели, и теперь нам нужно чтобы в основной ветке файл так же был обновлен. Переходим во вкладку Pull requests и жмем New pull request. Выбираем ветку в которую будем пулить — main, и из которой — develop. Git подсветит нам изменения, которые претерпит файл в результате пула. Нажимаем Create pull request.

Если вы работаете в команде, то обычно на этом этапе другой человек, должен проверить и одобрить внесение ваших изменений. Но так как мы тут сами по себе, жмем Merge pull request, чтобы смержить изменения в ветку. Подтверждаем мерж Confirm merge.

Можете вернуться во вкладку Code и проверить что ветка main одержит обновленный файл, а перейдя в Blame можно увидеть историю изменений.

Возвращаемся в терминал. И переключаемся обратно на главную ветку. Попробуем еще раз спулить ветку из репозитория:

waky@DESKTOP-A92D0OT MINGW64 ~/repositories/useful_scripts (develop)
$ git checkout main
Switched to branch 'main'
Your branch is up to date with 'origin/main'.

waky@DESKTOP-A92D0OT MINGW64 ~/repositories/useful_scripts (main)
$ git pull origin main
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
Unpacking objects: 100% (1/1), 894 bytes | 298.00 KiB/s, done.
From https://github.com/waky-ru/useful_scripts
* branch            main      -> FETCH_HEAD
a457e15..8a84388  main      -> origin/main
Updating a457e15..8a84388
Fast-forward
test.txt | 1 +
1 file changed, 1 insertion(+)

Git обновил версию файла test.txt в ветке main. Мы опробовали основные команды, необходимые, для полного цикла работы с удаленным репозиторием Git.