เมื่อใดที่จะลบสาขาใน Git


284

สมมติว่าเรามีแอปพลิเคชันที่เสถียร

พรุ่งนี้มีคนรายงานข้อผิดพลาดขนาดใหญ่ที่เราตัดสินใจแก้ไขด่วนทันที ดังนั้นเราจึงสร้างสาขาสำหรับการแก้ไขด่วนนั้นจาก "หลัก" เราตั้งชื่อมันว่า "2011_Hotfix" และเราดันมันขึ้นมาเพื่อให้นักพัฒนาซอฟต์แวร์ทุกคนสามารถร่วมมือกันแก้ไขมันได้

เราแก้ไขข้อผิดพลาดและรวม "2011_Hotfix" เข้ากับ "master" เช่นเดียวกับในสาขาการพัฒนาปัจจุบัน และกด "นาย"

เราจะทำอย่างไรกับ "2011_Hotfix" ตอนนี้ มันควรจะนั่งอยู่ที่นั่นเป็นสาขาตลอดไปจนกว่าจะหมดเวลาหรือตอนนี้เราควรจะลบมันเพราะมันมีวัตถุประสงค์ ดูเหมือนว่าไม่สะอาดที่จะทิ้งกิ่งก้านสาขาไว้รอบ ๆ ทุกแห่งเพราะรายชื่อกิ่งไม้นั้นจะยาวมากซึ่งส่วนใหญ่ไม่จำเป็นอีกต่อไป

ในกรณีที่ควรลบจะเกิดอะไรขึ้นกับประวัติของมัน จะได้รับการดูแลหรือไม่แม้ว่าจะไม่มีสาขาที่แท้จริงอยู่อีกต่อไป นอกจากนี้ฉันจะลบสาขาระยะไกลได้อย่างไร


33
มันมักจะช่วยให้คิดสาขาเป็นความคิด กฎง่ายๆที่ดีพอสมควรคือถ้าคุณทำงานเกี่ยวกับความคิดที่สาขาเป็นตัวแทน - รวมถึงการทดสอบที่เสร็จสิ้นและรวมการเปลี่ยนแปลงเหล่านั้น
Cascabel

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

1
คุณไม่สามารถส่งผลกระทบต่อที่เก็บข้อมูลในเครื่องคอมพิวเตอร์ของเพื่อนร่วมงานของคุณ คุณต้องบอกให้เขาลบสาขาในพื้นที่หรือคุณสามารถบังคับฝั่งเซิร์ฟเวอร์นี้ด้วย git hooks / ความปลอดภัยสาขาเพื่อป้องกันการกดจากสาขาที่คุณต้องการลบ
srz2

คำตอบ:


183

git branch -d yourbranchคุณสามารถลบสาขาด้วย หากมีการเปลี่ยนแปลงที่ยังไม่รวม (เช่นคุณจะสูญเสียการผูกมัดโดยการลบสาขา) git จะบอกคุณและจะไม่ลบมัน

ดังนั้นการลบสาขาที่ผสานจึงมีราคาถูกและจะไม่ทำให้คุณสูญเสียประวัติ

ในการลบสาขาระยะไกลให้ใช้git push origin :mybranchสมมติว่าชื่อรีโมตของคุณเป็นจุดกำเนิดและสาขารีโมตที่คุณต้องการทำการลบมีชื่อว่า mybranch


35
"การลบสาขาที่ถูกผสานนั้นมีราคาถูก" แต่ก็ทำให้อยู่ใกล้ ไม่มีการเข้าชมอย่างมีนัยสำคัญในแง่ของเวลาหรือพื้นที่คอมไพล์ใช้ถ้าคุณเก็บไว้รอบ ๆ ที่กล่าวว่าฉันจะลบสาขาเพราะความมุ่งมั่นทั้งหมดมีอยู่แล้วในประวัติศาสตร์ของmasterดังนั้นจึงทำให้สิ่งที่สะอาดมากขึ้น
MatrixFrog

22
หนึ่งในเหตุผลของฉันที่ต้องการลบสาขาคือ: เราทำการเปลี่ยนแปลงหลายอย่างในสาขา (อันที่จริงแล้วการเปลี่ยนแปลงทั้งหมด) ดังนั้นในที่สุดคุณจะได้รับรายชื่อยาวเมื่อใช้คำสั่ง 'git branch' สำหรับภาพรวมฉันต้องการย่อรายการนั้น ดังนั้นสาขาเก่าจะถูกลบ รีลีสถูกติดแท็กดังนั้นจึงไม่ได้อยู่ในการปฏิเสธนี้สำหรับฉัน
michel.iamit

