diff --git a/git.ipynb b/git.ipynb new file mode 100644 index 0000000..d8169b8 --- /dev/null +++ b/git.ipynb @@ -0,0 +1,398 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"Git и организация программных проектов.\"\"\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Системы контроля версий представляют собой программные средства, которые регистрируют все изменения в исходном коде и позволяют легко восстановить старые версии.\n", + "\n", + "СКВ управляет файлами при внесении в них изменений.\n", + "\n", + "Git, Mercurial и Subversion — популярные приложения контроля версий, хотя система Git остается самой популярной." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Коммиты и репозитории\n", + "\n", + "Git позволяет сохранить состояние файлов проекта при внесении в них изменений. Такие сохранения называются снимками (snapshots) или коммитами (commits). Благодаря этому вы сможете, если потребуется, вернуться к любой предшеству-\n", + "ющей версии.\n", + "\n", + "Система контроля версий управляет исходным кодом проекта, который хранится в специальной папке — репозитории (repo). Как правило, для каждого проекта, над которым вы работаете, следует создать отдельный репозиторий Git." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Создание новых проектов Python с использованием Cookiecutter\n", + "\n", + "В терминологии Git папка, содержащая весь исходный код, документацию, тесты и другие файлы, относящиеся к проекту, называется рабочим каталогом или рабо-\n", + "чим деревом, а в более общей терминологии — папкой проекта. Файлы в рабочем каталоге в совокупности называются рабочей копией. Прежде чем создавать репо-\n", + "зиторий Git, следует создать файлы для проекта Python.\n", + "\n", + "Как правило, корневая папка проекта содержит папку src для файлов с исходным кодом .py, папку tests\n", + "для модульных тестов и папку docs для документации (например, сгенерирован-\n", + "ной системой документирования Sphinx). Другие файлы содержат информацию о проекте и конфигурации системы: README.md для общей информации, .coveragerc\n", + "для конфигурации покрытия кода, LICENSE.txt для текста программной лицензии.\n", + "\n", + "Чтобы ускорить выполнение рутинных операций, можно использовать модуль Python cookiecutter для автоматического создания этих файлов и папок.\n", + "\n", + "Чтобы установить Cookiecutter, выполните команду pip install --user cookiecutter" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Настройка имени пользователя и адреса электронной почты\n", + "\n", + "После установки Git необходимо задать ваше имя и адрес электронной почты, чтобы в ваши коммиты включалась информация об авторе. В терминале выполните следу-\n", + "ющие команды git config, используя собственное имя и адрес электронной почты:\n", + "C:\\Users\\Al>git config --global user.name \"Al Sweigart\"\n", + "C:\\Users\\Al>git config --global user.email al@inventwithpython.com\n", + "Эта информация хранится в файле .gitconfig в вашей домашней папке" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Работа с Git\n", + "\n", + "Работа с репозиторием Git состоит из нескольких этапов:\n", + "1. Сначала вы создаете репозиторий Git командой git init или git clone. \n", + "2. Затем файлы добавляются в репозиторий для отслеживания командой git add <имя_файла>. Все файлы добавляются git add .\n", + "3. Наконец, после добавления файлов они сохраняются командой git commit -am \"<сообщение, опи-\n", + "сывающее содержание коммита>\" (часто называют просто «сообщение коммита»). Теперь все готово для внесения изменений в код." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Как Git отслеживает статус файлов\n", + "\n", + "Все файлы в рабочем каталоге либо отслеживаются, либо не отслеживаются Git. Отслеживаемые файлы были добавлены и сохранены в репозитории, все остальные файлы не отслеживаются. Для репозитория Git неотслеживаемые файлы в рабо-\n", + "чей копии не существуют. С другой стороны, отслеживаемые файлы существуют в одном из трех состояний.\n", + "\n", + "1. В сохраненном (закрепленном) состоянии файл в рабочей копии идентичен последнему коммиту в репозитории. (Иногда это состояние называется не-\n", + "измененным, или чистым.)\n", + "2. В измененном состоянии файл в рабочей копии отличается от последнего коммита в репозитории.\n", + "3. В индексированном, или подготовленном (staged), состоянии файл был из-\n", + "менен и помечен для включения в следующий коммит. Также говорят, что файл находится в индексной области (или кэше).\n", + "\n", + "Переходы между состояниями\n", + "\n", + "1. Неотслеживаемый → Индексированный:\n", + "\n", + "Используется git add <файл>\n", + "2. Сохраненный → Измененный:\n", + "\n", + "Происходит автоматически при изменении файла\n", + "Не требует команд Git\n", + "3. Измененный → Индексированный:\n", + "\n", + "Используется git add <файл>\n", + "4. Индексированный → Сохраненный:\n", + "\n", + "Используется git commit\n", + "\n", + "На любом этапе после создания репозитория выполните команду git status для просмотра текущего статуса репозитория и состояния его файлов." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Проверка статуса\n", + "Команда git status\n", + "\n", + "!!!Команду git status рекомендуется использовать часто\n", + "\n", + "Git подсказывает команды для изменения состояния файлов\n", + "\n", + "Файл может находиться только в одном состоянии" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Для чего нужно индексирование?\n", + "\n", + "С технической точки зрения область индексирования содержит не столько файлы, сколько описания изменений, потому что одни части измененного файла могут быть индексированы, а другие — нет.\n", + "\n", + "Используя команду git commit -am command для индексирования и закрепления измененных файлов на одном шаге, чтобы обойти сложности. В этом случае файлы переходят из измененного состояния сразу же в чистое. Кроме того, использование графических средств Git вместо командной строки поможет избежать этих нетриви-\n", + "альных случаев." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Создание репозитория Git на вашем компьютере\n", + "\n", + "1. Особые случаи:\n", + "\n", + "Файл может быть одновременно в измененном и индексированном состоянии\n", + "Разные части файла могут иметь разные состояния\n", + "Технически индексируются не файлы, а описания изменений\n", + "2. Проблемы для новичков:\n", + "\n", + "Вызывает недоумение\n", + "Создает путаницу\n", + "Усложняет понимание Git\n", + "Часто описывается неточно в документации\n", + "3. Как упростить работу\n", + "Использовать команду git commit -am:\n", + "\n", + "Объединяет индексирование и коммит\n", + "Файлы переходят сразу из измененного в чистое состояние\n", + "Упрощает процесс сохранения\n", + "4. Рекомендации по работе:\n", + "\n", + "Сразу сохранять файлы после добавления\n", + "Немедленно коммитить после переименования\n", + "Не откладывать коммиты после удаления файлов\n", + "5. Альтернативные решения:\n", + "\n", + "Использовать графические интерфейсы Git\n", + "Избегать сложных случаев\n", + "Придерживаться простых сценариев использования" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Добавление файлов для отслеживания\n", + "\n", + "1. Проверка статуса файлов:\n", + "\n", + "Команда git status показывает состояние файлов\n", + "Неотслеживаемые файлы помечены как \"Untracked files\"\n", + "Git не может сохранять неотслеживаемые файлы\n", + "Нужно сначала добавить их для отслеживания\n", + "2. Процесс добавления файлов:\n", + "\n", + "Сначала git add (индексирование файлов)\n", + "Затем git commit (создание коммита)\n", + "После этого Git начинает отслеживать файлы\n", + "3. Способы использования git add:\n", + "\n", + "git add file.txt - добавить один файл\n", + "git add *.py - добавить все Python файлы\n", + "git add . - добавить все файлы в текущей папке\n", + "4. Создание коммита:\n", + "\n", + "git commit -m \"Сообщение коммита\" - сохраняет индексированные файлы\n", + "В сообщении описываем, какие изменения внесли\n", + "После коммита файлы становятся отслеживаемыми\n", + "5. Важные замечания:\n", + "\n", + "Файлы из .gitignore автоматически пропускаются\n", + "Можно добавлять файлы группами\n", + "Каждый коммит требует сообщения\n", + "После успешного коммита рабочая директория \"чистая\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Игнорирование файлов в репозитории\n", + "\n", + "Файлы, не отслеживаемые Git, отображаются как неотслеживаемые при выпол-\n", + "нении команды git status. Однако в процессе написания кода некоторые файлы можно исключить из системы контроля версий, чтобы предотвратить их случайное отслеживание. К этой категории относятся:\n", + "1. временные файлы в папке проекта;\n", + "файлы .pyc, .pyo и .pyd, генерируемые интерпретатором Python при выпол-\n", + "нении программ .py;\n", + "2. папки .tox, htmlcov и другие папки, генерируемые различными средствами разработчика;\n", + "3. другие откомпилированные или сгенерированные файлы, которые можно сгенерировать заново (потому что репозиторий предназначен для исход-\n", + "ных файлов, а не для производных файлов, которые генерируются на их основе);\n", + "4. файлы с исходным кодом, содержащие пароли баз данных, маркеры аутентификации, номера кредитных карт или другие конфиденциальные данные.\n", + "\n", + "Чтобы предотвратить включение этих файлов, создайте текстовый файл с именем .gitignore и перечислите в нем файлы и папки, которые не должны отслеживаться Git. Git автоматически исключает их из команд git add или git commit, и они не будут отображаться при выполнении команды git status.\n", + "\n", + "5. Cинтаксис .gitignore:\n", + "\n", + "Комментарий\n", + "1__pycache__/ # Игнорировать папку\n", + "*.py[cod] # Игнорировать файлы по маске\n", + "*$py.class # Конкретный шаблон\n", + "\n", + "6. Важные моменты:\n", + "\n", + "Сам файл .gitignore нужно добавить в репозиторий\n", + "Используйте * для шаблонов файлов\n", + "Используйте # для комментариев\n", + "Проверить игнорируемые файлы: git ls-files --other --ignored --exclude-standard" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Сохранение изменений\n", + "\n", + "После добавления новых файлов в репозиторий вы можете продолжить писать код для вашего проекта. Когда потребуется создать очередной коммит, выполните команду git add . для индексирования всех измененных файлов и команду git\n", + "commit -m <сообщение> для сохранения всех индексированных файлов. Впрочем, это проще делается одной командой git commit -am <сообщение>\n", + "\n", + "Если вы хотите сохранить только некоторые (но не все) измененные файлы, не добавляйте ключ -a в -am и перечислите файлы после сообщения — например, git\n", + "commit -m <сообщение> file1.py file2.py.\n", + "\n", + "Если вы забудете добавить аргумент командной строки -m \"<сообщение>\", Git от-\n", + "кроет текстовый редактор Vim в окне терминала. Нажмите клавишу Esc и введите qa!, чтобы безопасно завершить Vim и отменить коммит. Затем снова введите команду git commit, на этот раз с ар-\n", + "гументом командной строки -m \"<сообщение>\"." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Просмотр изменений перед коммитом\n", + "\n", + "Прежде чем сохранять код, следует быстро просмотреть изменения, которые будут сохранены при выполнении команды git commit. Для просмотра различий между рабочей копией кода и последним сохраненным кодом можно воспользоваться командой git diff command.\n", + "\n", + "Прежде чем добавить и сохранить файл README.md, выполните команду git diff\n", + "для просмотра внесенных изменений.\n", + "\n", + "Результат показывает, что файл README.md в рабочей копии изменился по сравне-\n", + "нию с файлом README.md, существовавшим при последнем сохранении репозито-\n", + "рия. Строки, начинающиеся со знака -, были удалены; строки, начинающиеся со знака +, были добавлены.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Частота сохранения изменений\n", + "\n", + "Код следует сохранять при завершении блока функциональности, класса или ис-\n", + "правления ошибки. Не сохраняйте код, содержащий синтаксические ошибки или очевидно неработоспособный. Коммиты могут состоять из нескольких строк или нескольких сотен строк измененного кода, но в любом случае вы должны иметь возможность вернуться к более ранней копии и все еще иметь в распоряжении рабочую программу." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Удаление файлов из репозитория\n", + "\n", + "Если вам не нужно, чтобы какой-либо файл отслеживался в Git, вы не можете просто удалить его из файловой системы. Это необходимо сделать через Git командой git rm, которая также приказывает Git перестать отслеживать файл.\n", + "\n", + "Команда git rm работает только с файлами, находящимися в чистом, сохраненном, состоянии без каких-либо изменений. В противном случае Git предложит сохранить изменения или отменить их командой git reset HEAD <имя_файла>." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Переименование и перемещение файлов из репозитория\n", + "\n", + "Как и при удалении файлов, вы не должны переименовывать или перемещать файлы в репозитории в обход Git. В противном случае Git решит, что вы просто удалили файл, и создаст новый файл с прежним содержимым. Вместо этого используйте команду git mv с последующей командой git commit." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Просмотр журнала коммитов\n", + "\n", + "Команда git log выводит список всех коммитов\n", + "\n", + "Команда способна выводить большой объем текста. Если журнал не помещается в окне терминала, текст можно прокрутить клавишами ↑ и ↓. Чтобы завершить просмотр, нажмите клавишу q.\n", + "Если вы хотите вернуть файлы к более раннему коммиту, сначала следует найти хеш коммита — строку из 40 шестнадцатеричных цифр (0–9 и буквы A–F), которая служит уникальным идентификатором коммита.\n", + "\n", + "Со временем журнал может стать очень длинным. Ключ --oneline усекает вывод до сокращенных хешей и первой строки каждого сообщения коммита. Введите команду git log --oneline в командной строке." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Отмена несохраненных локальных изменений\n", + "\n", + "Если вы внесли в файл несохраненные изменения, но хотите вернуть его к версии в последнем коммите, выполните команду git restore <имя_файла>.\n", + "\n", + "Если вы проиндексировали измененный файл командой git add, а теперь хотите исключить его из индексированного состояния, чтобы он не был включен в следу-\n", + "ющий коммит, выполните команду git restore --staged <имя_файла>.\n", + "\n", + "Допустим, вы сделали несколько бесполезных коммитов и теперь хотите вернуться к предыдущему коммиту. Чтобы отменить конкретное число последних коммитов (например, 3), используйте команду git revert -n HEAD~3..HEAD. Вместо 3 можно указать любое количество коммитов.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Перезапись истории коммитов\n", + "\n", + "Если вы случайно сохранили файл, содержащий конфиденциальную информа-\n", + "цию (пароли, ключи API, номера кредитных карт), недостаточно вычеркнуть эту информацию и создать новый коммит. Каждый, кто имеет доступ к репозиторию на вашем компьютере или к удаленному репозиторию, сможет вернуться к версии, содержащей эту информацию.\n", + "Удалить информацию из репозитория так, чтобы ее было невозможно вос-\n", + "становить, непросто, но возможно. Вы можете воспользоваться либо командой git filter-branchor, либо программой BFG Repo-Cleaner" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "GitHub и команда git push\n", + "\n", + "Хотя репозитории Git могут существовать на вашем компьютере, многие бесплат-\n", + "ные веб-сайты позволяют размещать клоны ваших репозиториев в интернете, чтобы другие люди могли легко загрузить ваши проекты и участвовать в работе над ними. Самый большой из таких сайтов — GitHub. Если вы сохраните клон своего проекта в интернете, коллеги смогут дополнять ваш код, даже когда компьютер, на котором вы работаете, отключен. Кроме того, клонированная копия фактически выполняет роль резервной копии.\n", + "\n", + "Команда git remote add origin https://github.com/<пользователь_github>/\n", + "wizcoin.git добавляет GitHub как удаленный репозиторий, соответствующий вашему локальному репозиторию. После этого вы можете отправить все изменения, внесенные в локальном репозитории, в удаленный командой git push -u origin\n", + "master. Следующие отправки из локального репозитория вы сможете осуществлять простой командой git push. Отправка копий на GitHub после каждого коммита —\n", + "хорошая тактика, гарантирующая синхронизацию удаленного репозитория на GitHub с вашим локальным репозиторием, но она не обязательна." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Итоги\n", + "\n", + "Системы контроля версий спасают программистов от многих бед. Сохранение кода упрощает анализ хода работы над проектом и в некоторых случаях позволяет отменять нежелательные изменения. Изучение основ работы с системой контро-\n", + "ля версий — такой как Git — безусловно, сэкономит ваше время в долгосрочной перспективе.\n", + "\n", + "Проекты Python обычно состоят из нескольких стандартных файлов и папок, и модуль cookiecutter помогает создать заготовки кода для многих таких фай-\n", + "лов. Они станут первыми из сохраненных в вашем локальном репозитории Git. Папка, содержащая весь этот контент, называется рабочим каталогом или папкой проекта.\n", + "\n", + "Git отслеживает файлы в рабочем каталоге. Каждый файл может существовать в одном из трех состояний: сохраненном (или чистом), измененном или индекси-\n", + "рованном. \n", + "\n", + "Командная строка Git поддерживает ряд команд (например, git status\n", + "или git log) для просмотра этой информации, но вы также можете воспользоваться сторонними средствами с графическим интерфейсом.\n", + "\n", + "Команда git init создает новый пустой репозиторий на вашем локальном компью-\n", + "тере. \n", + "\n", + "Команда git clone копирует репозиторий с удаленного сервера (например, с популярного веб-сайта GitHub). \n", + "\n", + "После создания репозитория вы можете восполь-\n", + "зоваться командами git add и git commit для сохранения изменений в репозитории и командой git push для отправки коммитов в удаленный репозиторий GitHub. В этой главе я рассказал и о командах для отмены внесенных изменений. Отмена позволяет вернуться к более ранней версии ваших файлов." + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}