Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 92 additions & 0 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
name: Assignment Checking

on:
pull_request:
branches:
- master

jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Check fork
if: ${{ !cancelled() }}
run: |
if [[ "${{ github.repository }}" != "${{ github.event.pull_request.head.repo.full_name }}" ]]; then
echo "Success: PR is created from a fork"
else
echo "Error: PR is created from '${{ github.event.pull_request.head.repo.full_name }}'"
exit 1
fi

- name: Check branch name
if: ${{ !cancelled() }}
run: |
if [[ "${{ github.event.pull_request.head.ref }}" == "homework" ]]; then
echo "Success: PR source branch is 'homework'"
else
echo "Error: PR source branch is '${{ github.event.pull_request.head.ref }}'"
exit 1
fi

- name: Check commit count
if: ${{ !cancelled() }}
run: |
# Получаем хэши базовой и головной веток PR
BASE_SHA=${{ github.event.pull_request.base.sha }}
HEAD_SHA=${{ github.event.pull_request.head.sha }}

# Подсчитываем количество коммитов между базой и головой PR
COMMIT_COUNT=$(git rev-list --count $BASE_SHA..$HEAD_SHA)

echo "Info: Number of commits in PR: $COMMIT_COUNT"

# Проверяем, что количество коммитов равно 2
if [ "$COMMIT_COUNT" -ne 2 ]; then
echo "Error: Commit count in PR is incorrect, excected 2 commits, got $COMMIT_COUNT"
exit 1
else
echo "Success: Commit count is correct"
fi

- name: Check changed files count
if: ${{ !cancelled() }}
run: |
# Получаем хэши базовой и головной веток PR
BASE_SHA=${{ github.event.pull_request.base.sha }}
HEAD_SHA=${{ github.event.pull_request.head.sha }}

# Подсчитываем количество изменённых файлов
FILE_COUNT=$(git diff --name-only $BASE_SHA..$HEAD_SHA | wc -l)

echo "Info: Number of changed files in PR: $FILE_COUNT"

# Проверяем, что изменён ровно 1 файл
if [ "$FILE_COUNT" -ne 1 ]; then
echo "Error: Changed files count is incorrect, expected 1 changed file, got $FILE_COUNT"
exit 1
else
echo "Success: Changed files count is correct"
fi

- name: Check base commit SHA
if: ${{ !cancelled() }}
run: |
# Заданный SHA, из которого должна быть создана ветка
EXPECTED_SHA="e29acfeee8b29ec6b18d3f4cfa0c1833293a14ec"

# SHA последнего коммита в ветке PR
HEAD_SHA=${{ github.event.pull_request.head.sha }}

# Проверяем, содержит ли история ветки PR ожидаемый SHA
if git merge-base --is-ancestor "$EXPECTED_SHA" "$HEAD_SHA"; then
echo "Success: PR branch is based on expected commit SHA"
else
echo "Error: PR branch is not based on expected commit SHA"
exit 1
fi
22 changes: 22 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,25 @@
# Simulative Git Module

Hello, GitHub!

## Домашнее задание

Вступление: дальше по тексту мы будем использовать термин «код», но подразумевать при этом будем любое содержимое файлов. Наша цель сейчас – научиться работать с Git, а не с каким-то языком программирования, поэтому на код отвлекаться не очень хочется.