7
ในขณะที่ฉันเห็นด้วยกับการลบสาขาที่ได้รับการผสานแล้วถ้าคุณต้องการที่จะเห็นรายการของสาขาที่ยังไม่ได้ถูกรวมเข้าไปในสาขาปัจจุบันของคุณคุณสามารถใช้: สาขา git - ไม่มีการผสาน
lsklyut

51
@ MatrixFrog ราคาถูกเพื่อให้รอบในแง่ของ git แต่ในค่าใช้จ่ายของมนุษย์อาจกลายเป็นราคาแพง ฉันเพิ่งเข้าโครงการที่มีสาขาประมาณ 40 สาขาทั้งหมดมีชื่อสาขาเป็นตัวเลข ฉันไม่รู้ว่าอะไรเป็นอะไรและเกือบทุกสาขาของมันนั้นเหม็นอับ ค่าใช้จ่ายในการค้นหาผ่านกิ่งไม้เหล่านั้นและค้นหาว่าอะไรคือสิ่งที่เหนื่อยและใช้เวลา ดังนั้นใช่เทคนิคราคาถูก แต่ก็ไม่จริง ฉันชอบที่จะทำให้รูปร่างเรือ repo คอมไพล์ของฉัน หากไม่ได้อยู่ใน dev ที่ใช้งานอยู่และถูกรวมเข้าด้วยกันให้ลบออก แต่นั่นเป็นเพียง MO ของฉันและฉันเคารพว่าคนอื่นอาจทำสิ่งที่แตกต่าง
dudewad

1
คำสั่งให้--no-mergedเริ่มต้นคืออะไร ฉันลองgit config --global --add branch.noMerged trueแล้วมันก็ถูกเพิ่มเข้ามา แต่มันก็ไม่ได้สร้างความแตกต่างเลย
Craig Silver

55

สิ่งที่คุณต้องทำคือติดแท็กสิ่งที่คุณปล่อย หมั่นสาขาเมื่อคุณมีการพัฒนาอย่างแข็งขัน

ลบกิ่งเก่าด้วย

git branch -d branch_name

ลบออกจากเซิร์ฟเวอร์ด้วย

git push origin --delete branch_name

หรือไวยากรณ์เก่า

git push origin :branch_name

ซึ่งอ่านว่า "ไม่ต้องป้อนอะไรเลยใน branch_name at origin"

ที่กล่าวว่าตราบใดที่ DAG (กราฟเชิงเส้นกำกับ) สามารถชี้ไปที่จุดนั้นได้คอมมิชชันจะมีอยู่ในประวัติศาสตร์

Google "git-flow" และอาจให้ข้อมูลเชิงลึกเกี่ยวกับการจัดการการเผยแพร่การแยกและการติดแท็ก


31

เนื่องจากคำถามมีแท็ก "github" ฉันก็จะเพิ่มสิ่งนี้: เฉพาะในGithubหากคุณดึงคำขอสาขาและได้รับการผสาน (ผ่าน UI หรือโดยรวมสาขาคำขอดึง) คุณจะไม่ สูญเสียข้อมูลการร้องขอดึง (รวมถึงความคิดเห็น) แม้ว่าคุณจะลบสาขา

ผลที่ตามมาคือ: หากคุณรวมคำขอดึงเป็นส่วนหนึ่งของเวิร์กโฟลว์ของคุณ (ซึ่งกลมกลืนกับบทวิจารณ์โค้ด) คุณสามารถลบสาขาได้อย่างปลอดภัยทันทีที่รวมเข้าด้วยกัน นี่เป็นเรื่องธรรมดาที่ Github เพิ่งเพิ่มฟีเจอร์ (หวาน) ที่ปรากฏปุ่ม "ลบสาขา" ทันทีหลังจากที่คุณรวมคำขอดึง

แต่ควรสังเกตว่าแต่ละกลุ่มควรใช้เวิร์กโฟลว์ที่เหมาะสมที่สุด (และอาจนำไปสู่การลบสาขาดังกล่าว) ยกตัวอย่างเช่นทีมงานปัจจุบันของฉันพรุนสาขาทั้งหมดที่ไม่ใช่ผู้เชี่ยวชาญหรือเกี่ยวข้องกับการปรับใช้ (เช่นการผลิตการจัดเตรียม ฯลฯ ) ทันทีที่คำขอรวมของพวกเขาถูกรวมเข้าด้วยกันและเรายังคงติดตามอย่างเต็มรูปแบบว่า แต่ละการปรับปรุงที่เพิ่มขึ้นของแต่ละผลิตภัณฑ์

