Git
Chapters ▾ 2nd Edition

3.3 Гранање у програму Гит - Управљање гранама

Управљање гранама

Сада када сте направили, спојили и обрисали неке гране, хајде да погледамо неке алате за управљање гранама који ће вам бити од користи када почнете редовно да користите гране.

Поред тога што може да ствара и брише гране, команда git branch има и друге намене . Ако је покренете без опција, добићете једноставну листу ваших тренутних грана:

$ git branch
  iss53
* master
  testing

Обратите пажњу на карактер * који се јавља испред master гране: он означава грану која је тренутно одјављена (тј. грана на коју показује показивач HEAD). Ово значи да ако сада комитујете, грана master ће бити померена унапред новим стварима које сте направили. Да бисте видели последњи комит на свакој грани, можете извршити git branch -v:

$ git branch -v
  iss53   93b412c Fix javascript issue
* master  7a98805 Merge branch 'iss53'
  testing 782fd34 Add scott to the author list in the readme

Корисне --merged и --no-merged опције могу да филтрирају ову листу на гране које већ јесте или још увек нисте спојили у грану на којој се тренутно налазите. Да бисте видели које гране су већ спојене у грану на којој сте сада, треба да извршите git branch --merged:

$ git branch --merged
  iss53
* master

Пошто сте iss53 већ раније спојили, та грана се налази на листи. Гране које на овој листи немају * испред себе су у општем случају спремне да буду обрисане командом git branch -d; рад у њима сте већ укључили у неку другу грану, тако да ништа нећете изгубити.

Да бисте видели све гране које садрже рад који још увек нисте спојили, извршите команду git branch --no-merged:

$ git branch --no-merged
  testing

Ово приказује вашу другу грану. Пошто се у њој налази рад који још увек није спојен, покушај брисања ове гране са git branch -d неће успети:

$ git branch -d testing
error: The branch 'testing' is not fully merged.
If you are sure you want to delete it, run 'git branch -D testing'.

Ако заиста желите да обришете ту грану и изгубите сав тај део кода, брисање можете да форсирате са -D, као што то наводи корисна` порука.

Савет

Опције које су описане изнад, --merged и --no-merged ће вам, у случају да се као аргумент не наведе комит или име гране, приказати шта је спојено или није спојено у вашу текућу грану.

Увек можете да наведете додатни аргумент којим питате за стање спајања у односу на неку другу грану без потребе да је прво одјављујете, као у случају питања шта није спојено у master грану?

$ git checkout testing
$ git branch --no-merged master
  topicA
  featureB

Промена имена гране

Опрез

Немојте да мењате име гранама које још увек користе остали сарадници. Не мењајте име грани као што је master/main/mainline пре него што прочитате одељак „Промена имена master гране”.

Претпоставимо да имате грану под именом bad-branch-name и желите да јој промените име у corrected-branch-name, уз задржавање комплетне историје. Име такође желите да промените и на удаљеном серверу (GitHub, GitLab, неки други сервер). Како ово може да се уради?

Грани локално мењате име командом git branch --move:

$ git branch --move bad-branch-name corrected-branch-name

Ово замењује вашу bad-branch-name са corrected-branch-name, али та промена је за сада само локална. Ако желите да и остали виде исправљено име гране на удаљеном серверу, гурните је:

$ git push --set-upstream origin corrected-branch-name

Сада ћемо на кратко погледати где се налазимо:

$ git branch --all
* corrected-branch-name
  main
  remotes/origin/bad-branch-name
  remotes/origin/corrected-branch-name
  remotes/origin/main

Приметите да се налазите на грани corrected-branch-name и да је она доступна на удаљеном серверу. Међутим, тамо је још увек присутна и грана са погрешним именом, али је можете обрисати ако извршите следећу команду:

$ git push origin --delete bad-branch-name

Сада је погрешно име гране потпуно замењено исправним именом.

Промена имена master гране

Упозорење

Променом имена гране као што је master/main/mainline/default престају да раде интеграције, сервиси, помоћи алати и скрипте за изградњу/објављивање које користи ваш репозиторијум. Пре него што то урадите, обавезно се консултујте са својим сарадницима. Такође, будите сигурни да сте обавили детаљну претрагу свог репозиторијума и ажурирали у коду и скриптама евентуалне референце на старо име гране.

Следећом командом мењате име локалној master грани у main:

$ git branch --move master main

Више нема master локалне гране, јер је њено име промењено у main.

Ако желите да остали виде нову main грану, морате да је гурнете на удаљени сервер. Тако грана са промењеним именом постаје доступна на удаљеном серверу.

$ git push --set-upstream origin main

Сада завршавамо у следећем стању:

git branch --all
* main
  remotes/origin/HEAD -> origin/master
  remotes/origin/main
  remotes/origin/master

Ваше локалне master гране више нема, јер је заменила main грана. main грана је присутна на удаљеном серверу. Међутим, стара master грана је још увек присутна на удаљеном серверу. Остали сарадници ће наставити да користе master грану као базу за свој рад, све док ви не урадите још неке промене.

Сада се пред вама налази још неколико задатака пре него што довршите транзицију:

  • Сваки пројекат који зависи од овог ће морати да ажурира свој кôд и/или конфигурацију.

  • Ажурирање свих конфигурационих фајлова за покретач тестова (ако постоје).

  • Дотеривање скрипти за изградњу и објављивање.

  • Преусмеравање подешавања вашег хоста репозиторијума ствари као што су подразумевана грана репозиторијума, правила спајања и све остало што зависи од имена грана.

  • Ажурирање референци на старе гране у документацији.

  • Затварање или спајање захтева за повлачење који циљају стару грана (ако постоје).

Када завршите све ове задатке и уверите се да main грана функционише исто као и master грана, безбедно ћете моћи да обришете master грану:

$ git push origin --delete master