ฉันจะแสดงรายการสาขาระยะไกลทั้งหมดใน Git 1.7+ ได้อย่างไร


634

ฉันลองgit branch -rแล้ว แต่นั่นแสดงเฉพาะสาขารีโมตที่ฉันติดตามในเครื่อง ฉันจะค้นหารายชื่อผู้ที่ฉันไม่ได้ทำอย่างไร (ไม่สำคัญสำหรับฉันว่าคำสั่งจะแสดงรายการรีโมตทั้งหมดหรือเฉพาะที่ไม่ได้ติดตาม)


11
คุณหมายถึงว่าคุณได้แก้ไข refspec เริ่มต้นดังนั้นgit fetchและgit remote updateไม่ดึงสาขาของรีโมททั้งหมดหรือไม่ เพราะมิฉะนั้นคุณสามารถดึงข้อมูลได้จากนั้นใช้git branch -r...
Cascabel

2
ฉันต้องมี. git branch -rแสดงให้ฉันเห็นว่าเป็นสาขาระยะไกลที่ฉันติดตามในท้องถิ่นเท่านั้น มันทำงานได้ดีขึ้นในขณะนี้
James A. Rosen

คำตอบ:


804

สำหรับผู้เยี่ยมชมส่วนใหญ่[1]ที่นี่คำตอบที่ถูกต้องและง่ายที่สุดสำหรับคำถาม "ฉันจะแสดงรายการสาขาระยะไกลทั้งหมดใน Git 1.7+ ได้อย่างไร" คือ:

git branch -r

สำหรับชนกลุ่มน้อย[1] git branch -rไม่ทำงาน หากgit branch -rไม่ได้ผลลอง:

git ls-remote --heads <remote-name>

ถ้าgit branch -rไม่ได้ทำงานแล้วอาจจะเป็นCascabelกล่าวว่า"คุณแก้ไข refspec เริ่มต้นเพื่อให้git fetchและgit remote updateไม่สามารถดึงข้อมูลทั้งหมดremoteของสาขา"


[1]จากการเขียนเชิงอรรถนี้ในปี 2018- ก.พ. ฉันดูความคิดเห็นและดูว่าgit branch -rผลงานส่วนใหญ่ (ประมาณ 90% หรือ125จาก140 )

หากgit branch -rไม่ได้ผลให้ตรวจสอบว่าgit config --get remote.origin.fetchมีไวด์การ์ด ( *) ตามคำตอบนี้


15
นอกจากนี้คุณยังสามารถทำgit ls-remote [url]เพื่อให้คุณไม่ได้มีการโคลนมันเป็นครั้งแรก :)
Zsub

142
คำตอบนี้ถูกต้อง แต่ทำให้เข้าใจผิดสิ่งแรกที่ผู้ใช้มาที่นี่จากเครื่องมือค้นหาควรดูคือ: git branch -rเนื่องจากเป็นคำตอบที่ถูกต้องและง่ายที่สุดผู้ถามจึงมีกรณีพิเศษที่เขาปรับเปลี่ยนพฤติกรรมของgit branch -rผู้ใช้ส่วนใหญ่ที่มาที่นี่ มี
เตฟาน

24
@ สตีเฟ่น: คุณแน่ใจเกี่ยวกับเรื่องนี้? git branch -rยังไม่ทำงานสำหรับฉัน มันเป็นเพียงแค่รายชื่อสาขาที่ติดตามอยู่ในเครื่องแล้ว แต่git ls-remote --headsระบุไว้ทุกสาขาที่มีอยู่บนพื้นที่เก็บข้อมูลระยะไกล ...
Rexford

2
หากต้องการดึงข้อมูลจากสาขาที่แสดงรายการผ่านgit ls-remote(และไม่อยู่ในรายการgit branch -r) จะต้องดำเนินการgit config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"ก่อนดึงข้อมูลตามที่อธิบายไว้ที่ stackoverflow.com/a/26649770/873282
koppor

11
อย่าลืมที่จะทำ git fetch --allก่อนที่จะได้รับสาขาระยะไกลในปัจจุบันทั้งหมด
A. Attia

173

remote show แสดงกิ่งก้านทั้งหมดบนรีโมทรวมถึงกิ่งที่ไม่ได้ติดตามในพื้นที่และแม้แต่กิ่งที่ยังไม่ได้ถูกดึงกลับมา

git remote show <remote-name>

นอกจากนี้ยังพยายามแสดงสถานะของสาขาที่สัมพันธ์กับที่เก็บในเครื่องของคุณ:

