คุณจะหยุดติดตามสาขาระยะไกลใน Git ได้อย่างไร


556

คุณจะหยุดติดตามสาขาระยะไกลในGit ได้อย่างไร

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

ฉันสามารถเพียงแค่ทำgit branch -d the_branchและมันจะไม่ได้รับการแพร่กระจายเมื่อผมมารู้ทีหลังgit push?

มันจะเผยแพร่ต่อเมื่อฉันจะทำงานในgit push origin :the_branchภายหลังหรือไม่?

คำตอบ:


708

ตามที่ระบุไว้ในคำตอบของYoshua Wuytsโดยใช้:git branch

git branch --unset-upstream

ตัวเลือกอื่น:

คุณไม่จำเป็นต้องลบสาขาท้องถิ่นของคุณ

เพียงลบสาขาท้องถิ่นที่ติดตามสาขาระยะไกล:

git branch -d -r origin/<remote branch name>

-r, --remotesบอกให้ git ลบสาขาการติดตามระยะไกล (เช่นลบชุดสาขาเพื่อติดตามสาขาระยะไกล) สิ่งนี้จะไม่ลบสาขาใน repo ระยะไกล !

ดูที่ " การมีความเข้าใจยากลำบากในการเข้าใจ git-fetch "

ไม่มีแนวคิดดังกล่าวของสาขาการติดตามในท้องถิ่นเพียงสาขาการติดตามระยะไกล
ดังนั้นจึงorigin/masterเป็นสาขาการติดตามระยะไกลสำหรับmasterในoriginrepo

ดังที่ได้กล่าวไว้ในคำตอบของDobes Vandermeerคุณต้องรีเซ็ตการกำหนดค่าที่เกี่ยวข้องกับสาขาในพื้นที่ :

git config --unset branch.<branch>.remote
git config --unset branch.<branch>.merge

<branchname>นำข้อมูลต้นน้ำสำหรับ
หากไม่มีการระบุสาขาจะใช้ค่าเริ่มต้นเป็นสาขาปัจจุบัน

(คอมไพล์ 1.8+, ต.ค. 2012, กระทำ b84869eโดยคาร์ลอMartínเนีย ( carlosmn) )

ที่จะทำให้การผลักดันใด ๆ / origin/<remote branch name>ดึงสมบูรณ์ไม่รู้


8
สาขาการติดตามระยะไกลจะถูกสร้างขึ้นใหม่หลังจากเรียก git เป็นไปได้ไหมที่จะไม่รวมสิ่งเหล่านี้
Matt R

1
@Matt: ฉันเชื่อว่าสิ่งนี้จะทำได้โดยการตั้งค่าremote.<name>.fetchrefspec config แต่ฉันไม่แน่ใจว่าคุณจะสามารถแยกสาขาได้หรือไม่เมื่อระบุ refspec
VonC

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

7
@ruffin: นี่เป็นเรื่องปกติโดยสมบูรณ์: git branch -d -r origin/<remote branch name>จะลบสาขาการติดตามระยะไกลตามที่ประกาศไว้ในเครื่องใน repo ของคุณ มันจะไม่ลบสาขาใน repo ระยะไกลตัวเอง (เพียงgit push :developmentจะทำเช่นนั้น) ดังนั้นเมื่อคุณกดท้องถิ่นของคุณdevelopmentด้วยประวัติที่แตกต่างจากสาขาการพัฒนาระยะไกล (ใน repo ระยะไกล) คุณจะยังคงได้non-fast-forwardรับคำเตือน
VonC

1
@Marco จริง แต่ฉันชอบทำมันต่อไปฉันพบว่า "สะอาด"
VonC

200

หากต้องการลบอัปสตรีมสำหรับสาขาปัจจุบันให้ทำดังนี้

$ git branch --unset-upstream

สิ่งนี้มีให้สำหรับ Git v.1.8.0 หรือใหม่กว่า (แหล่งที่มา: 1.7.9 เตะ , 1.8.0 โทษ )

