Мэтиз. Изучаем Python. Crash course2 n d e d i t i o na h a n d s o n, p r o j e c t b a s e d i n t r o d u c t i o n t o p r o g r a m m i n g
Скачать 6.2 Mb.
|
git log --pretty=oneline ee76419954379819f3f2cacafd15103ea900ecb2 (HEAD -> master) Started project. git_practice$ Флаг --pretty=oneline выводит два важнейших атрибута: идентификатор закре- пления и сохраненное для этого закрепления сообщение. Второе закрепление Чтобы увидеть всю мощь системы контроля версий, следует внести в проект из- менение и закрепить его. Добавим еще одну строку в hello_git .py : hello_git.py print("Hello Git world!") print("Hello everyone.") Проверяя статус проекта, мы видим, что изменение в файле было замечено Git: git_practice$ git status ❶ On branch master Changes not staged for commit: (use "git add (use "git checkout -- Отмена изменений 507 ❷ modified: hello_git.py ❸ no changes added to commit (use "git add" and/or "git commit -a") git_practice$ В результатах указывается текущая ветвь , имя измененного файла , а также то, что изменения не были закреплены . Закрепим изменения и снова проверим статус: ❶ git_practice$ git commit -am "Extended greeting." [master 51f0fe5] Extended greeting. 1 file changed, 1 insertion(+), 1 deletion(-) ❷ git_practice$ git status On branch master nothing to commit, working tree clean ❸ git_practice$ git log --pretty=oneline 51f0fe5884e045b91c12c5449fabf4ad0eef8e5d (HEAD -> master) Extended greeting. ee76419954379819f3f2cacafd15103ea900ecb2 Started project. git_practice$ Команда git commit с флагом -am выполняет новое закрепление . Флаг -a прика- зывает Git добавить все измененные файлы в репозитории в текущее закрепление. (Если вы создали новые файлы между закреплениями, просто снова выполните команду git add , чтобы включить новые файлы в репозиторий.) Флаг -m при- казывает Git сохранить сообщение в журнале. При проверке статуса проекта рабочий каталог снова оказывается чистым . На- конец, в журнале хранится информация о двух закреплениях . Отмена изменений А теперь посмотрим, как отменить изменение и вернуться к предыдущему работо- способному состоянию. Сначала добавьте в файл hello_git .py новую строку: hello_git.py print("Hello Git world!") print("Hello everyone.") print("Oh no, I broke the project!") Сохраните и запустите этот файл. Из информации статуса видно, что Git видит изменения: git_practice$ git status On branch master Changes not staged for commit: (use "git add (use "git checkout -- 508 Приложение Г • Git и контроль версий ❶ modified: hello_git.py no changes added to commit (use "git add" and/or "git commit -a") git_practice$ Git понимает, что файл hello_git .py был изменен , и при желании мы можем за- крепить изменения. Но на этот раз вместо закрепления мы хотим вернуться к по- следней операции закрепления, в которой проект был заведомо работоспособным. С hello_git .py ничего делать не нужно — ни удалять строку, ни использовать функ- цию отмены в текстовом редакторе. Вместо этого введите следующие команды в терминальном сеансе: git_practice$ git checkout . git_practice$ git status On branch master nothing to commit, working tree clean git_practice$ Команда git checkout позволяет работать с любым предшествующим закрепле- нием. Команда git checkout отменяет все изменения, внесенные с момента последнего закрепления, и восстанавливает проект в последнем закрепленном состоянии. Вернувшись в текстовый редактор, вы увидите, что файл hello_git .py вернулся к следующему состоянию: print("Hello Git world!") print("Hello everyone.") И хотя в таком простом проекте возврат к предыдущему состоянию может по- казаться тривиальным, если бы мы работали над большим проектом с десятками измененных файлов, все файлы, измененные с момента последнего закрепления, вернулись бы к предыдущему состоянию. Эта возможность невероятно полезна: можете вносить любые изменения в ходе реализации новой функции, а если они не сработают, вы просто отменяете их без вреда для проекта. Не нужно запоминать эти изменения и отменять их вручную; Git делает все это за вас. ПРИМЕЧАНИЕ Возможно, вам придется обновить файл в редакторе, чтобы увидеть предыдущую версию . Извлечение предыдущих закреплений Git позволяет извлечь из журнала любое закрепление, не только последнее. Для этого в команде вместо точки указываются первые 6 символов идентификатора. Выполняя извлечение, вы можете просмотреть более раннее закрепление и либо вернуться к своему последнему закреплению, либо отказаться от всей последней работы и продолжить разработку с более раннего закрепления: Извлечение предыдущих закреплений 509 git_practice$ git log --pretty=oneline 51f0fe5884e045b91c12c5449fabf4ad0eef8e5d (HEAD -> master) Extended greeting. ee76419954379819f3f2cacafd15103ea900ecb2 Started project. git_practice$ git checkout ee7641 Note: checking out 'ee7641'. ❶ You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b HEAD is now at ee7641... Started project. git_practice$ При извлечении предыдущего закрепления вы покидаете ветвь master и входите в состояние, которое Git называет отсоединенным состоянием HEAD . HEAD — текущее состояние проекта; «отсоединенным» оно называется потому, что мы по- кинули именованную ветвь ( master в данном случае). Чтобы вернуться к ветви master , извлеките ее: git_practice$ git checkout master Previous HEAD position was ee76419 Started project. Switched to branch 'master' git_practice$ Вы снова возвращаетесь к ветви master . Если только вы не собираетесь исполь- зовать расширенные возможности Git, лучше не вносить изменения в проект при извлечении старого закрепления. Но если над проектом больше никто не работает и вы хотите отбросить все более поздние закрепления и вернуться к предыдущему состоянию, можете вернуть проект к предыдущему закреплению. Работая в ветви master , введите следующую команду: ❶ git_practice$ git status On branch master nothing to commit, working directory clean ❷ git_practice$ git log --pretty=oneline 51f0fe5884e045b91c12c5449fabf4ad0eef8e5d (HEAD -> master) Extended greeting. ee76419954379819f3f2cacafd15103ea900ecb2 Started project. ❸ git_practice$ git reset --hard ee76419 HEAD is now at ee76419 Started project. ❹ git_practice$ git status On branch master nothing to commit, working directory clean ❺ git_practice$ git log --pretty=oneline ee76419954379819f3f2cacafd15103ea900ecb2 (HEAD -> master) Started project. git_practice$ 510 Приложение Г • Git и контроль версий Сначала мы проверяем статус и убеждаемся в том, что текущей является ветвь master . В журнале присутствуют оба закрепления . Затем выдается команда git reset --hard с первыми шестью символами идентификатора того закрепления, к которому нужно вернуться . Далее повторная проверка статуса показывает, что мы находимся в главной ветви, а закреплять нечего . Повторное обращение к журналу показывает, что проект находится в том состоянии, к которому мы ре- шили вернуться . Удаление репозитория Случается, что история репозитория нарушается и вы не знаете, как ее восстано- вить. Если это произойдет, для начала обратитесь за помощью к методам, описан- ным в приложении В. Если исправить ошибку не удалось, а вы работаете над про- ектом в одиночку, продолжайте работать с файлами, но сотрите историю проекта, удалив каталог .git . Это не повлияет на текущее состояние файлов, но приведет к удалению всех закреплений, так что вы потеряете возможность извлекать другие состояния проекта. Для этого либо откройте программу для работы с файлами и удалите репозиторий .git , либо сделайте это в командной строке. После этого необходимо создать новый репозиторий, чтобы снова отслеживать изменения в проекте. Вот как выглядит весь процесс в терминальном сеансе: ❶ git_practice$ git status On branch master nothing to commit, working directory clean ❷ git_practice$ rm -rf .git ❸ git_practice$ git status fatal: Not a git repository (or any of the parent directories): .git ❹ git_practice$ git init Initialized empty Git repository in git_practice/.git/ ❺ git_practice$ git status On branch master No commits yet Untracked files: (use "git add .gitignore hello_git.py nothing added to commit but untracked files present (use "git add" to track) ❻ git_practice$ git add . git_practice$ git commit -m "Starting over." [master (root-commit) 6baf231] Starting over. 2 files changed, 4 insertions(+) create mode 100644 .gitignore create mode 100644 hello_git.py ❼ git_practice$ git status Удаление репозитория 511 On branch master nothing to commit, working tree clean git_practice$ Сначала мы проверяем статус и видим, что рабочий каталог чист . Затем команда rm -rf .git ( rmdir /s .git в Windows) удаляет каталог .git . При проверке статуса после удаления каталога .git выдается сообщение об отсутствии репозитория Git . Вся информация, используемая Git для отслеживания репозитория, хранится в каталоге .git , поэтому его удаление приводит к уничтожению всего репозитория. Тогда мы можем использовать команду git init для создания нового репозито- рия . Проверка статуса показывает, что все вернулось к исходному состоянию, ожидая первого закрепления . Мы добавляем файлы и выполняем первое за- крепление . Теперь проверка статуса показывает, что проект находится в новой ветви master , а закреплять пока нечего . Работа с системой контроля версий потребует некоторых усилий, но стоит немного освоиться, и вам уже не захочется работать без нее. Эрик Мэтиз Изучаем Python: программирование игр, визуализация данных, веб-приложения 3-е издание Перевел с английского Е. Матвеев Заведующая редакцией Ю. Сергиенко Ведущий редактор К. Тульцева Художественный редактор В. Мостипан Литературный редактор М. Рогожин Корректоры С. Беляева, Н. Викторова Верстка Л. Егорова Изготовлено в России. Изготовитель: ООО «Прогресс книга». Место нахождения и фактический адрес: 194044, Россия, г. Санкт-Петербург, Б. Сампсониевский пр., д. 29А, пом. 52. Тел.: +78127037373. Дата изготовления: 12.2019. Наименование: книжная продукция. Срок годности: не ограничен. Налоговая льгота — общероссийский классификатор продукции ОК 034-2014, 58.11.12.000 — Книги печатные профессиональные, технические и научные. Импортер в Беларусь: ООО «ПИТЕР М», 220020, РБ, г. Минск, ул. Тимирязева, д. 121/3, к. 214, тел./факс: 208 80 01. Подписано в печать 12.12.19. Формат 70×100/16. Бумага офсетная. Усл. п. л. 41,280. Тираж 2000. Заказ 0000. |