จะทราบได้อย่างไรว่าสาขาในพื้นที่ใดที่ติดตามสาขาระยะไกลใน Git


234

ฉันต้องการทราบว่ามีวิธีใดที่จะบอกได้ว่าสาขาในพื้นที่นั้นกำลังติดตามสาขาระยะไกลใน Git หรือไม่

ฉันใช้เซิร์ฟเวอร์ระยะไกลหนึ่งตัวซึ่งมีชื่อว่า "origin"


ถูกต้องฉันถ้าฉันผิด แต่ไม่ใช่ 'มันเป็นสาขาระยะไกลที่มีชื่อกำเนิดโดยค่าเริ่มต้นมากกว่าเซิร์ฟเวอร์ ??
Chris Halcrow

คำตอบ:


196

ใช้ตัวอย่างสำเนาหุ่นของฉันเช็คเอาท์จากที่เก็บ Git upstream บน Github.com ...

$ git remote show origin
* remote origin
  Fetch URL: git://github.com/reductivelabs/puppet.git
  Push  URL: git://github.com/reductivelabs/puppet.git
  HEAD branch: master
  Remote branches:
    0.24.x                 tracked
    0.25.x                 tracked
    2.6.x                  tracked
    master                 tracked
    next                   tracked
    primordial-ooze        tracked
    reins-on-a-horse       tracked
    testing                tracked
    testing-17-march       tracked
    testing-18-march       tracked
    testing-2-april        tracked
    testing-2-april-midday tracked
    testing-20-march       tracked
    testing-21-march       tracked
    testing-24-march       tracked
    testing-26-march       tracked
    testing-29-march       tracked
    testing-31-march       tracked
    testing-5-april        tracked
    testing-9-april        tracked
    testing4268            tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

ถ้าฉันจะทำสิ่งต่อไปนี้:

$ git checkout -b local_2.6 -t origin/2.6.x 
Branch local_2.6 set up to track remote branch 2.6.x from origin.
Switched to a new branch 'local_2.6'

และสุดท้ายรันgit remote show originคำสั่งอีกครั้งฉันจะเห็นสิ่งต่อไปนี้ใกล้ด้านล่าง:

  Local branches configured for 'git pull':
    local_2.6 merges with remote 2.6.x
    master    merges with remote master

1
นี่หมายความว่าคุณสามารถติดตามสาขาระยะไกลทั้งหมดในหุ่นเชิดแม้ว่าคุณจะมีสาขาท้องถิ่นไม่กี่แห่งก็ตาม สัญญาณ "ติดตาม" จำนวนมากหมายความว่าคุณเห็นผลลัพธ์ของคำสั่งหรือไม่ "ติดตาม" โดยสาขาท้องถิ่นใด
PJ

สาขาระยะไกลมีการติดตามว่าถ้าคุณทำgit fetchหรือgit pullปรับปรุงสาขาระยะไกลจะถูกติดตามในพื้นที่เก็บข้อมูลโคลนของคุณ สาขาในพื้นที่เป็นเพียงสาขาในท้องถิ่นของสาขาระยะไกลดังนั้นการปรับปรุงสาขาระยะไกลจะถูกติดตามและผสานในเมื่อได้รับคำสั่งที่เหมาะสมในการทำเช่นนั้น ฉันรวมตัวเลือก '-t' ไว้อย่างชัดเจนเมื่อสร้างสาขาในพื้นที่เพื่อให้แน่ใจว่าติดตามสาขาที่มาจาก โปรดจำไว้ว่าสาขาในท้องถิ่นยังสามารถติดตามสาขาในพื้นที่อื่นได้ดังนั้นจึงไม่จำเป็นต้องเป็นสาขาระยะไกล
Jeremy Bouse

