Odstránenie zlúčených vetiev v Git

Thursday, Apr 6, 2017 · 478 slov · git terminál

Pri vývoji nových funkcionalít, alebo pri odstraňovaní chýb v aplikácii je dobrým zvykom používať samostatné vetvu. S týmto prístupom sa vám po čase v zozname vetiev určite nakopia vetvy, ktoré už boli zlúčené, ale referencia na ne ostala v zozname. V tomto článku si ukážeme, ako tieto vetvy z lokálneho systému jednoducho odstrániť.

TL;DR;

Zlúčené vetvy môžete odstrániť pomocou príkazu:

$ git branch --merged | egrep -v "(^\*|master|develop)" | xargs git branch -d

Rozbor príkazu

Samostatné vetvy majú niekoľko výhod. Izolujú zmeny v kóde medzi programátormi, zapuzdrujú zmeny potrebné pre danú funkcionalitu, alebo opravu chyby. Vetvy, v ktorých je málo zmien, sú taktiež jednoduchšie na preskúmanie pri dopyte pre zlúčenie do hlavnej vetvy atď.

Zoznam všetkých lokálnych vetiev môžete vo vašom termináli zobraziť pomocou príkazu:

$ git branch
  XYZ-123-feature-123
  XYZ-124-feature-124
  XYZ-125-feature-125
  XYZ-128-feature-128
  XYZ-143-feature-143
* develop
  master

Názov vetvy označený hviezdičkou (*) predstavuje vetvu, na ktorej sa momentálne nachádzate. Pre zobrazenie zlúčených vetiev je potrebné použiť prepínač --merged:

$ git branch --merged
  XYZ-123-feature-123
  XYZ-124-feature-124
  XYZ-125-feature-125
* develop
  master

Majte však na pamäti, že prepínač merged bez definície konkrétnej vetvy zobrazuje zlúčené vetvy s ohľadom na aktuálnu vetvu (hlavu - HEAD). Preto je pred vyčistením zoznamu vetiev potrebné prepnúť hlavu na vašu hlavnú vetvu repozitára (prípadne použiť v príkaze konkrétnu vetvu).

Máme teda zoznam zlúčených vetiev. V ďalšom kroku vylúčime zo zoznamu naše hlavné vetvy master a develop a aktuálnu pracovnú vetvu, ktorú i tak nie je možné odstrániť. Pre tento účel nám poslúži zreťazenie pomocou | a niektorý z programov grep, egrep, alebo podobný. Pre náš príklad použijeme program egrep s regulárnym výrazom (^\*|master|develop) a prepínačom -v, ktorý zabezpečí invertovanú zhodu pre výraz:

$ git branch --merged | egrep -v "(^\*|master|develop)"
  XYZ-123-feature-123
  XYZ-124-feature-124
  XYZ-125-feature-125

V prípade, že vaše hlavné vetvy nie sú master a develop, upravte regulárny výraz podľa vašej potreby.

Ako posledný krok nám ostáva samotné zmazanie vetiev. Pre tento účel nám poslúži zreťazenie výstupu z predchádzajúceho príkazu a použitie programu xargs s príkazom Git pre zmazanie vetvy:

$ git branch --merged | egrep -v "(^\*|master|develop)" | xargs git branch -d
Deleted branch XYZ-123-feature-123 (was 813dae4).
Deleted branch XYZ-124-feature-124 (was 87247a0).
Deleted branch XYZ-125-feature-125 (was 83347ea).

Ak následne necháme vypísať zoznam vetiev, zlúčené vetvy budú odstránené:

$ git branch
  XYZ-128-feature-128
  XYZ-143-feature-143
* develop
  master

Príkaz pre odstránenie zlúčených vetiev môžete taktiež pridať do vášho konfiguračného súboru ako alias. Alias môžete vytvoriť pomocou nasledujúceho príkazu:

git config --global alias.cleanup '!git branch --merged | egrep -v "(^\*|master|develop)" | xargs git branch -d'

Pomocou príkazu git config -e --global môžete prípadne otvoriť globálny konfiguračný súbor v móde pre editáciu a sekciu [alias] editovať manuálne:

[alias]
    cleanup = !git branch --merged | egrep -v \"(^\\*|master|develop)\" | xargs git branch -d

Vytvorený alias bude následne dostupný ako git cleanup.

Viac informácií o tejto problematike sa môžete dozvedieť na Stack Overflow v otázke How can I delete all git branches which have been merged?.

comments powered by Disqus