แน่นอนว่าไม่มีการจัดการประวัติ (ดึงคำขอหรืออื่น ๆ ) แทนที่การติดแท็กเวอร์ชันที่เหมาะสม (ซึ่งคุณควรทำโดยอัตโนมัติด้วยเครื่องมือ / สคริปต์เดียวกันที่ปรับใช้ / แพ็คเกจรุ่น) ดังนั้นคุณสามารถสลับไปยังสิ่งที่ผู้ใช้เกิดขึ้นได้อย่างรวดเร็ว ในช่วงเวลาที่กำหนด การติดแท็กเป็นกุญแจสำคัญในการแก้ปัญหาเดิมของคุณ: หากคุณสร้างสาขาที่ผสานกับสาขา "งาน" สามารถและควรจะลบและควรรวมแท็กเวอร์ชันใด ๆ ที่รวมเข้ากับแท็กเวอร์ชัน "การผลิต" และอื่น ๆ ด้วย คุณจะมีโปรแกรมแก้ไขด่วนให้ใช้งานได้ตลอดจนกว่าจะมีการรวมในรุ่นต่อไป


2
ขอบคุณสำหรับการอธิบายว่าทำไม Github แสดงปุ่ม "ลบสาขา" ให้ฉัน
Todd Owen

เรากำลังใช้ sourcetree และให้ตัวเลือกในการเปิดสาขาของโปรแกรมแก้ไขด่วนภายในและสาขาของโปรแกรมแก้ไขด่วนระยะไกล ฉันคิดว่าการปิดสาขาโปรแกรมแก้ไขด่วนหมายถึงการลบและคุณไม่สามารถใช้งานได้อีก เช่นเราต้องผลักดันฮอตฟิกซ์ทุกวันสำหรับ 5 วันถัดไป จากนั้นเราก็ปิดมัน แต่สมมติว่าในวันที่ 6 เราต้องการโปรแกรมแก้ไขด่วนอื่น เราจะสร้างสาขาโปรแกรมแก้ไขด่วนใหม่หรือไม่
อันตราย 14

มันเป็นสิ่งที่คนมักจะทำ หากไม่สามารถตั้งชื่อบุคคลเหล่านั้นได้คุณสามารถตั้งชื่อพวกเขาตามวันหรืออ้างอิงระบบตั๋วที่จัดการพวกเขา (ถ้ามี) แน่นอนว่าเวิร์กโฟลว์ git นั้นควรถูกนำไปใช้บนพื้นฐาน "สิ่งที่ดีที่สุดสำหรับทีมของคุณ" ดังนั้นไม่ต้องกังวลหากคุณตัดสินใจที่จะทำงานแตกต่างกัน
chesterbr

7

ฉันจะเพิ่มว่าข้อเสียของการลบสาขาคือคุณจะแบ่งการเชื่อมโยงหลายมิติไปยังสาขาเหล่านั้นใน GitHub (คำถามนี้มีแท็ก GitHub) คุณจะได้รับ404 Not Foundข้อผิดพลาดสำหรับลิงค์เหล่านั้น นี่คือเหตุผลที่ฉันเปลี่ยนลิงก์ของฉันให้ชี้ไปที่การส่งมอบหรือแท็กหลังจากฉันลบสาขาใน GitHub

เนื่องจากลิงก์บางอย่างไม่สามารถเปลี่ยนแปลงได้เช่นในอีเมลตอนนี้ฉันหลีกเลี่ยงการเชื่อมโยงหลายมิติไปยังสาขา GitHub ทั้งหมดและลิงก์ไปยังคอมมิชชันหรือแท็กตั้งแต่วันแรก

ฉันชอบที่จะลบสาขาหลังจากที่พวกเขารวมเข้าด้วยกันซึ่งจะช่วยป้องกันความยุ่งเหยิงทางสายตาของรายการสาขาที่ยาวนานในที่เก็บของคุณ สาขาเหล่านี้ยังแพร่กระจายไปยังส้อมของพื้นที่เก็บข้อมูลทั้งหมด

ก่อนอื่นฉันจะลบสาขาท้องถิ่นของฉัน สิ่งนี้จะป้องกันไม่ให้ถูกผลักโดยไม่ตั้งใจในภายหลัง

git branch -d branchName

จากนั้นฉันก็ลบสาขาการติดตามระยะไกล

git branch -dr remoteName\branchName

จากนั้นฉันก็ลบสาขาบน GitHub ฉันใช้เว็บอินเตอร์เฟส แต่คำสั่งเทียบเท่าอยู่ด้านล่าง

git push remoteName :branchName

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

git tag -a tagName commitOrBranchName

จากนั้นฉันก็ผลักแท็กไปยัง GitHub

git push remoteName tagName