5
@PJ: คำว่า "track" มีความหมายที่แตกต่างกันสองอย่างใน Git บรรทัด "ติดตาม" ในgit remote show remote-nameอ้างถึง"การติดตามสาขา" (สแนปชอตของสาขาจากที่เก็บข้อมูลระยะไกล) บรรทัด "ผสานกับ" อ้างถึงสาขาในท้องถิ่นที่มีการกำหนดค่า"สาขาต้นน้ำ" (สร้างด้วยตัวเลือก--track/ -tของสาขาGitหรือการชำระเงิน Gitและมักสับสนกับ "สาขาการติดตาม")
Chris Johnsen

" Branch-tracking remote " เป็นรายการคำศัพท์ล่าสุดสำหรับ "สาขาการติดตาม" ที่กล่าวถึงข้างต้น เอกสารได้รับการปรับปรุงใน8b3f3f84
ento

124

สำหรับทุกสาขา:

git branch -avv

สำหรับสาขาท้องถิ่นเท่านั้น:

git branch -lvv

สำหรับสาขาระยะไกลเท่านั้น:

git branch -rvv

แสดงให้คุณเห็นทุกสาขาเช่นเดียวกับชื่อของสาขาต้นน้ำ


2
นี่คือคำตอบที่ง่ายและครบถ้วนที่สุด!

6
ในรุ่น git 1.7.7.5 นี่แสดงให้ฉันเห็นสาขาท้องถิ่นและ sha-1 มันชี้ไปที่ แต่มันไม่แสดงสาขาระยะไกลที่ถูกติดตาม ...
mpontillo

ใช้งานได้กับฉันใน git เวอร์ชั่น 1.7.4.1 ต้องใช้ 'v' ตัวที่สองเพื่อแสดงสาขาการติดตามระยะไกล
Peter Johnson

4
เพื่อลดการgit branch -lvvแสดงผลเฉพาะสาขาในท้องถิ่นที่มีอัปสตรีมอาจเป็นประโยชน์
AB

5
^ git branch -vvใช้ได้กับฉัน ...
notacouch

52

เจเรมี Bouse แสดงให้เห็นถึงวิธีการgit remote showแสดงข้อมูลการติดตาม นั่นควรจะเพียงพอหากคุณต้องการข้อมูลเพื่อการบริโภคของมนุษย์เท่านั้น

หากคุณวางแผนที่จะใช้ข้อมูลในบริบทอัตโนมัติ (เช่นสคริปต์) คุณควรใช้ระดับล่าง ("ประปา") git for-each-refแทน

% git remote show origin
* remote origin
⋮
  Local branches configured for 'git pull':
    master merges with remote master
    pu     merges with remote pu
⋮
% git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads
master <- origin/master
pu <- origin/pu

git for-each-refเรียนรู้%(upstream)เครื่องหมายในGit 1.6.3 ด้วย Git เวอร์ชันก่อนหน้าคุณจะต้องดึงข้อมูลการติดตามด้วยgit config branch.<name>.remoteและgit config branch.<name>.merge(อาจใช้git for-each-refเพื่อสร้างคำสั่งสำหรับชื่อสาขาท้องถิ่นแต่ละรายการ)


เอาท์พุทคำตอบของคุณมากขึ้นสั้นและง่ายต่อการปฏิบัติตามเพื่อให้คุณได้รับการโหวตขึ้น :)
CubanX

เพื่อทำให้รวบรัดน้อยลง แต่ให้วิธีที่ดีในการตรวจสอบด้วยสายตาว่าชื่อระยะไกลเหมือนกับชื่อสาขาในท้องถิ่น gitcha ทั่วไป: ใน bashgit for-each-ref --format=$'\n'' '' '' '' '' '' ''/%(refname:short);%(upstream:short)' refs/heads | tr ';' $'\n'
hobs

19

สำหรับสาขาใดสาขาหนึ่งคุณสามารถใช้git rev-parseกับ@{u}หรือ@{upstream}ต่อท้ายชื่อสาขาเช่น:

$  git rev-parse --symbolic-full-name master@{u}
refs/remotes/github-mhl/master

... หรือสำหรับแบบย่อให้เพิ่ม --abbrev-ref

