Введение
В этой лабораторной работе вы узнаете, как обрабатывать распространенный сценарий Git: когда ваша локальная ветка опережает удаленный репозиторий. Эта ситуация возникает, когда вы делаете коммиты локально, но еще не отправили их в удаленный репозиторий. К концу этой лабораторной работы вы поймете, как определить, когда ваша ветка опережает удаленную, и как правильно синхронизировать ваши локальные и удаленные репозитории.
Внесение локальных изменений
На этом шаге вы внесете изменения в свой локальный репозиторий, которые еще не были отправлены (pushed) в удаленный репозиторий, создавая сценарий "опережения origin" (ahead of origin).
Настройка репозитория
Сначала нам нужно настроить репозиторий, с которым мы будем работать. В качестве отправной точки мы будем использовать репозиторий git-playground. Поскольку для выполнения этой лабораторной работы вам потребуются права на отправку (push permissions), вам сначала нужно будет сделать форк (fork) этого репозитория.
Форкинг репозитория
- Посетите https://github.com/labex-labs/git-playground в вашем браузере
- Нажмите кнопку "Fork" в правом верхнем углу, чтобы создать собственную копию репозитория
- После форка запишите свое имя пользователя GitHub — оно понадобится вам на следующем шаге
Клонирование вашего форкнутого репозитория
Теперь давайте клонируем ваш форкнутый репозиторий на локальную машину. Замените YOUR_USERNAME на ваше фактическое имя пользователя GitHub:
cd ~/project
git clone https://github.com/YOUR_USERNAME/git-playground.git
cd git-playground
После клонирования убедитесь, что удаленный репозиторий настроен правильно:
git remote -v
Вы должны увидеть вывод, показывающий ваш форкнутый репозиторий как удаленный репозиторий origin:
origin https://github.com/YOUR_USERNAME/git-playground.git (fetch)
origin https://github.com/YOUR_USERNAME/git-playground.git (push)
Понимание локальных и удаленных репозиториев
Git работает по распределенной модели, где у каждого разработчика есть полная копия репозитория на своей локальной машине. Изменения, внесенные локально, должны быть явно синхронизированы с удаленным репозиторием.
Теперь давайте проверим текущее состояние нашего репозитория:
git status
Вы должны увидеть вывод, похожий на этот:
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
Это означает, что ваш локальный репозиторий в настоящее время синхронизирован с удаленным репозиторием.
Создание нового файла
Давайте создадим новый файл в нашем репозитории:
echo "This is a new file for our project." > new_file.txt
После создания файла нам нужно добавить его в область проиндексированных изменений (staging area) Git:
git add new_file.txt
Теперь зафиксируем (commit) этот файл в нашем локальном репозитории:
git commit -m "Add new_file.txt"
Вы должны увидеть вывод, подтверждающий ваш коммит:
[master 1a2b3c4] Add new_file.txt
1 file changed, 1 insertion(+)
create mode 100644 new_file.txt
Проверка статуса ветки
Теперь, когда мы внесли локальный коммит, давайте снова проверим статус нашего репозитория:
git status
На этот раз вы должны увидеть:
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
Это сообщение указывает на то, что ваша локальная ветка имеет один коммит, который еще не был отправлен в удаленный репозиторий. Это именно та ситуация, которую мы хотели создать — ваша ветка теперь "опережает origin" (ahead of origin).
Просмотр различий между ветками
Теперь, когда ваша локальная ветка опережает удаленную ветку, давайте рассмотрим, как просмотреть конкретные различия между вашей локальной и удаленной ветками.
Понимание ссылок на ветки
В Git вы ссылаетесь на удаленную ветку, используя формат origin/branch-name. Термин origin — это имя по умолчанию для удаленного репозитория, а branch-name — это имя ветки (в нашем случае это master).
Просмотр различий в коммитах
Чтобы увидеть коммиты, которые существуют в вашей локальной ветке, но отсутствуют в удаленной ветке, используйте следующую команду:
git log origin/master..HEAD
Вывод покажет вам коммит(ы), которые находятся в вашей локальной ветке (HEAD), но отсутствуют в удаленной ветке (origin/master):
commit 1a2b3c4d... (HEAD -> master)
Author: LabEx User <labex@example.com>
Date: ...
Add new_file.txt
Просмотр различий в файлах
Чтобы увидеть, какие файлы отличаются между вашей локальной и удаленной ветками, используйте:
git diff --name-status origin/master..HEAD
Вывод должен показать:
A new_file.txt
Это указывает на то, что new_file.txt был добавлен в вашей локальной ветке, но не существует в удаленной ветке.
Понимание визуализации различий
Чтобы увидеть фактические различия в содержимом, вы можете использовать:
git diff origin/master..HEAD
Это покажет конкретные изменения, внесенные в каждый файл:
diff --git a/new_file.txt b/new_file.txt
new file mode 100644
index 0000000..3b2aed8
--- /dev/null
+++ b/new_file.txt
@@ -0,0 +1 @@
+This is a new file for our project.
Эти команды помогут вам понять, какие именно изменения находятся в вашей локальной ветке, которые еще не были отправлены в удаленный репозиторий.
Отправка изменений в удаленный репозиторий (Pushing Changes to Remote)
Теперь, когда вы поняли, какие изменения присутствуют в вашей локальной ветке, пришло время синхронизировать ваш локальный репозиторий с удаленным репозиторием, отправив ваши изменения.
Понимание команды Git Push
Команда git push отправляет ваши локальные коммиты в удаленный репозиторий. При выполнении push вы синхронизируете удаленную ветку с вашей локальной веткой, делая обе ветки идентичными.
Отправка ваших изменений
Чтобы отправить ваши локальные коммиты в удаленный репозиторий, используйте:
git push origin master
Вы должны увидеть вывод, похожий на следующий:
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 2 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 324 bytes | 324.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/YOUR_USERNAME/git-playground.git
abcd123..1a2b3c4 master -> master
Вывод показывает:
- Git подсчитал и сжал объекты в вашем коммите
- Изменения были успешно отправлены в удаленный репозиторий
- Идентификаторы старого и нового коммитов
- Обновленная ветка (
master -> master)
Проверка отправки (Push Verification)
Давайте снова проверим статус нашего репозитория:
git status
Теперь вы должны увидеть:
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
Это подтверждает, что ваша локальная ветка теперь синхронизирована с удаленной веткой. Сообщение "ahead of origin" исчезло, потому что обе ветки теперь содержат одинаковые коммиты.
Проверка содержимого удаленного репозитория
Мы можем убедиться, что наши изменения теперь находятся в удаленном репозитории, просмотрев журнал (log) удаленной ветки:
git log origin/master -1
Эта команда показывает самый последний коммит в удаленной ветке, который теперь должен включать наш новый файл:
commit 1a2b3c4d... (HEAD -> master, origin/master)
Author: LabEx User <labex@example.com>
Date: ...
Add new_file.txt
Обратите внимание, что и HEAD -> master, и origin/master теперь указывают на один и тот же коммит, что подтверждает синхронизацию обеих веток.
Создание и разрешение ситуации, когда локальная ветка опережает удаленную на несколько коммитов
В реальных сценариях ваша локальная ветка может опережать удаленную ветку на несколько коммитов. Давайте создадим такую ситуацию и научимся ее разрешать.
Создание нескольких локальных коммитов
Создадим и зафиксируем (закоммитим) несколько изменений:
## Create a second file
echo "This is the second file." > second_file.txt
git add second_file.txt
git commit -m "Add second_file.txt"
## Modify the README
echo "### Additional Information" >> README.md
echo "This project demonstrates Git branch synchronization." >> README.md
git add README.md
git commit -m "Update README with additional information"
Теперь проверим наш статус:
git status
Вы должны увидеть:
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
Просмотр различий в нескольких коммитах
Посмотрим, какие коммиты у нас есть локально, которых нет в удаленном репозитории:
git log origin/master..HEAD --oneline
Вы должны увидеть два ваших новых коммита:
abcd123 Update README with additional information
efgh456 Add second_file.txt
Отправка нескольких коммитов
Чтобы синхронизировать все ваши локальные коммиты с удаленным репозиторием, используйте ту же команду push:
git push origin master
Вывод покажет, что отправляются оба коммита:
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 2 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (5/5), 574 bytes | 574.00 KiB/s, done.
Total 5 (delta 1), reused 0 (delta 0), pack-reused 0
To https://github.com/YOUR_USERNAME/git-playground.git
1a2b3c4..abcd123 master -> master
Проверка отправки всех коммитов
Давайте снова проверим наш статус:
git status
Вы должны увидеть:
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
Это подтверждает, что все ваши локальные коммиты были успешно отправлены в удаленный репозиторий.
Резюме
В этой лабораторной работе вы узнали, как обрабатывать ситуации, когда ваша локальная ветка Git опережает удаленную ветку. Вы успешно выполнили следующее:
- Создали локальный коммит, который привел к тому, что ваша ветка опередила удаленную ветку.
- Использовали команды Git для просмотра конкретных различий между вашими локальной и удаленной ветками.
- Отправили (pushed) ваши изменения для синхронизации локального и удаленного репозиториев.
- Создали несколько коммитов локально и отправили их все сразу в удаленную ветку.
Эти навыки являются неотъемлемой частью повседневного рабочего процесса Git, поскольку они помогают поддерживать синхронизацию ваших локальных и удаленных репозиториев, что критически важно для эффективного сотрудничества в проектах по разработке программного обеспечения. Помните, что регулярная синхронизация ваших веток помогает предотвратить конфликты и делает совместную работу более плавной.



