✅ Решения и ответы

К оглавлению урока

⚡ Ответы на опрос

  • Шебанг — #!/bin/bash; указывает интерпретатор скрипта
  • При ошибке в команде скрипт продолжит выполнение (не прервётся)
  • git merge — объединить изменения двух веток; создаёт merge commit
  • git rebase — переносит коммиты поверх целевой ветки; линейная история, но переписывает хэши
  • Золотое правило: rebase никогда не применять к публичным ветками

Ответы на экспресс-опрос: Занятие 18

1. Что такое шебанг?
Первая строка скрипта #!/bin/bash (или #!/bin/sh) — указывает операционной системе, какой интерпретатор использовать для выполнения файла. Без шебанга оболочка может не понять, как запустить файл.
2. Что случится при ошибке в команде?
По умолчанию bash продолжит выполнение скрипта, даже если одна из команд завершилась с ошибкой. Чтобы скрипт прекращал работу при ошибке — добавьте set -e в начало.
3. Сколько команд в скрипте?
Минимум — 1 команда (технически даже шебанг достаточен). Максимум — не ограничен; скрипты могут содержать тысячи строк.
4. Что такое цикл в скрипте?
Цикл — конструкция, которая позволяет повторять набор команд многократно. Bash предоставляет for (итерация по списку) и while (выполнение пока условие истинно).
5. Зачем нужен цикл?
Для автоматизации повторяющихся операций: обработки множества файлов, создания N объектов, мониторинга условий и т.д.
6. Способы запуска скриптов
  • ./script.sh — если файл исполняемый (chmod +x)
  • bash script.sh — явно вызывает bash-интерпретатор
  • sh script.sh — использует sh-интерпретатор
  • source script.sh или . script.sh — выполнить в текущей оболочке
7. Что сделать перед запуском?
Добавить права на исполнение: chmod +x script.sh. Без этого попытка запустить через ./script.sh даст ошибку «Permission denied».

Ответы на экспресс-опрос: Занятие 19

1. Цель git merge?
Объединить изменения из одной ветки в другую. Git merge создаёт дополнительный merge commit, который сохраняет историю обеих веток.
2. Отличие git rebase от git merge?
git merge создаёт дополнительный коммит слияния; история сохраняет оба «потока». git rebase переносит коммиты текущей ветки поверх целевой; история становится линейной, но хэши коммитов изменяются.
3. Золотое правило rebase?
Никогда не применять rebase к публичным (общедоступным) веткам. Перед rebase задайте вопрос: «Кто-нибудь ещё работает с этой веткой?» Если да — используйте merge.
4. Для чего git commit --amend?
Для изменения последнего коммита без создания нового: исправить сообщение коммита или добавить забытые файлы. Опасно применять после push (изменяет хэш коммита).
5. Предостережения git reset?
git reset --hard безвозвратно удаляет изменения в рабочем каталоге. Не применять на публичных ветках. Предпочтительны --soft (сохраняет в staging) или --mixed (сохраняет в рабочем каталоге).
6. Функция git checkout?
Переключение между ветками (git checkout main), создание и переключение на новую ветку (git checkout -b feature), восстановление файлов из определённого коммита.
7. Отличие git revert от git reset?
git revert создаёт новый коммит, отменяющий изменения — история не меняется, безопасно на публичных ветках. git reset изменяет историю путём перемещения HEAD — при --hard удаляет данные, опасно на публичных ветках.

Решение задания 1: скрипт для .txt файлов

# txt_chmod.sh
#!/bin/bash
DIRECTORY="/home/YOURGROUP"
FILE_LIST=$(ls -p "$DIRECTORY" | grep -v /)
for FILE in $FILE_LIST
do
        if [[ "$FILE" == *.txt ]]; then
        chmod +rw "$DIRECTORY/$FILE"
        echo "Added read/write permission: $FILE"
    fi
done
echo "Done! Read/write permissions added for .txt files in: $DIRECTORY"

Решение задания 2: rebase и merge с feature1/feature2

# Клонируем репозиторий
git clone git@github.com:USERNAME/practice-repo.git
cd practice-repo

# Создаём две ветки
git checkout -b feature1
echo "Content of feature1" > file1.txt
git add file1.txt && git commit -m "Add file1.txt"

git checkout main
git checkout -b feature2
echo "Content of feature2" > file2.txt
git add file2.txt && git commit -m "Add file2.txt"

# Переключаемся на feature1 и делаем rebase поверх feature2
git checkout feature1
git rebase feature2

# Если конфликты — разрешаем и продолжаем
# (в данном случае конфликтов нет, файлы разные)

# Проверяем линейную историю
git log --oneline --graph --all

# Дополнительно: merge feature2 в feature1
git merge feature2
# (будет fast-forward, т.к. уже перебазировали)