Git
Chapters ▾ 2nd Edition

3.3 Клонове в Git - Управление на клонове

Управление на клонове

След като създадохме, сляхме и изтрихме няколко разклонения код, нека разгледаме някои инструменти, които ще бъдат от полза, когато започнете да ползвате разклоненията постоянно.

Командата git branch може да прави повече от създаване или изтриване на клонове. Ако я пуснете без аргументи, ще получите прост списък на наличните клонове код:

$ git branch
  iss53
* master
  testing

Звездичката преди името на клона означава, че той е текущо активния в момента (клонът към който сочи 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 ще ви покажат съответно какво е и какво не е слято в текущия клон.

Можете винаги да подадете допълнителен параметър за да попитате за merge статуса по отношение на друг клон без първо да превключате към него, например - какво не е слято в 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

Сега bad branch name е напълно заменен с corrected branch name.

Смяна на името на master клона

Внимание

Смяната на имената на клонове като master/main/mainline/default ще счупи интеграциите, услугите, помощните инструменти и build/release скриптовете, които вашето хранилище ползва. Преди да го направите, уверете се, че сте се консултирали с колегите си. Също така, проверете внимателно хранилището и се уверете, че сте коригирали всички референции към старото име на клона в кода и скриптовете ви.

Преименувайте локалния 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 клона като база за своята работа, докато не направите следващи промени.

Сега имате още малко задачи преди да завършите промяната:

  • Всички проекти, които зависят от този, ще трябва да обновят кода и конфигурациите си.

  • Обновяване на всички test-runner конфигурционни файлове.

  • Корекция на build и release скриптовете.

  • Корекция на настройките на хоста на хранилището за неща като клон по подразбиране, правила за сливане и други подобни, които имат отношение към именуването на клоновете.

  • Обновяване на обръщенията към стария клон в документацията.

  • Затваряне или сливане на всички pull requests, насочени към стария клон.

След всико това, и след като се уверите, че main клонът функционира точно като master клона, можете да изтриете master от сървъра:

$ git push origin --delete master