Итак, представьте себе: Вы – разработчик в IT-компании. Вместе с командой других разработчиков Вы делаете наикрутейший проект, в котором используется сторонняя библиотека с открытым исходным кодом. В какой-то момент работы над проектом вы замечаете, что ваш проект работает не так, как вы ожидаете - всему виной оказывается ошибка в коде сторонней библиотеки! Вы отправляетесь в [Issues](https://github.com/Illumaria/simulative-git/issues) репозитория библиотеки, чтобы завести сообщение об ошибке и попросить разработчиков библиотеки исправить её, но оказывается, что эту ошибку ранее уже заметил и решил исправить один из [мейнтейнеров](https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%B9%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80) официального репозитория. К несчастью, этот мейнтейнер покинул команду, и задача осталась недоделанной. Вы решаете взять дело в свои руки, ведь так Вы и вклад в развитие библиотеки внесёте, и своему проекту поможете!

Каков план действий?
1. Поскольку разработкой сторонней библиотеки занимается другая команда, коммитить напрямую в официальный репозиторий Вы не сможете. Не беда, ведь можно создать форк, сделать там нужную работу, а затем отправить изменения обратно в официальный репозиторий посредством [пулл-реквеста](https://github.com/Illumaria/simulative-git/pulls). Давайте начнём с первого пункта: создайте форк [репозитория](https://github.com/Illumaria/simulative-git) со всеми его ветками.
2. Отлично, Вы скопировали официальный репозиторий и теперь имеете свой собственный репозиторий, но удалённый. Качественно вести разработику в удалённом практически невозможно, поэтому теперь вам необходимо клонировать ваш удалённый репозиторий на рабочий компьютер.
3. Из описания проблемы в Issues вы увидели, что мейнтейнер работал в ветке `experiment` основного репозитория. Поскольку вы создали форк со всеми ветками основного репозитория, то у вас эта ветка тоже есть. Самое время на неё переключиться.
4. Изучив содержимое файлов и журнал коммитов этой ветки, вы поняли, что для решения задачи часть последних коммитов просто не нужна, а другая часть нуждается в минорных изменениях. Свою работу Вы решили начать с наиболее раннего коммита, где требуются исправления: это коммит с заголовком `"Update experiment.txt"`. Найдите в истории коммитов его идентификатор, переключитесь на него и создайте из него новую ветку с именем `homework`.
5. Теперь - самое главное: исправляем ошибку в коде. Для этого достаточно в содержимом файла `experiment.txt` заменить слово `experiment` на `homework`.
6. Вы всё протестировали и убедились в том, что ваши изменения действительно решают исходную проблему. Ура! Осталось проделать обратный путь и отправить изменения в официальный репозиторий. Но если вы прямо сейчас отправите свои текущие изменения в свой же удалённый репозиторий и откроете пулл-реквест в основную (`master`) ветку официального репозитория, то ничего не выйдет:
<img width="1242" alt="image" src="https://github.com/Illumaria/simulative-git/assets/47138294/49bdd63a-52a9-4575-a47f-c129bcd0e3bb">
Причина в том, что пока тот мейнтейнер делал работу, ветка `master` убежала вперёд. Вам нужно нагнать изменения в ней, вмержив её изменения в свою ветку `homework`. Однако, использовав `git merge`, история вашей ветки будет не самой красивой:
<img width="1247" alt="image" src="https://github.com/Illumaria/simulative-git/assets/47138294/359e789a-745e-417b-b9e7-c9c8332ac3f7">
Появился merge-коммит! Это не смертельно, но в данном случае можно обойтись и без него, немножко переписав историю:
<img width="1230" alt="image" src="https://github.com/Illumaria/simulative-git/assets/47138294/91a75d7d-ccf0-4b73-b3d3-10e26099ff79">
Как этого добиться? Поскольку с вашей веткой, кроме вас, сейчас никто не работает, можно абсолютно безопасно использовать `git rebase`. Сделайте это: синтаксис команды запуска ребейза можно подсмотреть с помощью `git rebase --help`, а то, что делать после начала ребейза, вам подскажет сам git. Читайте _предельно_ внимательно, ничего не пропускайте. Это важно! И помните, что при разрешении конфликта вам нужно _просто выбрать_ ту версию изменений, которую вы хотите оставить, стерев всё ненужное и оставив только нужное.
8. Теперь, когда все изменения внесены, тесты проведены, а история ветки приняла окончательный вид, можно отправлять работу на проверку. Но сначала - в свой удалённый репозиторий.
9. Последний шаг: можно открывать пулл-реквест! Внимательно проверьте ветки - как исходную (то есть ветку в _своём_ удалённом репозитории, изменения _из_ которой вы хотите внести), так и конечную (ветку в _официальном_ репозитории, _в_ которую вы хотите внести ваши изменения). Всё проверили? Тогда остаётся только нажать `Create Pull-Request` и ждать ответа мейнтейнеров!
1 change: 1 addition & 0 deletions experiment.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This line was added in the homework branch!
1 change: 1 addition & 0 deletions master.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This line was added in the master branch!