> git remote show origin
* remote origin
  Fetch URL: C:/git/.\remote_repo.git
  Push  URL: C:/git/.\remote_repo.git
  HEAD branch: master
  Remote branches:
    branch_that_is_not_even_fetched new (next fetch will store in remotes/origin)
    branch_that_is_not_tracked      tracked
    branch_that_is_tracked          tracked
    master                          tracked
  Local branches configured for 'git pull':
    branch_that_is_tracked merges with remote branch_that_is_tracked
    master                 merges with remote master
  Local refs configured for 'git push':
    branch_that_is_tracked pushes to branch_that_is_tracked (fast-forwardable)
    master                 pushes to master                 (up to date)

เผง ไม่ได้ดึงข้อมูลไม่ถูกติดตามแบบโลคัล
Thufir

3
branch_that_is_not_tracked tracked?
Piotr Dobrogost

3
@PiotrDobrogost ใช่! branch_that_is_not_trackedเป็นสาขาที่ไม่ได้ติดตามโดยสาขา git ท้องถิ่นใด ๆ อย่างไรก็ตามมันถูกดึงไปยังที่เก็บในเครื่อง (ดังนั้นจึงมีสาขาระยะไกล) ด้วยเหตุผลแปลก ๆ บางอย่างgit remote showเรียกสถานะนี้trackedแม้ว่าจะไม่มีสาขาในท้องที่ที่ติดตามระยะไกล ในกรณีนี้ตรงกันข้ามtrackedคือnewหมายถึง "ไม่ดึงข้อมูล"
Klas Mellbourn

สิ่งนี้ใช้งานไม่ได้ในเชิงโปรแกรมยากเกินไปที่จะแยกวิเคราะห์
อเล็กซานเดอร์มิลส์

นี่เป็นกรณีพิเศษที่ฉันมีเมื่อฉันดึงสาขาระยะไกลในพื้นที่ซึ่งถูกลบออกจากรีโมตแล้ว จากนั้นgit branch -rแสดงให้เห็นว่ามีความเป็นสาขาที่ห่างไกลยังคง แต่แสดงให้เห็นว่าgit remote show origin refs/remotes/origin/my-now-dead-branch stale (use 'git remote prune' to remove)มีประโยชน์มากขึ้น!
icc97