แหล่ง


20
ควรเป็นคำตอบที่เลือก
ไกเซอร์

9
หากคุณไม่ต้องการลบสาขาปัจจุบันเพียง:git branch --unset-upstream [branchname]
Sonata

2
ดูเหมือนว่าจะเป็นของใหม่ ข้อมูลเพิ่มเติมเล็กน้อยจะดี เช่นการแนะนำรุ่น
ManuelSchneid3r

แน่นอนว่าอย่าลังเลที่จะตอบกลับเมื่อคุณพบและฉันจะอัปเดตความคิดเห็นอย่างมีความสุข
Yoshua Wuyts

อืมฉันได้รับfatal: 'origin/master' does not appear to be a git repository fatal: Could not read from remote repository. หลังจากทำสิ่งนี้และลองต้นกำเนิด git pull / master
information_interchange

106

ในการลบการเชื่อมโยงระหว่างการเรียกใช้สาขาในตัวเครื่องและระยะไกลให้ทำดังนี้

git config --unset branch.<local-branch-name>.remote
git config --unset branch.<local-branch-name>.merge

เลือกลบสาขาท้องถิ่นหลังจากนั้นถ้าคุณไม่ต้องการ

git branch -d <branch>

สิ่งนี้จะไม่ลบสาขาระยะไกล


11
git branch -d <branch>จะไม่จำเป็นต้องเอาสมาคม
Marco

1
ฉันใช้ JIRA เมื่อฉันดึงอีกครั้งสาขาจะปรากฏขึ้น ฉันจะป้องกันได้อย่างไร
powder366

1
@Marco ถูกต้อง แต่ถ้าคุณใช้คุณจะยังคงเห็นสาขาเก่าจนกว่าคุณจะทำgit branch -vv git branch -d <branch>
SeldomNeedy

@ powder366 ขึ้นอยู่กับการตั้งค่าของคุณgit pullอาจคว้าสาขาระยะไกลทั้งหมดและเพิ่มใหม่ใด ๆ ที่พิจารณาว่ามี "ปรากฏ" ในระยะไกล คุณสามารถเปลี่ยน "ดึงทุกสาขา" พฤติกรรมโดยการทำหรือgit config [--global] push.default simple เพิ่มเติมเกี่ยวกับที่นี่ git config [--global] push.default currentpush.default
SeldomNeedy

1
@Seldom จำเป็นต้องฉันคิดว่าคุณอาจพลาดจุด DVCS หรือไม่? ประเด็นคือฉันสามารถมีสาขาที่เริ่มติดตามสาขาต้นน้ำ แต่ฉันแยกเพื่อติดตามแนวทางที่สาขาต้นน้ำไม่ได้ใช้ ในกรณีนี้สาขาไม่ได้ "เก่า" (เพราะฉันยังคงพัฒนาอยู่) และ "เลิกใช้" (เพราะฉันใช้มัน) นี่เป็นส่วนใหญ่ของการออกแบบของ DVCS .. มันสมเหตุสมผลหรือไม่?
Marco

33

วิธีที่ง่ายที่สุดคือการแก้ไข .git/config

นี่คือไฟล์ตัวอย่าง

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
[remote "origin"]
        url = git@example.com:repo-name
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "test1"]
        remote = origin
        merge = refs/heads/test1
[branch "master"]
        remote = origin
        merge = refs/heads/master

ลบบรรทัดmerge = refs/heads/test1ในtest1ส่วนสาขา


3
+1 ฉันไม่สามารถบอกได้อย่างชัดเจนว่านี่เป็นวิธีที่ง่ายที่สุด แต่ก็พิสูจน์ได้ว่าฉันเข้าใจได้ง่ายที่สุด (และหวังว่าจะจำได้)
ปราชญ์

โซลูชันที่ดี +1 นี่คือสถานที่ที่มีการลงทะเบียนการติดตามง่ายต่อการเปลี่ยนแปลงล้างสิ่งที่ทำ Commandline .git/configก็มีให้เช่นกัน
hakre

