Използване на Git за реализирани с Qt проекти
Страницата е създадена на:23 декември 2019 и редактирана на: 5 юли 2024
Интернет връзки: Git(колекция връзки).
Съдържание
Git е система за контрол на версиите, чието начало е положено от Линус Торвалдс, авторът на ядрото на Linux. Тази система предлага по-голяма гъвкавост и се предпочита от много програмисти на свободен софтуер. За повече информация, посетете сайта: https://git-scm.com
Команден Git клиент за Windows се изтегля от:
https://git-scm.com/download/win.
След инсталирането му, в изскачащото меню, което се показва при щракване с десния бутон на мишката в прозореца на Windows Explorer ще видите командите: Git GUI Here и Git Bash Here. Щракването върху Git Bash Here отваря специален терминален прозорец, в който можете да подавате командите за Git, както и други команди за работа с файлове.
Съществуват и Git клиенти с графичен нтерфейс, като например: SourceTree (https://www.sourcetreeapp.com), с версии за Windows и Mac, но тук ще опишем работа с команден клиент.
В macOS командният Git клиент е част от Xcode, така че щом инсталирате Xcode ще имате и Git. Git използва Command Line Tools for Xcode (около 3,39 GB), ето защо и този пакет слева да е наличен. Може да се инсталира с команда: xcode-select --install, или чрез изтегляне на инсталиращ пакет от developer.apple.com/download (страницата е достъпна след влизане с профил от Apple).
В Ubuntu, ако в терминал подадете команда git, ако същия не е инсталиран, ще видите съобщение:
The program 'git' is currently not installed. You can install it by typing:
sudo apt install git
така че, изпълнете последната команда и ще разполагате с git.
Основни действия
Първоначално изтегляне на файлове
За първоначално изтегляне на файлове от хранилище с цел създаване на локално копие се подава команда:
git clone адресНаХранилище имеНаДиректория
Адресът на хранилището трябва да вземете от описанието на съответния проект. Например, ако в Github.com
отворите хранилището на някой проект, неговия адрес може да копирате в Clopbord с щракване върху бутона "Clone or download" – "Copy to clipboard":
В някои хранилища, например, в sourceforge.net
адресът на хранилището може да е различен в зависимост от правото за достъп. За достъп само за четене, един адрес може да изглежда така:
https://git.code.sf.net/p/имеНаПроект/git
но за достъп за четене и запис, същото хранилище е с адрес:
ssh://потребител@git.code.sf.net/p/имеНаПроект/git
Командата git clone
създава в текущата директория, нова директория с посоченото в командата имеНаДиректория
и изтегля в тази директория файловете от хранилището. Ако в командата git clone
не се напише имеНаДиректория
, то се създава директория с име, съвпадащо с името на проекта.
За изтегляне само на последната актуализация, без цялостната история на промените:
git clone --depth=1 адресНаХранилище
В някои хранилища се използват хранилища подмодули (submodules, вижте https://git-scm.com/docs/gitsubmodules). Това са съществуващи отделно, като самостоятилни хранилища, модули. При наличие на такива, за сваляне в локалната директория и на кода от хранилищата подмодули, се подава команда:
git submodule update --init --recursive
Опресняване на локално копие с промените от отдалечено хранилище
Ако след време, когато в отдалеченото хранилище са настъпили промени, за ново изтегляне и отразяване на тези промени в локалното копие, трябва да се намирате в директорията с локалното хранилище и да подадете команда:
git pull
Ако междувременно вие сте правели някакви промени в съхраняваните локално файлове, свалянето на промените от отдалеченото хранилище с тази команда комбинира, ако е възможно, и вашите промени, и тези от отдалеченото хранилище. Командата git pull, всъщност извършва две неща, които бихте могли да извършите и с последователност от две други команди:
git fetch
git merge
Първата от тези команди само сваля промени от отдалеченото хранилище, а втората извършва сливане на тези промени с вашите файлове от локалното хранилище.
Отразяване на направени промени в локалното хранилище
Кои файлове са претърпели промени в локалното хранилище се показва с команда:
git status
За отразяване на направени промени в локалното хранилище, се използват командите:
git add .
git commit -m "Коментар върху направените промени"
Качване на промените от локалното хранилище в отдалеченото
За качване на промените от локалното хранилище в отдалеченото:
git push
При изпълнение на последната команда, може да Ви бъде поискано потребителско име и парола или само парола за достъп до отдалеченото хранилище.
Игнориране на файлове
.gitignore
В процеса на работа по даден проект в директориите на проекта може да се наложи да стоят файлове, които нямат значение при пренасяне на проекта върху друга машина. Това може да бъдат автоматично генерирани от инструментите за разработка файлове, файлове необходими само върху дадената машина, или файлове, ползвани от потребителя, но нямащи нищо общо с дадения проект. Git използва текстов файл с име .gitignore
, който се намира в главната директория на хранилището. Всеки ред от .gitignore
представлява шаблон за имена на файлове, които се игнорират от Git.
Добавянето на шаблон в .gitignore
трябва да се направи преди подаване на команда git add
. Така посочените в .gitignore
файлове не се добавят в локалното хранилище и техните промени не се следят повече от Git.
В случай, че в добавен в Git файл е направена промяна, която е необходима само в локалното му копие, но не трябва да се отразява от Git и да се качва в отдалечено хранилище (например, във файла е попълнена парола за достъп за конкретната машина, но тази парола не трябва да се вижда другаде), игнорирането на промените се извършва с команда:
git update-index --assume-unchanged имеНаФайл
Файл .gitignore
се контролира от Git и се качва и в отдалеченото хранилище.
.git/info/exclude
Друг начин за игнориране е чрез вписване на шаблони за игнориране във файл: .git/info/exclude
. Вписаните там правила не се отразяват в отдалеченото хранилище. Така могат да се игнорират файлове, които е малко вероятно да се появят в друго локално копие.
Ако даденото хранилище съдържа подмодули, то правила за игнориране се записват във файл:
.git/modules/имеНаМодул/info/exclude
Използване на Git през Qt Creator
Когато на компютъра има инсталиран команден Git клиент, той може да се използва директно от Qt Creator.
За изтегляне файловете на съхраняван в Git хранилище проект с Qt Creator се стартира нов проект с команда File → New File or Project..., избира се тип проект Import Project и тип на хранилището Git Clone, и се щраква бутона Choose...
В Window, ако все още не е посочена програмата Git клиент, която да се ползва от Qt Creator, ще се покаже страница с бутон за конфигуриране на Git. Щракнете бутона и в поле Prepend to PATH напишете пътя до директорията, в който се намира git.exe. Най-вероятно е това да е: C:UsersИмеНаПотребителAppDataLocalProgramsGitbin. Ако не сте сигурни, кой е пътя до тази директория, проверете с regedit в регистрите на Windows стойността на ключ: HKEY_CURRENT_USER → SOFTWARE → GitForWindows → InstallPath. Като добавите в края на този стринг "bin" ще получите, стринга, който трябва да попълните в Qt Creator. Щом попълните поле Prepend to PATH щракнете бутон Apply и повторете създаването на проект, изтеглен от Git хранилище.
В прозореца на Qt Creator за стартиране на нов проект от Git хранилище, в поле Repository въведете адреса на хранилището, а в поле Directory - името на директорията, в която ще се запишат свалените файлове. Щракнете бутон Continue.
За изтегляне на проекти с достъп с право за запис, изискващо удостоверяване с парола, Qt Creator използва ssh-askpass.
В mocOS този пакет се изтегля и инсталира, както е описано в:
https://github.com/theseal/ssh-askpass
За да може Qt Creator да открива и ползва този пакет трябва да се зададе в настройките Preferences... - Version Control – General – SSH prompt command:
/usr/local/bin/ssh-askpass
В Ubuntu този пакет се инсталира с команда от терминала:
sudo apt-get install ssh-askpass
В Windows ... за съжаление, без успех
https://sourceforge.net/projects/winsshaskpass/
https://sourceforge.net/projects/gxexplorer/files/Borland%20VCL50.BPL/VCL50.BPL/
Синхронизиране с повече хранилища
Възможна е ситуация, в която да се налага да поддържате Ваша версия на даден продукт, във Ваше хранилище, различно от официалното хранилище на оригиналния продукт. Например, с цел във Вашата версия да реализирате промени, които по някаква причина не могат да се осъществят в оригиналния продукт. Но заедно с Вашите промени искате периодично да интегрирате и всички новости, които се правят в оригиналния продукт. В тази случай ще се налага в локалното работно копие на изходния код да изтегляте промените, настъпили в оригиналното хранилище на продукта.
Git позволява да сваляте и съчетавате промени от повече от едно хранилище.
Командата:
git remote -v
показва с кои отдалечени хранилища е свързано Вашето локално копие. Например:
origin https://github.com/vanyog/moodle.git (fetch)
origin https://github.com/vanyog/moodle.git (push)
означава, че локалното хранилище е свързано само с едно отдалечено хранилище с име origin
и адрес: https://github.com/vanyog/moodle.git
Добавяне на друго отдалечено хранилище се извършва с команда git remote add
, например:
git remote add morigin https://github.com/moodle/moodle.git
добавя хранилище с име morigin
, намиращо се на адрес htps://github.com/moodle/moodle.git
Премахване на отдалечено хранилище, имащо име morigin
става с команда:
git remote rm morigin
Изтегляне и вмъкване на промените от това хранилище в локалното копие на кода става с команда:
git pull morigin
Разклоняване (Branching)
В едно git хранилище може да се съхраняват повече разклонения на изходния код на даден проект. Създаването на разклонение може да е необходимо, например, за да се изпробва някоя нова идея. Докато не бъде установено, че този нова идея е реализуема и води до положителен резултат, кодът по реализирането на тези идея се съхранява в отделно разклонение (branch). Когато реализирането на новата идея приключи успешно, то разклонението, в което тя е реализирана, се слива с разклонението, в което се съхранява оригиналния програмен код. Така новата функционалност се добавя в софтуерния проект. Междувременно в оригиналния програмен код може също да са правени промени, това няма да попречи на сливането на двете разклонения. Ако след сливане на разклоненията, вече няма нужда от добавеното разклонение, то може да се изтрие и разработването на софтуера да продължи без него.
Командата:
git branch
без аргументи, показва наличните разклонения, като текущото разклонение е отбелязано със *.
git branch -a
показва всички разклонения, а с опция -r – само разклоненията от отдалеченото хранилище.
Ново разклонение в локално копие на кода се създава с команда:
git branch имеНаРазклонение
След създаване на разклонение промените, които се правят в кода се отразяват само в това разклонение. Тези промени се добавят и запазват в локалното хранилище с командите:
git add .
git commit -m "Коментар върху направените промени"
Качване на новото разклонение в отдалеченото хранилище с направените в него промени се прави с команда
git push origin имеНаРазклонение
Актуализиране на локално копие с направените в отдалеченото хранилище промени се извършва с команда
git pull
която сваля промените от всички разклонения от отдалеченото хранилище.
Превключване към друго разклонение в локално копие на кода се извършва с:
git checkout имеНаРазклонение
Сливане на две разклонения, се извършва като първо се превключва към разклонението, в което ще се извърши сливане и след това се подава команда:
git merge имеНаРазклонение
в която имеНаРазклонение е името на разклонението, от което се вземат, направени промени, и се нанасят в текущото разклонение.
Изтриване на разклонение в локалното хранилище, от което са взети промени и то повече не е необходимо, става с команда:
git branch -d имеНаРазклонение
За изтриване на разклонение и от отдалеченото хранилище се използва команда:
git push origin –-delete имеНаРазклонение
Ако в отдалеченото хранилище някои разклонения са изтрити, при сваляне на промени с git pull
, изтритите от отдалеченото хранилище разклонения не се изтриват автоматично и от локалното хранилище, там те продължават да стоят. За да бъдат изтрити локалните разклонения, които не съществуват в отдалеченото хранилище се изпълняват командите:
git fetch –-prune
git branch -vv
Последната команда показва списък на локалните разклонения, като в описанието на изтритите от отдалеченото хранилище разклонения присъства думата ": gone". Всяко такова разклонение се изтрива с git branch -d имеНаРазклонение.
Подмодули (submodules)
Когато в даден проект се използва програмен код от друг проект, който съществува отделно, със собствено хранилище, другия проект може да се добави във вид на подмодул с команда:
git submodule add URLнаХранилищетоНаДругияПроект
Вижте повече в 7.11 Git Tools - Submodules.
Използване на локално Git хранилище
Под локално хранилище имам предвид хранилище, което се намира на локалния компютър, а не на сървър в Интернет. Използването на такова дава всички предимства, които дава и отдалеченото хранилище – запазване на моментното състояние на кода, над който работите, във всеки момент, в който решите, и възможност за връщане до всяко от запазените състояния.
За да създадете локално хранилище, трябва да влезете от терминал в директория, която ще използвате за хранилище. Тя може да е празна, но може и да съдържа файлове, които бихте искали да се поставят под контрол на системата Git. Подава се команда:
git init
Ако директорията съдържа файлове, които искате да са под системата за контрол на версиите Git, подайте команда, която ще ги добави в създаденото хранилище:
git add .
а след това команда за запазване текущото състояние на тези файлове в хранилището:
git commit -m "Коментар за запазваното състояние"
След всяка поредица от промени, които искате да запазите, трябва да подадете двойката команди: git add .
и git commit
Отмяната на неуспешни промени до последното, запазено в хранилището състояние на даден файл, става с команда:
git checkout имеНаФал
Етикети (тагове, tags)
Вижте: 2.6 Git Basics - Tagging.
Етикетите са средство за отбелязване на определени етапи от работата по даден проект. Обикновето това са моментите на реализиране на определени версии, например: v1.0.1 и т.н.
Списък на поставените етикети се вижда с команда: git tag
Етикетите биват два вида: lightweight (олекотени) и annotated (с прикачена бележка).
Олекотен етикет се създава с команда git tag етикет
където етикет
е самия етикет, нещо от вида: v2.2.0
, v1.0 alpha
, v0.58 beta
или друго подобно.
Етикет с добавена бележка се създава с команда git tag -a етикет -m "Текст на бележката"
Добавеният етикет се асоциира с текущото състояние на локалното хранилище. При команда git push етикетът не се прехвърля в отдалеченото хранилище, освен ако не се посочи изрично с git push origin етикет
Подробна информация за етикет и отбелязаното с него състояние на хранилището се показва с команда git show етикет
Етикет се изтрива от локално хранилище с команда git tag -d етикет
а от отдалечено - с команда git push origin --delete етикет
Скриване на промени (команда stash
)
Налага се, когато в локалното хранилище са направени промени. При опит за сваляне на промени и от отдалечено хранилище с git pull
, ако свалените от отдалеченото хранилище файлове са в конфликт с локалните промени, git pull
завършва със съобщение, че трябва да се изпълни git stash
.
git stash
- скрива локалните промени, които се натрупват в подобна на стек структура.
git stash list
- показва списък на скритите промени.
git stash show
- показва, кои файлове са засегнати във всяка от скритите промени.
git stash apply
- връща последната скрита промяна, без да я премахва.
git stash apply
- връща последната скрита промяна, и я премахва.
git stash clear
- изтрива всички скрити промени.
Отменяне на някои операции, направени с Git
Промени, отразени в локално копие
Съхранените с Git изменения, може да се видят с команда:
git log
показват се в обратен на времето ред – първо е най-новото запазване на промени.
Отмяна на добавянето на файлове, извършено с git add
:
git checkout имеНаФайл
Отмяна на последното запазване на промени, направено с git commit
:
git reset --soft HEAD^
git reset --hard HEAD^
Опция --hard
се използва, в случай, че след последното запазване сте направили още промени, които не са отразени в хранилището. Тези промени също се отменят.
Премахване на файл от Git, без да бъде изтрит от локалната директория:
git rm --cached имеНаФайл
Някои проблеми
Смяна на паролата
При ползване на Git, потребителското име и паролата за достъп до отдалеченото хранилище, необходими за качване на промени там, веднъж зададени се запазват, и не е необходимо тяхното въвеждане при всяка команда git push
. Ако в отдалеченото хранилище те бъдат променени по някаква причина, git push
завършва със съобщение за невалидна парола. Необходимо е премахване на запаметената от Git парола с:
git config --global --unset user.password
При следващо изпълнение на Git команда, която изисква удостоверяване, ще се покаже възможност за въвеждане на нови данни.
Прекъснат git процес
Съобщение:
Another git process seems to be running in this repository, e.g.
an editor opened by 'git commit'. Please make sure all processes
are terminated then try again. If it still fails, a git process
may have crashed in this repository earlier:
remove the file manually to continue.
Ръчно се изтрива файл .git/inddex.lock
Предишна страница: Използване на SVN
Следваща страница: Програмиране за Android