क्या मैं वर्तमान को छोड़कर सभी स्थानीय शाखाओं को हटा सकता हूं?


95

मैं उन सभी शाखाओं को हटाना चाहता हूं जो आउटपुट में सूचीबद्ध हैं ...

$ git branch

... लेकिन एक कदम में , वर्तमान शाखा को रखते हुए । क्या यह संभव है? यदि हां, तो कैसे?




संभावित रूप से डुप्लिकेट मैं उन सभी गिट शाखाओं
Giulio Caccin

जवाबों:


66

@Pankijs उत्तर के आधार पर, मैंने दो गिट एलियाज़ बनाए:

[alias]
    # Delete all local branches but master and the current one, only if they are fully merged with master.
    br-delete-useless = "!f(){\
        git branch | grep -v "master" | grep -v ^* | xargs git branch -d;\
    }; f"
    # Delete all local branches but master and the current one.
    br-delete-useless-force = "!f(){\
        git branch | grep -v "master" | grep -v ^* | xargs git branch -D;\
    }; f"

में जोड़ा जाना है ~/.gitconfig


और, @torek ने बताया:

ध्यान दें कि लोअरकेस -d"गैर-पूर्ण रूप से मर्ज की गई" शाखा को नहीं हटाएगा (प्रलेखन देखें)। उपयोग करने -D से ऐसी शाखाएं नष्ट हो जाएंगी , भले ही यह "खो" जाने का कारण बन जाए; इसे बहुत सावधानी से उपयोग करें , क्योंकि यह शाखा को हटा देता है और साथ ही, ताकि सामान्य रूप से "आकस्मिक विलोपन से उबरने" सामान भी काम न करे।

मूल रूप से, कभी भी -forceसंस्करण का उपयोग न करें यदि आप 300% सुनिश्चित नहीं हैं कि आप कुछ भी महत्वपूर्ण नहीं खोएंगे। क्योंकि यह हमेशा के लिए खो गया है


2
हटाए गए शाखा में आने के बाद भी थोड़ी देर के लिए रोकना चाहिए।
कब्जा

दरअसल, कम्फर्ट रिफ्लॉग में रहेंगे। लेकिन शाखा ही नहीं। मैं इसकी कोशिश नहीं करूंगा, लेकिन मुझे लगता है कि आपको अपने कमिट मिल सकते हैं, लेकिन शाखा राज्य में वापस जाएं? मुझे शक है। चेरी-पिक का उपयोग हटाए गए शाखा में कमिट्स को पुनः प्राप्त करने के लिए किया जा सकता है, लेकिन आप स्वयं शाखा को पुनर्स्थापित नहीं कर पाएंगे।
वडॉरेक्वेस्ट

1
@Vadorequest आप एक निश्चित git branch branchname commitid
कमिटमेंट

@pqnet मुझे नहीं पता था कि उस शाखा के लिए सभी इतिहास को फिर से बनाया जाएगा, धन्यवाद, जानने के लिए अच्छा है!
वडकोरक्वेस्ट

1
@Vadorequest चूंकि कमिट ऑब्जेक्ट्स अपरिवर्तनीय हैं (और हैश के रूप में अनुक्रमित), प्रत्येक एडिट के लिए एक नई ऑब्जेक्ट (एक अलग हैश के साथ) बनाने की आवश्यकता होती है
pqnet

179
$ git branch | grep -v "master" | xargs git branch -D 

मास्टर को छोड़कर सभी शाखाओं को हटा देगा (आप जिस शाखा को रखना चाहते हैं उसके साथ मास्टर बदलें, लेकिन फिर यह मास्टर को हटा देगा)


29
यदि आप वर्तमान शाखा का उपयोग करना चाहते हैं grep -v ^*
Schwern