5
เช่นเดียวกันกับโซลูชัน "git config --unset" โดย Dobes Vandermeer "git config" แก้ไขไฟล์นี้
JZ

10

คุณสามารถลบสาขาติดตามระยะไกลโดยใช้

git branch -d -r origin/<remote branch name>

ดังที่ VonC กล่าวไว้ข้างต้น แต่ถ้าคุณเก็บสำเนาภายในประเทศของคุณสาขาที่git push จะยังคงพยายามที่จะผลักดันสาขา (ซึ่งอาจทำให้คุณมีข้อผิดพลาดที่ไม่ใช่ข้างหน้าอย่างรวดเร็วเท่าที่จะทำได้สำหรับรัฟฟิน ) นี่เป็นเพราะการกำหนดpush.defaultค่าเริ่มต้นmatchingซึ่งหมายถึง:

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

(ดูhttp://git-scm.com/docs/git-configใต้push.default)

เนื่องจากนี่อาจไม่ใช่สิ่งที่คุณต้องการเมื่อคุณลบสาขาการติดตามระยะไกลคุณสามารถตั้งค่าpush.defaultเป็นupstream(หรือtrackingถ้าคุณมี git <1.7.4.3)

ต้นน้ำ - ผลักสาขาปัจจุบันไปยังสาขาต้นน้ำ

การใช้

git config push.default upstream

และคอมไพล์จะหยุดพยายามผลักสาขาที่คุณมี "หยุดการติดตาม"

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


3

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

git branch -rd $(git branch -a | grep '{pattern}' | cut -d'/' -f2-10 | xargs)


หากสาขาการติดตามระยะไกลเท่านั้นที่จะไม่ได้ติดตาม (ลบ) แล้วฉันคิดว่านี่เป็นทางเลือกหนึ่งบรรทัดที่สั้นกว่า:git branch -r -D $(git branch -r | grep -v "master")
dma_k

1

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

ฉันมีสูตรส่งโดย @Dobes ในรายการ [นามแฝง] แฟนซีใน. gitconfig ของฉัน:

# to untrack a local branch when I can't remember 'git config --unset'
cbr = "!f(){ git symbolic-ref -q HEAD 2>/dev/null | sed -e 's|refs/heads/||'; }; f"
bruntrack = "!f(){ br=${1:-`git cbr`};  \
    rm=`git config --get branch.$br.remote`; \
    tr=`git config --get branch.$br.merge`; \
    [ $rm:$tr = : ] && echo \"# untrack: not a tracking branch: $br\" && return 1; \
    git config --unset branch.$br.remote; git config --unset branch.$br.merge; \
    echo \"# untrack: branch $br no longer tracking $rm:$tr\"; return 0; }; f"

จากนั้นฉันก็สามารถวิ่งได้

$ git bruntrack branchname

1
+1 นามแฝงดีนอกเหนือไปจากคำตอบของฉันข้างต้น
VonC

-1

git branch --unset-upstream หยุดการติดตามสาขาท้องถิ่นทั้งหมดซึ่งไม่ต้องการ

ลบ[branch "branch-name"]ส่วนจาก.git/configไฟล์ตามด้วย

git branch -D 'branch-name' && git branch -D -r 'origin/branch-name'

ทำงานออกมาได้ดีที่สุดสำหรับฉัน


-1

คุณสามารถใช้วิธีนี้เพื่อลบสาขาระยะไกลของคุณ

git remote remove <your remote branch name>

1
ที่จะลบสาขาการติดตามระยะไกลทั้งหมดสำหรับระยะไกลนั้น: หากคุณมีมากกว่าหนึ่งสาขานั่นอาจเป็นปัญหาได้
VonC

-2

วิธีที่ง่ายที่สุดในการทำเช่นนี้คือการลบสาขาจากระยะไกลจากนั้นใช้:

git fetch --prune (aka git fetch -p)


14
ฉันสับสน OP ไม่ต้องการลบสาขาระยะไกล
madth3

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