ฉันสามารถลบสาขาในพื้นที่ทั้งหมดยกเว้นสาขาปัจจุบันได้หรือไม่


98

ฉันต้องการลบสาขาทั้งหมดที่แสดงในผลลัพธ์ของ ...

$ git branch

... แต่รักษาสาขาปัจจุบันไว้ในขั้นตอนเดียว เป็นไปได้หรือไม่ ถ้าเป็นเช่นนั้นอย่างไร?


1
อาจซ้ำกันได้ของDelete all git branch ในเครื่อง
Andrew C


คำตอบ:


67

จากคำตอบของ @pankijs ฉันสร้างชื่อแทน git สองชื่อ:

[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 จะลบสาขาดังกล่าวแม้ว่าจะทำให้เกิดการ "สูญหาย" ก็ตาม ใช้สิ่งนี้ด้วยความระมัดระวังเนื่องจากจะลบ reflogs สาขาเช่นกันดังนั้นสิ่งที่ "กู้คืนจากการลบโดยไม่ตั้งใจ" ตามปกติจะไม่ทำงานเช่นกัน

โดยทั่วไปอย่าใช้-forceเวอร์ชันนี้หากคุณไม่แน่ใจว่า 300% จะไม่สูญเสียสิ่งที่สำคัญไป เพราะมันหายไปตลอดกาล .


2
คอมมิชชันกับสาขาที่ถูกลบควรจะยังคงอยู่ใน reflog ชั่วขณะ
CaptRespect

อันที่จริงการคอมมิตจะยังคงอยู่ใน reflog แต่ไม่ใช่สาขาตัวเอง. ฉันจะไม่ลอง แต่ฉันเดาว่าคุณอาจพบความมุ่งมั่นของคุณ แต่กลับไปที่สถานะสาขา? ฉันสงสัยอย่างนั้น Cherry-pick สามารถใช้เพื่อดึงข้อมูลคอมมิชในสาขาที่ถูกลบ แต่คุณจะไม่สามารถกู้คืนสาขาได้เอง
Vadorequest

1
@Vadorequest คุณสามารถสร้างสาขาใหม่เพื่อชี้การกระทำบางอย่างได้โดยการทำgit branch branchname commitid
pqnet

@pqnet ฉันไม่รู้ว่าจะสร้างประวัติศาสตร์ทั้งหมดสำหรับสาขานั้นขึ้นมาใหม่ขอบคุณสิ่งที่ควรรู้!
Vadorequest

1
@Vadorequest เนื่องจากวัตถุที่กระทำนั้นไม่เปลี่ยนรูป (และจัดทำดัชนีเป็นแฮช) การแก้ไขทุกครั้งต้องสร้างวัตถุใหม่ (ด้วยแฮชที่แตกต่างกัน)
pqnet

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

จะลบสาขาทั้งหมดยกเว้น master (แทนที่ master ด้วย branch ที่คุณต้องการเก็บไว้ แต่มันจะลบ master)


31
หากคุณต้องการที่จะเก็บในปัจจุบันgrep -v ^*ใช้สาขา
Schwern

2
แหล่งข้อมูลหลายแห่งแสดงสคริปต์นี้ให้ฉัน แต่เมื่อฉันเรียกใช้มันมักจะบอกฉันเสมอว่าไม่พบสาขา :(
tucq88

1
สิ่งนี้ไม่ถูกต้องมันจะไม่ลบสาขาที่เรียกmaster-copyเช่น
mvallebr

2
ปรับแต่ง regex ตามความจำเป็นตัวอย่างเช่นgrep -v "^ *master$"
Brad Koch

9
grep -v "master\|my-other-branch"หากคุณต้องการที่จะทำให้การใช้งานทั้งสองสาขา
Derek Soike

23

ขั้นแรก (สลับไปยังสาขาที่คุณต้องการเก็บไว้> ex : master ):

git checkout master

วินาที ( ตรวจสอบให้แน่ใจว่าคุณอยู่ในระดับหลัก )

git branch -D $(git branch)

3
ง่ายและรวดเร็วมาก เหตุใดจึงไม่ได้รับการโหวตเพิ่มขึ้น
princebillyGK

1
เป็นคำตอบที่ง่ายและดีที่สุดสำหรับฉัน
Saleh Enam Shohag

3
หากคุณใช้ PowerShell ให้ใช้git branch -D $(git branch).Trim()ไฟล์.
NatoBoram

เราควรใส่$(git branch)เครื่องหมายคำพูดหรือไม่? ไม่ได้ผล: ไม่พบข้อผิดพลาด: branch '$ (git' not found. error: branch 'branch)'
saran3h

1
คำตอบที่ดีที่สุดควรได้รับการโหวต
xelber

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จะลบสาขาดังกล่าวแม้ว่าจะทำให้เกิดการ "สูญหาย" ก็ตาม ใช้สิ่งนี้ด้วยความระมัดระวังเนื่องจากจะลบ reflogs สาขาเช่นกันดังนั้นสิ่งที่ "กู้คืนจากการลบโดยไม่ตั้งใจ" ตามปกติจะไม่ทำงานเช่นกัน


ควรเป็นgit branch -D $(git branch | grep -v '^*')ถ้าคุณต้องการลบสาขาเหล่านั้นที่รวมเข้าด้วยกัน
Pratik Singhal

@PratikSinghal: ที่ลบสาขาอื่น ๆทั้งหมดไม่ใช่แค่สาขาที่ Git พิจารณาว่า "รวม" นี่เป็นความคิดที่ไม่ค่อยดีนัก ฉันได้ชี้ให้เห็นทั้งสองรายการนี้ในคำตอบของฉันแล้ว
torek

12

ในการลบสาขาที่ผสานทั้งหมด (ยกเว้นปัจจุบัน-v ‘*’):

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

ฉันยังสร้างคำสั่งดังกล่าวสำหรับการล้าง repo ให้เสร็จสมบูรณ์

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

นำมาจากที่นี่


1
สิ่งนี้จะลบสาขาที่ผสานเท่านั้น
Pratik Singhal

10

ลบสาขาทั้งหมดยกเว้นสาขาเฉพาะ :

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

ลบสาขาในพื้นที่ทั้งหมดยกเว้นการพัฒนาและการควบคุมหลัก

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


3

ฉันเคยสร้างโครงสร้างนี้สำหรับสภาพแวดล้อม Windows ของฉัน บางทีมันอาจจะช่วยคนอื่นได้ ในระหว่างการดำเนินการหลักและสาขาในปัจจุบันจะไม่ถูกลบ สาขาที่ผสานอื่น ๆ ทั้งหมดจะถูกลบโดยไม่คำนึงถึง

@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 -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

2

สมมติgit branchแสดงสาขาปัจจุบันที่นำหน้าด้วย*; ใช้ Powershell *หนึ่งต่อไปนี้สายการบินจะลบทุกสาขาที่ไม่ได้เริ่มต้นด้วย

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

? = ที่ไหน - วัตถุ

% = Foreach-Object


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(verbose สองครั้ง) ในขณะที่-aจะไม่ช่วยคุณ (มันแสดงรายการสาขาระยะไกลด้วย)
pqnet
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.