53
git branch -a | grep remotes/*

10
โดยพื้นฐานแล้วเทียบเท่ากับgit branch -rที่ OP กล่าวว่าไม่ดีพอ
Cascabel

9
ที่จริงทั้งคู่git branch -aและgit branch -rแสดงรายการสาขาระยะไกลทั้งหมดสำหรับฉันฉันไม่แน่ใจว่าสิ่งที่ OP พูดจริงหรือไม่ ฉันเพิ่งตั้งค่าพื้นที่เก็บข้อมูลทดสอบและตรวจสอบความถูกต้องนี้ (มีแหล่งกำเนิดการติดตามหลัก / ต้นแบบเท่านั้น แต่ยังคงเห็นสาขาระยะไกลทั้งหมดที่มีธงทั้งสอง)
Idan K

2
ดูเหมือนว่านี่จะไม่แสดงรายการรีโมตสาขาทั้งหมดหากฉันโคลนจาก repo ที่ดึงไว้แล้วจากนั้นชี้แหล่งกำเนิดด้วยตนเองที่เซิร์ฟเวอร์ git คำตอบที่ยอมรับจะจัดการกับกรณีนี้
nielsbot

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

สิ่งที่แปลกสำหรับปีที่ผมเคยใช้git fetchตามด้วยgit branch -aซึ่งเพิ่งเริ่มต้นที่จะล้มเหลวสำหรับฉัน บางทีพฤติกรรมของคอมไพล์ก็เปลี่ยนไป?
เซบาสเตียนมัค

39

ใช้git branch -rแสดงรายการรีโมตรีโมตทั้งหมดและgit branch -aแสดงรายการทุกสาขาบนโลคัลและรีโมต รายการเหล่านี้ล้าสมัยแม้ว่า เพื่อให้รายการเหล่านี้เป็นปัจจุบันอยู่เสมอรัน

git remote update --prune

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

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

git remote update --prune origin

การแก้ไขปัญหาของฉัน - 'git branch -r' ได้ผลสำหรับฉันแล้ว
Francis Norton

27

แต่

git branch -ar

ควรทำมัน


41
การส่งผ่านข้อโต้แย้งทั้งสองซ้ำซ้อน -rส่งกลับเฉพาะสาขาระยะไกล -aส่งคืนสาขาในพื้นที่และระยะไกล ดังนั้นgit branch -aและgit branch -arทั้งคู่ให้ผลลัพธ์เดียวกัน
วอลเตอร์โรมัน

19

นอกจากนี้คุณยังอาจจะตามมาด้วยgit fetch git branch -rคุณจะไม่เห็นสาขาปัจจุบัน


git fetch --allมีสาขาปัจจุบันทั้งหมด
A. Attia

19

Git Branching - สาขาระยะไกล

git ls-remote

เอกสาร Git


gs ls-remote - มุ่งหน้าเพื่อรับผลลัพธ์ที่เฉพาะเจาะจงมากขึ้น
Wolfgang Fahl

1
นี้เป็นคำสั่งเดียวที่ยังแสดงสาขาของฉันฉันตั้งใจผลักดันโดยไม่ต้องheads/ในrefs/heads/features/my-branchขอบคุณ!
msa


9

TL; TR;

นี่คือวิธีการแก้ปัญหาของคุณ:

git remote update --prune    # To update all remotes
git branch -r                # To display remote branches

หรือ:

git remote update --prune    # To update all remotes
git branch <TAB>             # To display all branches

5

คำสั่งที่ดีที่สุดในการทำงานคือ git remote show [remote]คำสั่งที่ดีที่สุดในการทำงานคือนี้จะแสดงทุกสาขาระยะไกลและท้องถิ่นติดตามและไม่ได้ติดตาม

นี่คือตัวอย่างจากโครงการโอเพนซอร์ส:

> git remote show origin
* remote origin
  Fetch URL: https://github.com/OneBusAway/onebusaway-android
  Push  URL: https://github.com/OneBusAway/onebusaway-android
  HEAD branch: master
  Remote branches:
    amazon-rc2                   new (next fetch will store in remotes/origin)
    amazon-rc3                   new (next fetch will store in remotes/origin)
    arrivalStyleBDefault         new (next fetch will store in remotes/origin)
    develop                      tracked
    master                       tracked
    refs/remotes/origin/branding stale (use 'git remote prune' to remove)
  Local branches configured for 'git pull':
    develop merges with remote develop
    master  merges with remote master
  Local refs configured for 'git push':
    develop pushes to develop (local out of date)
    master  pushes to master  (up to date)

grepถ้าเราเพียงแค่ต้องการที่จะได้รับสาขาที่ห่างไกลที่เราสามารถใช้ คำสั่งที่เราต้องการใช้จะเป็น:

grep "\w*\s*(new|tracked)" -E

ด้วยคำสั่งนี้:

> git remote show origin | grep "\w*\s*(new|tracked)" -E
    amazon-rc2                   new (next fetch will store in remotes/origin)
    amazon-rc3                   new (next fetch will store in remotes/origin)
    arrivalStyleBDefault         new (next fetch will store in remotes/origin)
    develop                      tracked
    master                       tracked

คุณยังสามารถสร้างนามแฝงสำหรับสิ่งนี้:

git config --global alias.branches "!git remote show origin | grep \w*\s*(new|tracked) -E"

git branchesจากนั้นคุณสามารถทำงานได้เพียงแค่




4

เพียงแค่เรียกใช้git fetchคำสั่ง มันจะดึงกิ่งระยะไกลทั้งหมดไปยังที่เก็บในเครื่องของคุณแล้วทำ a git branch -aเพื่อแสดงรายการกิ่งทั้งหมด


1

หากมีสาขาระยะไกลที่คุณรู้ว่าควรจะอยู่ในรายการ แต่มันไม่ได้อยู่ในรายการคุณอาจต้องการตรวจสอบว่าที่มาของคุณถูกตั้งค่าอย่างถูกต้องด้วยสิ่งนี้:

git remote show origin

หากเป็นสิ่งที่ดีคุณอาจเรียกใช้อัปเดต:

git remote update

สมมติว่าทำงานได้สำเร็จคุณควรทำสิ่งที่คำตอบอื่น ๆ พูด:

git branch -r

1

ใช้คำสั่งนี้

git log -r --oneline --no-merges --simplify-by-decoration --pretty=format:"%n %Cred CommitID %Creset: %h %n %Cred Remote Branch %Creset :%d %n %Cred Commit Message %Creset: %s %n"

CommitID       : 27385d919
Remote Branch  : (origin/ALPHA)
Commit Message :  New branch created

โดยจะแสดงรายการสาขาระยะไกลทั้งหมดรวมถึงส่งข้อความและส่งรหัสที่อ้างอิงโดยสาขาระยะไกล


1

ฉันจะใช้:

git branch -av

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


0

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


0

ฉันลงเอยด้วยการทำท่อส่งเชลล์เพื่อรับสิ่งที่ฉันต้องการ ฉันเพิ่งรวมสาขาจากแหล่งกำเนิดระยะไกล:

git branch -r --all --merged \
    | tail -n +2 \
    | grep -P '^  remotes/origin/(?!HEAD)' \
    | perl -p -e 's/^  remotes\/origin\///g;s/master\n//g'

0

คำตอบที่ได้รับการยอมรับสำหรับฉัน แต่ฉันพบว่ามีประโยชน์มากกว่าที่จะเรียงลำดับการคอมมิทเริ่มด้วยล่าสุด

git branch -r --sort=-committerdate

https://git-scm.com/docs/git-branch

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