เมื่อไรที่คนเก็บขยะกินอาหารที่เป็นกิ่งไม้ คุณต้องการแท็กและดันแท็กก่อนที่จะลบสาขาหรือไม่
Jared Thirsk


4

ดูเหมือนว่าคุณต้องการลบ2011_Hotfixสาขาโดยไม่สูญเสียประวัติ ฉันจะหารือเกี่ยวกับการลบครั้งแรกและประวัติศาสตร์ครั้งที่สอง

gitวิธีการลบสาขาตามปกติได้อธิบายไว้ข้างต้นแล้วและทำงานได้ตามที่คาดไว้ gitไม่มีคำสั่งหนึ่งหรือสองคำซึ่งหมายความว่า "เฮ้gitลบทั้งสาขาโลคัลและรีโมต" แต่พฤติกรรมนี้สามารถเลียนแบบได้ผ่านเชลล์สคริปต์ ตัวอย่างเช่นใช้สคริปต์เชลล์ซัคฮอลของ 'Git-Nuke' มันง่ายมาก:

#!/bin/sh
git branch -D $1
git push origin :$1

วางสิ่งนี้ลงในไฟล์ที่สามารถใช้งานได้ (เช่นgit-nuke) ในหนึ่งใน$PATHไดเรกทอรีของคุณ หากคุณไม่ได้อยู่ใน2011_Hotfixสาขาคุณเพียงแค่เรียกใช้git-nuke 2011_Hotfixจะลบทั้งสาขาในพื้นที่และระยะไกล สิ่งนี้เร็วกว่าและง่ายกว่ามากแม้ว่าอาจจะเป็นอันตรายมากกว่าgitคำสั่งมาตรฐาน

ความกังวลของคุณเกี่ยวกับการอนุรักษ์ประวัติศาสตร์เป็นสิ่งที่ดี ในกรณีนี้คุณไม่จำเป็นต้องกังวล เมื่อคุณรวม2011_Hotfixเข้าmasterด้วยกันความมุ่งมั่นทั้งหมดจาก2011_Hotfixจะถูกเพิ่มลงในmasterประวัติการกระทำของ ในระยะสั้นคุณจะไม่สูญเสียประวัติจากการรวมง่าย

ฉันมีอีกหนึ่งคำที่จะเพิ่มซึ่งอาจเกินขอบเขตคำถามของคุณ แต่มีความเกี่ยวข้อง ลองจินตนาการว่ามี 20 เล็ก ๆ "การทำงานในความคืบหน้า" มุ่งมั่นที่2011_Hotfix; อย่างไรก็ตามคุณต้องการเพียงข้อตกลงเดียวที่สมบูรณ์มันเป็นการฉลาดสำหรับทีมที่จะมีแนวทางที่ชัดเจนในการใช้เพื่อให้คาวบอย dev บางตัวในทีมไม่ได้สร้างความเสียหายให้กับโครงการ2011_Hotfixเพิ่มการmasterประวัติของ คุณจะรวมความมุ่งมั่นเล็ก ๆ ทั้ง 20 ข้อนี้เข้าด้วยกันได้อย่างไร โชคดีที่ช่วยให้คุณสามารถที่จะรวมการกระทำเป็นหนึ่งในหลายกระทำโดยใช้git git-rebaseฉันจะไม่อธิบายที่นี่วิธีการทำงาน; แม้ว่าหากคุณสนใจเอกสารสำหรับgit-rebaseเป็นเลิศ โปรดทราบว่าการgit rebaseเขียนประวัติใหม่ดังนั้นควรใช้อย่างรอบคอบโดยเฉพาะอย่างยิ่งถ้าคุณยังใหม่กับมัน ในที่สุด2011_Hotfixสถานการณ์ของคุณเกี่ยวกับทีมนักพัฒนาไม่ใช่นักพัฒนาคนเดียว หากสมาชิกในทีมของโครงการใช้git rebasegit rebasegitประวัติศาสตร์


3

หากถูกรวมกลับสำเร็จแล้วและอาจถูกแท็กฉันจะบอกว่าไม่มีประโยชน์อีกต่อไป git branch -d branchnameเพื่อให้คุณได้อย่างปลอดภัยสามารถทำได้


2

หากคุณต้องการตัดกิ่งสาขาในพื้นที่ที่ถูกลบออกจากแหล่งกำเนิดคุณสามารถตัดในขณะที่ใช้ git fetch

git fetch --prune

0

คุณสามารถลบสาขาใน UIs สำคัญ ๆ ของเว็บเช่น Github, BitBucket หลังจากลบสาขาออนไลน์คุณสามารถลบสาขาท้องถิ่นโดยใช้

git remote prune origin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.