Главная страница
Навигация по странице:

  • Переименование и перемещение файлов из репозитория

  • Просмотр журнала коммитов Команда git log выводит список всех коммитов:C:\Users\Al\wizcoin>git log

  • Восстановление старых изменений

  • Отмена несохраненных локальных изменений

  • Деиндексирование проиндексированного файла

  • Отмена последних коммитов

  • Возврат к конкретному коммиту для отдельного файла

  • Перезапись истории коммитов

  • GitHub и команда git push

  • Отправка существующего репозитория на GitHub

  • Чистыйкод дляпродолжающи х


    Скачать 7.85 Mb.
    НазваниеЧистыйкод дляпродолжающи х
    Дата13.05.2023
    Размер7.85 Mb.
    Формат файлаpdf
    Имя файлаPython_Chisty_kod_dlya_prodolzhayuschikh_2022_El_Sveygart.pdf
    ТипДокументы
    #1127485
    страница27 из 40
    1   ...   23   24   25   26   27   28   29   30   ...   40

    echo "Test file" > deleteme.txt
    C:\Users\Al\wizcoin>git add deleteme.txt
    C:\Users\Al\wizcoin>git commit -m "Adding a file to test Git deletion."
    [master 441556a] Adding a file to test Git deletion.
    1 file changed, 1 insertion(+)
    create mode 100644 deleteme.txt
    C:\Users\Al\wizcoin>git status
    On branch master nothing to commit, working tree clean

    Создание репозитория Git на вашем компьютере
    253
    Не удаляйте файлы командой del в Windows или командой rm в macOS и Linux.
    (А если вы это сделаете, файл можно восстановить командой git restore
    <имя_фай-
    ла> или просто перейти к команде git rm
    , чтобы удалить файл из репозитория.)
    Вместо этого воспользуйтесь командой git rm
    , чтобы удалить и проиндексировать файл deleteme.txt
    , как это делается в следующем примере:
    C:\Users\Al\wizcoin>git rm deleteme.txt
    rm deleteme.txt'
    Команда git rm удаляет файл из рабочей копии, но это еще не все. Как и git add
    , команда git rm индексирует файл. Удаление файла необходимо закрепить точно так же, как любые другие изменения:
    C:\Users\Al\wizcoin>git status
    On branch master
    Changes to be committed:
    (use "git reset HEAD ..." to unstage)

    deleted: deleteme.txt
    C:\Users\Al\wizcoin>git commit -m "Deleting deleteme.txt from the repo to
    finish the deletion test."
    [master 369de78] Deleting deleteme.txt from the repo to finish the deletion test.
    1 file changed, 1 deletion(-)
    delete mode 100644 deleteme.txt
    C:\Users\Al\Desktop\wizcoin>git status
    On branch master nothing to commit, working tree clean
    Хотя файл deleteme.txt был удален из рабочей копии, он все еще существует в исто- рии репозитория. В разделе «Восстановление старых изменений» этой главы рас- сказано, как восстановить удаленный файл или отменить изменение.
    Команда git rm работает только с файлами, находящимися в чистом, сохраненном, состоянии без каких-либо изменений. В противном случае Git предложит сохранить изменения или отменить их командой git reset
    HEAD
    <имя_файла>. (Вывод git status напомнит вам об этой команде

    .) Такая процедура предотвращает случайное удаление несохраненных изменений.
    Переименование и перемещение файлов из репозитория
    Как и при удалении файлов, вы не должны переименовывать или перемещать файлы в репозитории в обход Git. В противном случае Git решит, что вы просто удалили файл, и создаст новый файл с прежним содержимым. Вместо этого используйте команду git mv с последующей командой git commit

    254
    Глава 12.Git и организация программных проектов
    Переименуйте
    README.md в
    README.txt следующими командами:
    C:\Users\Al\wizcoin>git mv README.md README.txt
    C:\Users\Al\wizcoin>git status
    On branch master
    Changes to be committed:
    (use "git reset HEAD ..." to unstage)
    renamed: README.md -> README.txt
    C:\Users\Al\wizcoin>git commit -m "Testing the renaming of files in Git."
    [master 3fee6a6] Testing the renaming of files in Git.
    1 file changed, 0 insertions(+), 0 deletions(-)
    rename README.md => README.txt (100%)
    В этом случае история изменений
    README.txt также включает историю
    README.md
    Также можно воспользоваться командой git mv для перемещения файла в новую папку. Введите следующие команды, чтобы создать новую папку с именем movetest и переместить в нее файл
    README.txt
    :
    C:\Users\Al\wizcoin>mkdir movetest
    C:\Users\Al\wizcoin>git mv README.txt movetest/README.txt
    C:\Users\Al\wizcoin>git status
    On branch master
    Changes to be committed:
    (use "git reset HEAD ..." to unstage)
    renamed: README.txt -> movetest/README.txt
    C:\Users\Al\wizcoin>git commit -m "Testing the moving of files in Git."
    [master 3ed22ed] Testing the moving of files in Git.
    1 file changed, 0 insertions(+), 0 deletions(-)
    rename README.txt => movetest/README.txt (100%)
    Также можно совместить переименование файла с перемещением — для этого сле- дует передать git mv новое имя и местоположение файла. Вернем файл
    README.txt в корневой рабочий каталог с восстановлением исходного имени:
    C:\Users\Al\wizcoin>git mv movetest/README.txt README.md
    C:\Users\Al\wizcoin>git status
    On branch master
    Changes to be committed:
    (use "git reset HEAD ..." to unstage)
    renamed: movetest/README.txt -> README.md
    C:\Users\Al\wizcoin>git commit -m "Moving the README file back to its original
    place and name."
    [master 962a8ba] Moving the README file back to its original place and name.

    Просмотр журнала коммитов
    255 1 file changed, 0 insertions(+), 0 deletions(-)
    rename movetest/README.txt => README.md (100%)
    Хотя файл
    README.md вернулся в исходную папку и имеет исходное имя, репози- торий Git запоминает изменения имени и местоположения. Историю изменений можно вызвать командой git log
    , о которой пойдет речь в следующем разделе.
    Просмотр журнала коммитов
    Команда git log выводит список всех коммитов:
    C:\Users\Al\wizcoin>git log
    commit 962a8baa29e452c74d40075d92b00897b02668fb (HEAD -> master)
    Author: Al Sweigart
    Date: Wed Sep 1 10:38:23 2021 -0700
    Moving the README file back to its original place and name.
    commit 3ed22ed7ae26220bbd4c4f6bc52f4700dbb7c1f1
    Author: Al Sweigart
    Date: Wed Sep 1 10:36:29 2021 -0700
    Testing the moving of files in Git.
    --snip--
    Команда способна выводить большой объем текста. Если журнал не помещается в окне терминала, текст можно прокрутить клавишами
    ↑ и ↓. Чтобы завершить просмотр, нажмите клавишу q.
    Если вы хотите вернуть файлы к более раннему коммиту, сначала следует найти
    хеш коммита — строку из 40 шестнадцатеричных цифр (0–9 и буквы A–F), которая служит уникальным идентификатором коммита. Например, последний коммит в нашем репозитории представлен хешем
    962a8baa29e452c74d40075d92b00897b026 68fb
    . На практике обычно используются только первые семь знаков:
    962a8ba
    Со временем журнал может стать очень длинным. Ключ
    --oneline усекает вывод до сокращенных хешей и первой строки каждого сообщения коммита. Введите команду git log
    --oneline в командной строке:
    C:\Users\Al\wizcoin>git log --oneline
    962a8ba (HEAD -> master) Moving the README file back to its original place and name.
    3ed22ed Testing the moving of files in Git.
    15734e5 Deleting deleteme.txt from the repo to finish the deletion test.
    441556a Adding a file to test Git deletion.
    2a4c5b8 Added example code to README.md e1ae3a3 An initial add of the project files.

    256
    Глава 12.Git и организация программных проектов
    Если вывод остается слишком длинным, используйте ключ
    -n для ограничения вывода n последними коммитами. Введите команду git log
    --oneline
    -n
    3
    , чтобы просмотреть только три последних коммита:
    C:\Users\Al\wizcoin>git log --oneline -n 3
    962a8ba (HEAD -> master) Moving the README file back to its original place and name.
    3ed22ed Testing the moving of files in Git.
    15734e5 Deleting deleteme.txt from the repo to finish the deletion test.
    Чтобы вывести содержимое файла на момент конкретного коммита, можно за- дать команду git show
    <хеш>
    :
    <имя_файла>. Впрочем, графические средства Git предоставляют более удобный интерфейс для просмотра журнала, чем командная строка Git.
    Восстановление старых изменений
    Допустим, вы хотите вернуться к более ранней версии своего исходного кода, потому что в программе была допущена ошибка или вы случайно удалили файл.
    Система контроля версий позволяет вернуть рабочую копию к состоянию более раннего коммита. Конкретная команда зависит от состояния файлов в рабочей копии.
    Помните, что системы контроля версий только добавляют информацию. Даже при удалении файла из репозитория Git запомнит его, чтобы его можно было восстано- вить в будущем. Отмена изменения в действительности добавляет новое изменение, которое возвращает файл к его состоянию при предыдущем коммите. Подробная информация о различных видах отмены доступна на https://github.blog/2015-06-
    08-how-to-undo-almost-anything-with-git/.
    Отмена несохраненных локальных изменений
    Если вы внесли в файл несохраненные изменения, но хотите вернуть его к версии в последнем коммите, выполните команду git restore
    <имя_файла>. В следующем примере мы изменяем файл
    README.md
    , но не индексируем и не сохраняем его:
    C:\Users\Al\wizcoin>git status
    On branch master
    Changes not staged for commit:
    (use "git add ..." to update what will be committed)
    (use "git restore ..." to discard changes in working directory)
    modified: README.md no changes added to commit (use "git add" and/or "git commit -a")
    C:\Users\Al\wizcoin>git restore README.md

    Восстановление старых изменений
    257
    C:\Users\Al\wizcoin>git status
    On branch master
    Your branch is up to date with 'origin/master'.
    nothing to commit, working tree clean
    После выполнения команды git restore
    README.md содержимое файла
    README.md становится таким, как в последнем коммите. Фактически это операция отмены из- менений, внесенных в файл (который еще не был проиндексирован или сохранен).
    Но будьте внимательны: вы уже не сможете отменить эту «отмену», чтобы вернуть последние изменения. Также можно выполнить команду git checkout
    , чтобы от- менить все изменения во всех файлах рабочей копии.
    Деиндексирование проиндексированного файла
    Если вы проиндексировали измененный файл командой git add
    , а теперь хотите исключить его из индексированного состояния, чтобы он не был включен в следу- ющий коммит, выполните команду git restore
    --staged
    <имя_файла>:
    C:\Users\Al>git restore --staged README.md
    Unstaged changes after reset:
    M spam.txt
    Файл
    README.md остается измененным, как это было до его индексирования ко- мандой git add
    , но он не находится в индексированном состоянии.
    Отмена последних коммитов
    Допустим, вы сделали несколько бесполезных коммитов и теперь хотите вернуться к предыдущему коммиту. Чтобы отменить конкретное число последних коммитов
    (например, 3), используйте команду git revert
    -n
    HEAD

    3..HEAD
    . Вместо
    3
    можно указать любое количество коммитов. Предположим, вы отслеживаете изменения в детективном романе, который вы пишете, и у вас имеется следующий журнал Git со всеми коммитами и сообщениями:
    C:\Users\Al\novel>git log --oneline
    de24642 (HEAD -> master) Changed the setting to outer space.
    2be4163 Added a whacky sidekick.
    97c655e Renamed the detective to 'Snuggles'.
    8aa5222 Added an exciting plot twist.
    2590860 Finished chapter 1.
    2dece36 Started my novel.
    В какой-то момент вы решаете, что хотите начать заново с сюжетного поворота с хешем
    8aa5222
    . Это означает, что нужно отменить изменения трех последних коммитов: de24642
    ,
    2be4163
    и
    97c655e
    . Выполните команду git revert
    -n
    HEAD3..

    258
    Глава 12.Git и организация программных проектов
    HEAD
    , чтобы отменить эти изменения, а затем выполните команды git add и git commit
    -m
    "
    <сообщение>
    "
    для сохранения контента, как и для любого другого изменения:
    C:\Users\Al\novel>git revert -n HEAD3..HEAD
    C:\Users\Al\novel>git add .
    C:\Users\Al\novel>git commit -m "Starting over from the plot twist."
    [master faec20e] Starting over from the plot twist.
    1 file changed, 34 deletions(-)
    C:\Users\Al\novel>git log --oneline
    faec20e (HEAD -> master) Starting over from the plot twist.
    de24642 Changed the setting to outer space.
    2be4163 Added a whacky sidekick.
    97c655e Renamed the detective to 'Snuggles'.
    8aa5222 Added an exciting plot twist.
    2590860 Finished chapter 1.
    2dece36 Started my novel.
    Репозитории Git обычно только добавляют информацию, поэтому при отмене ком- митов они остаются в истории коммитов. Если потребуется «отменить отмену», вы можете снова вернуться к нужному состоянию командой git revert
    Возврат к конкретному коммиту для отдельного файла
    Так как коммиты отражают состояние всего репозитория, а не отдельных файлов, то вам потребуется другая команда, если вы захотите отменить изменения для от- дельного файла. Допустим, я веду репозиторий Git для небольшого программного проекта. Я создал файл eggs.py
    , добавил в него функции spam()
    и bacon()
    , а затем переименовал bacon()
    в cheese()
    . Журнал репозитория будет выглядеть примерно так:
    C:\Users\Al\myproject>git log --oneline
    895d220 (HEAD -> master) Adding email support to cheese().
    df617da Renaming bacon() to cheese().
    ef1e4bb Refactoring bacon().
    ac27c9e Adding bacon() function.
    009b7c0 Adding better documentation to spam().
    0657588 Creating spam() function.
    d811971 Initial add.
    Но я решил, что я хочу вернуться к файлу до добавления функции bacon()
    , но не изменять любые другие файлы в репозитории. Можно воспользоваться командой git show
    <хеш>
    :
    <имя_файла> для вывода этого файла на момент последнего конкретного коммита. Команда выглядит примерно так:

    Восстановление старых изменений
    259
    C:\Users\Al\myproject>git show 009b7c0:eggs.py
    <содержимое eggs.py на момент сохранения 009b7c0>
    При помощи команды git checkout
    <хеш>
    --
    <имя_файла> можно вернуть со- держимое eggs.py к этой версии и сохранить измененный файл обычным способом.
    Команда git checkout изменяет только рабочую копию. Вам останется только про- индексировать и сохранить эти коррективы, как и любые другие:
    C:\Users\Al\myproject>git checkout 009b7c0 -- eggs.py
    C:\Users\Al\myproject>git add eggs.py
    C:\Users\Al\myproject>git commit -m "Rolled back eggs.py to 009b7c0"
    [master d41e595] Rolled back eggs.py to 009b7c0 1 file changed, 47 deletions(-)
    C:\Users\Al\myproject>git log --oneline
    d41e595 (HEAD -> master) Rolled back eggs.py to 009b7c0 895d220 Adding email support to cheese().
    df617da Renaming bacon() to cheese().
    ef1e4bb Refactoring bacon().
    ac27c9e Adding bacon() function.
    009b7c0 Adding better documentation to spam().
    0657588 Creating spam() function.
    d811971 Initial add.
    Файл eggs.py был возвращен к прежнему состоянию, а оставшаяся часть репози- тория осталась неизменной.
    Перезапись истории коммитов
    Если вы случайно сохранили файл, содержащий конфиденциальную информа- цию (пароли, ключи API, номера кредитных карт), недостаточно вычеркнуть эту информацию и создать новый коммит. Каждый, кто имеет доступ к репозиторию на вашем компьютере или к удаленному репозиторию, сможет вернуться к версии, содержащей эту информацию.
    Удалить информацию из репозитория так, чтобы ее было невозможно вос- становить, непросто, но возможно. Подробно рассказывать об этом здесь я не буду, но вы можете воспользоваться либо командой git filter-branch or, либо программой BFG Repo-Cleaner (этот вариант считается предпочтительным).
    Оба варианта описаны на https://help.github.com/en/articles/removing-sensitive-
    data-from-a-repository.
    Простейшая превентивная мера — разместить конфиденциальную информацию в файле с именем secrets.txt
    , conidential.py или что-нибудь в этом роде. Файл включа- ется в
    .gitignore
    , чтобы он никогда не был сохранен в репозитории. Ваша программа

    260
    Глава 12.Git и организация программных проектов может прочитать конфиденциальную информацию из файла — это лучше, чем раз- мещать такую информацию непосредственно в исходном коде.
    GitHub и команда git push
    Хотя репозитории Git могут существовать на вашем компьютере, многие бесплат- ные веб-сайты позволяют размещать клоны ваших репозиториев в интернете, чтобы другие люди могли легко загрузить ваши проекты и участвовать в работе над ними.
    Самый большой из таких сайтов — GitHub. Если вы сохраните клон своего проекта в интернете, коллеги смогут дополнять ваш код, даже когда компьютер, на котором вы работаете, отключен. Кроме того, клонированная копия фактически выполняет роль резервной копии.
    ПРИМЕЧАНИЕ
    Чтобы избежать путаницы с терминами: Git — система контроля версий, которая под- держивает репозиторий и включает команду git. GitHub — веб-сайт для размещения репозиториев Git в интернете.
    Рис. 12.6. Создание нового репозитория на GitHub

    GitHub и команда git push
    261
    Зайдите на сайт https://github.com и зарегистрируйтесь для получения бесплатной учетной записи. На домашней странице GitHub или на вкладке
    Repositories страницы вашего профиля щелкните на кнопке
    New
    , чтобы создать новый проект. Введите имя репозитория wizcoin и описание проекта — об этом я рассказывал в разделе «Соз- дание новых проектов Python с использованием Cookiecutter» на с. 236 (рис. 12.6).
    Пометьте репозиторий как общедоступный (
    Public
    ) и снимите флажок
    Initialize this repository with a README
    , потому что мы импортируем существующий репозиторий.
    Щелкните на кнопке
    Create repository
    . Все эти действия эквивалентны выполнению команды git init на веб-сайте GitHub.
    Веб-страница для ваших репозиториев будет располагаться по адресу https://github.
    com/<имя_пользователя>/<имя_репозитория>. Мой репозиторий wizcoin раз- мещается на https://github.com/asweigart/wizcoin.
    Отправка существующего репозитория на GitHub
    Чтобы отправить существующий репозиторий из командной строки, введите сле- дующие команды:
    C:\Users\Al\wizcoin>git remote add origin https://github.com/<пользователь_github>/
    wizcoin.git
    C:\Users\Al\wizcoin>git push -u origin master
    Username for 'https://github.com': <пользователь_github>
    Password for 'https://@github.com': <пароль_github>
    Counting objects: 3, done.
    Writing objects: 100% (3/3), 213 bytes | 106.00 KiB/s, done.
    Total 3 (delta 0), reused 0 (delta 0)
    To https://github.com/<ваш_github>/wizcoin.git
    * [new branch] master -> master
    Branch 'master' set up to track remote branch 'master' from 'origin'.
    Команда git remote add origin https://github.com/
    <пользователь_github>
    /
    wizcoin.git добавляет GitHub как удаленный репозиторий, соответствующий ва- шему локальному репозиторию. После этого вы можете отправить все изменения, внесенные в локальном репозитории, в удаленный командой git push
    -u origin master
    . Следующие отправки из локального репозитория вы сможете осуществлять простой командой git push
    . Отправка копий на GitHub после каждого коммита — хорошая тактика, гарантирующая синхронизацию удаленного репозитория на
    GitHub с вашим локальным репозиторием, но она не обязательна.
    Загрузив веб-страницу репозитория на GitHub, вы должны получить информацию о файлах и коммитах. Конечно, это далеко не все, что можно узнать о GitHub — включая и то, как принимать действия других людей в ваших репозиториях посред- ством pull-запросов. Эта тема, наряду с другими расширенными возможностями
    GitHub, выходит за рамки книги.

    262
    Глава 12.Git и организация программных проектов
    1   ...   23   24   25   26   27   28   29   30   ...   40


    написать администратору сайта