2
कई स्रोत मुझे यह स्क्रिप्ट दिखाते हैं, लेकिन जब मैं इसे चलाता हूं तो हमेशा मुझे बताता हूं कि शाखाएं नहीं मिलीं :(
tucq88

1
यह सटीक नहीं है, यह master-copyउदाहरण के लिए
mvallebr

2
रेगेक्स को आवश्यक रूप से फिर से मोड़ें, उदाहरण के लिएgrep -v "^ *master$"
ब्रैड कोच

7
यदि आप दो शाखाओं का उपयोग करना चाहते हैं grep -v "master\|my-other-branch"
डेरेक सोइक

17

पहला (उस शाखा पर स्विच करें जिसे आप रखना चाहते हैं> पूर्व : मास्टर ):

git checkout master

दूसरा (सुनिश्चित करें कि आप मास्टर हैं )

git branch -D $(git branch)

3
बहुत जल्दी और आसान। यह उत्थान क्यों नहीं हो रहा है?
प्रिंसबिलीजीके

1
यह मेरे लिए सबसे सरल और सबसे अच्छा जवाब है।
सालेह एनाम शोहग

1
यदि आप PowerShell का उपयोग कर रहे हैं, तो उपयोग करें git branch -D $(git branch).Trim()
नाटोबोरम

13

git branch -d(या -D) कई शाखा नामों की अनुमति देता है, लेकिन कम से कम थोड़ा सा कोड लिखे बिना "सभी स्थानीय शाखाओं को स्वचालित रूप से आपूर्ति करना, जो अब मैं एक को छोड़कर" हूं, को स्वचालित रूप से आपूर्ति करना थोड़ा मुश्किल है।

"सर्वश्रेष्ठ" (औपचारिक रूप से सही) विधि का उपयोग git for-each-refशाखा नाम प्राप्त करने के लिए किया जाता है:

git for-each-ref --format '%(refname:short)' refs/heads

लेकिन तब यह पता लगाना और भी कठिन हो जाता है कि आप किस शाखा में हैं ( git symbolic-ref HEADयदि आप फैंसी स्क्रिप्ट लिखना चाहते हैं तो इसके लिए "औपचारिक रूप से सही है" विधि)।

अधिक सुविधाजनक रूप से, आप उपयोग कर सकते हैं git branch, जो आपके स्थानीय शाखा नामों को दो स्थानों से पहले या (वर्तमान शाखा के लिए) तारांकन द्वारा प्रिंट करता है *। इसलिए, *संस्करण को निकालने के लिए इसे किसी चीज़ के माध्यम से चलाएं और आप अंतरिक्ष से अलग शाखा नामों के साथ छोड़ दें , जिन्हें आप इसके बाद पास कर सकते हैं git branch -d:

git branch -d $(git branch | grep -v '^*')

या:

git branch | grep -v '^*' | xargs git branch -d

ध्यान दें कि लोअरकेस -d"गैर-पूर्ण रूप से मर्ज की गई" शाखा को नहीं हटाएगा (प्रलेखन देखें)। उपयोग करने -Dसे ऐसी शाखाएं नष्ट हो जाएंगी, भले ही यह "खो" जाने का कारण बन जाए; इसे बहुत सावधानी से उपयोग करें, क्योंकि यह शाखा को हटा देता है और साथ ही, ताकि सामान्य रूप से "आकस्मिक विलोपन से उबरने" सामान भी काम न करे।


यह होना चाहिए git branch -D $(git branch | grep -v '^*'), यदि आप उन शाखाओं को हटाना चाहते हैं जो विलय कर चुके हैं।
प्रतीक सिंघल

@PratikSinghal: जो अन्य सभी शाखाओं को हटाता है , न कि केवल शाखाएं जिसे "मर्ज" माना जाता है। यह शायद ही एक अच्छा विचार है। मैंने अपने उत्तर में इन दोनों वस्तुओं को पहले ही इंगित कर दिया था।
torek

12

सभी मर्ज की गई शाखाओं को हटाने के लिए (वर्तमान को छोड़कर -v ‘*’):

git branch --merged | grep -v '*' | xargs git branch -D

मैं भी रेपो को पूरी तरह से साफ करने के लिए इस तरह का आदेश देता हूं:

alias git-clean="git branch  | grep -v '*' | grep -v 'master' | xargs git branch -D  && git reset --hard && git clean -d -x -f"

यहां से ले जाया गया ।


1
यह केवल मर्ज की गई शाखाओं को हटाता है।
प्रतीक सिंघल

10

विशिष्ट शाखा को छोड़कर सभी शाखाओं को हटा दें :

git branch | grep -v "branch name" | xargs git branch -D

विकास और मास्टर को छोड़कर सभी स्थानीय शाखाओं को हटा दें

git branch | grep -v "develop" | grep -v "master" | xargs git branch -D


4

स्थानीय रूप से सभी मर्ज की गई शाखा हटाएं:

git branch -D `git branch --merged | grep -v \* | xargs`

विशिष्ट शाखा को छोड़कर सभी शाखाओं को हटा दें :

git branch | grep -v "branch name" | xargs git branch -D

विकास और मास्टर को छोड़कर सभी स्थानीय शाखाओं को हटा दें

git branch | grep -v "develop" | grep -v "master" | xargs git branch -D

3

मैंने एक बार अपने विंडोज वातावरण के लिए यह निर्माण किया था। शायद यह किसी और की मदद करेगा। निष्पादन के दौरान, मास्टर और वर्तमान शाखा को हटाया नहीं जाता है । अन्य सभी मर्ज की गई शाखाओं को हटा दिया जाएगा।

@echo off
cd PATH_TO_YOUR_REPO

REM -- Variable declerations
set "textFile=tempBranchInfo.txt"
set "branchToKeep=master"
set "branchToReplaceWith="
git branch --merged > %textFile%

REM -- remove "master" from list to keep the branch
for /f "delims=" %%i in ('type "%textFile%" ^& break ^> "%textFile%" ') do (
    set "line=%%i"
    setlocal enabledelayedexpansion
    >>"%textFile%" echo(!line:%branchToKeep%=%branchToReplaceWith%!
    endlocal
)

REM -- execute branch delete commands
for /f "delims=" %%a in (%textFile%) do (
    git branch -D %%a
)

REM -- remove temp-file with branch information inside
DEL %textFile%

REM -- show local branches after the cleaning
echo Local branches:
git branch

pause 
exit

3

एक चरण में वर्तमान शाखा को छोड़कर सभी शाखाओं को हटाने के लिए:

git branch | grep -v $(git rev-parse --abbrev-ref HEAD) | xargs git branch -D


2

मान लेना git branchवर्तमान शाखा के साथ उपसर्ग दिखाता है *; Powershell का उपयोग करने से निम्नलिखित एक लाइनर उन सभी शाखाओं को हटा देगा, जिनके साथ शुरू नहीं होता है *

git branch | ? { $_ -lt "*" } | % { git branch -D $_.Trim() }

? = जहाँ-तहाँ

% = फॉरच-ऑब्जेक्ट


1

इसलिए मुझे यहां बहुत सी हार्ड कोडेड शाखा के नाम दिखाई देते हैं ... और मुझे लगता है कि यहां मेरा उत्तर प्रश्न की "वर्तमान शाखा" के हिस्से के लिए अधिक सटीक है, जबकि यह एकल लाइन रखने और मेरे जैसे नए-नए शब्दों को पढ़ने के लिए पठनीय है। सिर्फ क्रेडिट को रखने के लिए जहां यह कारण है, उत्तर स्पष्ट रूप से @ pankijs के उत्तर पर भी आधारित है।

git branch | grep -v $(git branch --show-current) | xargs git branch -d

और मैंने इसे एक लाइन पर अपने .bash_aliases में डेबियन एस्वेल में अलियास किया है।

alias gitbclean='git branch | grep -v $(git branch --show-current) | xargs git branch -d'

(हालांकि मुझे लगता है कि कुछ कमांड लाइनों पर चलने के लिए उप-कमांड के लिए कुछ बैश सुविधाओं को सक्षम करने की आवश्यकता है)


1

मैं इसका उपयोग करता हूं क्योंकि मैं उस चीज में अधिक चयनात्मक हो जाता हूं जिसे मैं हटाना नहीं चाहता। यह नीचे आदेश मास्टर, विकास और वर्तमान शाखा को छोड़कर हर शाखा को हटा देता है।

BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES

इसलिए मैंने इसे अपने अंदर डाल लिया ~/.zshrc

delete_branches() {
  BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
  echo $BRANCHES
}

alias cleanup_branches=delete_branches

0

IMHO, स्थानीय शाखाओं को हटाने का सबसे सुरक्षित तरीका है:

git branch -av | grep "\[gone\]" | awk '{print $1}' | xargs git branch -d

इसके अलावा, इस विषय से संबंधित अधिक जानकारी आप सभी स्थानीय गिट शाखाओं को हटा सकते हैं


उस goneमार्कर को प्रिंट करने के लिए जिसे आपको -vvदो बार प्रयोग करना चाहिए (क्रिया दो बार), जबकि -aयह आपकी मदद नहीं करेगा (यह दूरस्थ शाखाओं को भी सूचीबद्ध करता है)
pqnet
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.