$ git rev-parse --symbolic-full-name --abbrev-ref master@{u}
github-mhl/master

โดยทั่วไปคุณสามารถใช้branch@{upstream}ไวยากรณ์ได้ทุกที่ที่คาดว่าจะกระทำ


1
+1 คำตอบของคุณให้สิ่งที่ฉันต้องการ: git rev-parse --symbolic-full-name HEADกับgit rev-parse --symbolic-full-name HEAD@{u}ขอบคุณ!
Tino

10

ฉันใช้เชลล์สคริปต์ต่อไปนี้ (ชื่อgit-tracks) เพื่อแสดงสาขาระยะไกลที่ถูกติดตามโดยสาขาปัจจุบัน:

#!/bin/sh -e
branch=$(git symbolic-ref HEAD)
branch=${branch##refs/heads/}
remote=$(git config "branch.${branch}.remote")
remoteBranch=$(git config "branch.${branch}.merge")
remoteBranch=${remoteBranch##refs/heads/}

echo "${remote:?}/${remoteBranch:?}"

สิ่งนี้สามารถใช้ที่กล่าวถึงgit for-each-refแต่ฉันพบว่าการเข้าถึงโดยตรงค่อนข้างง่ายกว่าการกรองเอาท์พุทสำหรับสาขาปัจจุบัน


คุณอาจพิจารณาใช้ "set -e" ที่ด้านบนของสคริปต์ ที่จะช่วยให้คุณลบอินสแตนซ์ทั้งหมดของ "|| exit $?" ในขณะที่การรักษาพฤติกรรมที่ล้มเหลวในช่วงต้นเดียวกัน
John Whitley

@JohnWhitley: ขอบคุณฉันได้แก้ไขคำตอบแล้ว ฉันรู้เกี่ยวกับset -eแต่มักจะยึดติดกับการตรวจสอบที่ชัดเจน แต่ในกรณีนี้มันดีกว่าจริงๆ
Ingo Karkat

git version 1.9.4ไม่ทำงานสำหรับฉันใน Echos ไม่มีอะไร :(
Ain

8

.git/config ไฟล์ยังจะให้ข้อมูลสาขาการติดตามเป็น

[remote "Hub"]
    url = ssh://xxxx/tmp/Hub
    fetch = +refs/heads/*:refs/remotes/Hub/*
[branch "develop"]
    remote = Hub
    merge = refs/heads/develop
[branch "Dev1"]
    remote = Test
    merge = refs/heads/Dev1
[remote "Test"]
    url = ssh://xxxx/tmp/gittesting/Dev1GIT
    fetch = +refs/heads/*:refs/remotes/Test/*

5
git branch -vv

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


2

เพิ่มอักษรรูนเหล่านี้ใน[alias]ส่วนของไฟล์. gitconfig ของคุณ:

show-tracking = !sh -c 'git ls-remote . |grep `git log -1 --grep="git-svn-id" --format=%H`|perl -pe "s/[[:alnum:]]+[[:space:]]//"'

0

ฉันต้องการค้นหาสาขาระยะไกลที่สอดคล้องกัน (ถ้ามี) สำหรับแต่ละสาขาท้องถิ่นภายในลูปที่ทำหน้าที่ในรายการของสาขาท้องถิ่น ฉันลงเอยด้วยการใช้สิ่งต่อไปนี้:

git for-each-ref --format='%(refname:short):%(upstream:short)' refs/heads | grep "^LocalBranchName:.*/" | sed "s/^LocalBranchName://"

สิ่งนี้จะไม่แสดงผลใด ๆ (สตริงว่าง) สำหรับสาขาท้องถิ่นที่ไม่มีสาขาระยะไกลที่สอดคล้องกัน ("someremote / somebranch")


-1

ลองgit branch ด้วยตัวเลือก :

 -r
List or delete (if used with -d) the remote-tracking branches. 

-a
List both remote-tracking branches and local branches. 

.git/configมิฉะนั้นการตรวจสอบของคุณ


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