ค้นหาสาขาระยะไกลที่สาขาท้องถิ่นกำลังติดตาม


842

ดูเพิ่มเติม:
ฉันจะดูได้อย่างไรว่าสาขา Git ใดกำลังติดตามสาขาระยะไกล / ต้นน้ำ

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

ฉันต้องแยกวิเคราะห์git configเอาต์พุตหรือมีคำสั่งที่จะทำสิ่งนี้ให้ฉันได้หรือไม่?


18
Sheesh นี่ไม่ใช่สิ่งที่ซ้ำกันแน่นอน นี้เป็นส่วนหนึ่งของที่อื่น ๆ แต่มีวิธีการอื่น ๆ git remote show originที่จะทำออกมาคำถามเช่น คำตอบหลักในคำถามอื่นคือสคริปต์ทุบตีพันคำตอบง่ายๆที่นี่ซึ่งอาจมีประโยชน์สำหรับบางคน หวังว่าคำถามนี้จะไม่ปิดอย่างสมบูรณ์
cdunn2001

5
เห็นด้วยอย่างนี้ไม่ควรเป็นคนหลอกลวง มันกำลังถามอะไรบางอย่างที่แตกต่างไปจากคำถามที่ถูกเชื่อมโยงอย่างสมบูรณ์
Adam Batkin

คำตอบ:


1002

นี่คือคำสั่งที่ให้การติดตามสาขาทั้งหมด (กำหนดค่าสำหรับ 'ดึง') ดู:

$ git branch -vv
  main   aaf02f0 [main/master: ahead 25] Some other commit
* master add0a03 [jdsumsion/master] Some commit

คุณต้องลุยผ่าน SHA และข้อความผูกมัดที่มีความยาว แต่มันรวดเร็วในการพิมพ์และฉันได้รับการติดตามสาขาในแนวตั้งในคอลัมน์ที่ 3

หากท่านต้องการข้อมูลทั้ง 'ดึง' และ 'ดัน' การกำหนดค่าต่อสาขาดูคำตอบอื่น ๆ git remote show originบน


ปรับปรุง

เริ่มต้นใน git เวอร์ชั่น 1.8.5 คุณสามารถแสดง upstream branch ด้วยgit statusและgit status -sb


6
ผลลัพธ์นี้โดยตรงมากกว่าgit branch -avหรือgit remote show originให้ข้อมูลมากมายแก่คุณไม่ใช่แค่เพียงรีโมทที่ติดตาม
SimplGy

60
BTW เวอร์ชันล่าสุดของ git (1.8.5.x) จะแสดงสาขาต้นน้ำในระหว่างgit statusและgit status -sbเมื่อคุณอัปเกรดเป็น 1.8.5.x คำถามนี้ (และคำตอบ) ไม่เกี่ยวข้อง
jdsumsion

11
ในขณะนี้ให้ข้อมูลที่คุณต้องการฉันจะไม่เห็นด้วยเพราะมันเป็นคำตอบที่ถูกต้อง มันเป็นคำตอบในลักษณะเดียวกับที่ให้พจนานุกรมกับใครบางคนตอบ "คุณสะกด XYZ อย่างไร" ในกรณีที่คุณต้องการใช้คำตอบผล (ชื่อสาขา) สำหรับการดำเนินการบางอย่าง .. คำตอบนี้จะช่วยให้ฉันเห็นภาพ ... ไม่ให้สิ่งที่ใช้งานได้ในคำสั่งที่ตามมา
UpAndAdam

เอาต์พุตของคำสั่งนี้อาจทำให้เข้าใจผิดเนื่องจากข้อความคอมมิตอาจเริ่มต้นได้ง่ายเช่น "[คุณสมบัติของฉัน] ... " โปรดดูคำตอบของ @ cdunn2001 ที่แสดงเฉพาะสาขาต้นน้ำ (ถ้ามี) และไม่มีอะไรอื่น
Jonas Berlin

1
ฉันเห็นด้วยกับ @ jonas-berlin - คำตอบของ cdunn2001 จะดีกว่าถ้าคุณต้องการแยกผลลัพธ์ - คำตอบของฉันดีถ้าคุณกำลังมองหาคำสั่งง่าย ๆ และเต็มใจที่จะสแกนเอาต์พุต
jdsumsion

372

สองทางเลือก:

% git rev-parse --abbrev-ref --symbolic-full-name @{u}
origin/mainline

หรือ

% git for-each-ref --format='%(upstream:short)' "$(git symbolic-ref -q HEAD)"
origin/mainline

12
ดี! ข้อแรกให้ข้อผิดพลาดที่น่าเกลียดในกรณีที่ไม่มีการติดตามในขณะที่ข้อที่สองมีประโยชน์อย่างยิ่งสำหรับการเขียนสคริปต์ BTW เป็นชื่อของได้รับเตะปัจจุบันภายใน%(refname:short) --format
Tino

9
git help revisions(หนึ่งที่รู้จักกันน้อย แต่มีประโยชน์มากที่สุดส่วนของเอกสาร) upstreamและค้นหา
cdunn2001

15
คำตอบนี้ดีกว่าคำตอบทั้งสองข้างต้นโดยเฉพาะถ้าคุณต้องการทำอะไรเช่นgit diff `git rev-parse --abbrev-ref --symbolic-full-name @{upstream}`
เจียน

2
มันมีประโยชน์จริงๆecho 'git for-each-ref --format=\'%(refname:short) -> %(upstream:short)\' refs/heads/$1' > ~/bin/git-show-upstream; chmod +x ~/bin/git-show-upstream
อัลฟาน

6
หากคุณต้องการค้นหาgit for-each-ref --format='%(upstream:short)' $(git rev-parse --symbolic-full-name SOMEBRANCH)อัพสตรีมสำหรับสาขาอื่น ๆ ตัวเลือกที่สองคือ: แทนที่ SOMEBRANCH ด้วยชื่อสาขาหรือ "HEAD" สำหรับสาขาปัจจุบัน
Jonas Berlin

220

ฉันคิดว่าgit branch -avเพียงบอกคุณว่าสาขาที่คุณมีและที่พวกเขากระทำที่ทำให้คุณอนุมานว่าสาขาระยะไกลสาขาท้องถิ่นมีการติดตาม

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

$ git branch -av
* abranch                d875bf4 initial commit
  master                 d875bf4 initial commit
  remotes/origin/HEAD    -> origin/master
  remotes/origin/abranch d875bf4 initial commit
  remotes/origin/master  d875bf4 initial commit

กับ

$ git remote show origin
* remote origin
  Fetch URL: /home/ageorge/tmp/d/../exrepo/
  Push  URL: /home/ageorge/tmp/d/../exrepo/
  HEAD branch (remote HEAD is ambiguous, may be one of the following):
    abranch
    master
  Remote branches:
    abranch tracked
    master  tracked
  Local branches configured for 'git pull':
    abranch merges with remote abranch
    master  merges with remote master
  Local refs configured for 'git push':
    abranch pushes to abranch (up to date)
    master  pushes to master  (up to date)

3
ฉันต้องการคำสั่งที่ค้นพบสาขาต้นน้ำดังนั้นการใช้ 'ต้นกำเนิด' ในขณะที่อินพุตกำลังทำการสันนิษฐานดังนั้นสิ่งนี้ไม่ได้ผลสำหรับฉัน
Alexander Mills

1
แต่นี่ตอบ OP คำสั่งgit remote show originจะแสดงสาขาท้องถิ่นและสิ่งที่พวกเขาติดตามทั้งการผลักและดึง
dudewad

1
@dewewad ฉันคิดว่าประเด็นก็คือว่าคำสั่งนี้จะถือว่าระยะไกลถูกเรียกว่าoriginในขณะที่มันอาจเป็นอะไรก็ได้จริง ๆ (เช่นหลายรีโมทด้วยสาขาที่แตกต่างกันติดตามสาขาจากรีโมทที่แตกต่างกัน)
Ruslan

74

อัปเดต:ก็เป็นเวลาหลายปีแล้วที่ฉันโพสต์สิ่งนี้! สำหรับวัตถุประสงค์เฉพาะของฉันในการเปรียบเทียบ HEAD กับอัปสตรีมตอนนี้ฉันใช้@{u}ซึ่งเป็นช็อตคัตที่อ้างถึง HEAD ของสาขาการติดตามต้นน้ำ (ดูhttps://git-scm.com/docs/gitrevisions#gitrevisions-emltbranchnamegtupstreamemegemmasterupstreamememuem )

คำตอบเดิม:ฉันได้พบกับปัญหานี้เช่นกัน ฉันมักจะใช้รีโมทหลายอันในที่เก็บเดียวและมันง่ายที่จะลืมว่าสาขาไหนที่สาขาปัจจุบันของคุณกำลังติดตามอยู่ และบางครั้งก็มีประโยชน์ที่จะทราบเช่นเมื่อคุณต้องการดูการกระทำในท้องถิ่นของคุณผ่านgit log remotename/branchname..HEADและบางครั้งก็มีประโยชน์ที่จะรู้ว่าเช่นเมื่อคุณต้องการที่จะดูที่กระทำในท้องถิ่นของคุณผ่านทาง

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

LOCAL_BRANCH=`git name-rev --name-only HEAD`
TRACKING_BRANCH=`git config branch.$LOCAL_BRANCH.merge`
TRACKING_REMOTE=`git config branch.$LOCAL_BRANCH.remote`
REMOTE_URL=`git config remote.$TRACKING_REMOTE.url`

ในกรณีของฉันเนื่องจากฉันสนใจค้นหาชื่อของรีโมทปัจจุบันเท่านั้นฉันจึงทำสิ่งนี้:

git config branch.`git name-rev --name-only HEAD`.remote

2
นี่เป็นประโยชน์อย่างมากในการสร้างนามแฝงเพื่อรีบูทสิ่งที่สาขาปัจจุบันของฉัน ขอบคุณ!
Justin Spahr-Summers

ในทำนองเดียวกันก็มีประโยชน์สำหรับนามแฝง 'ไปข้างหน้า' ของเราซึ่งจะทำให้สาขาการติดตามท้องถิ่นไปยังรีโมตเป็นระยะไกลตราบใดที่การดำเนินการเป็นไปอย่างรวดเร็ว
Altreus

4
จริง ๆ แล้วฉันค้นพบสิ่งนี้git name-rev --name-only HEADจะไม่บอกคุณว่าสาขาที่คุณอยู่จริง สำหรับสิ่งที่ฉันเพิ่งใช้git branch | grep '^\*' | cut -d' ' -f2
Altreus

1
ขอบคุณ! คำตอบอื่น ๆ สำหรับคำถามที่คล้ายกันไม่ได้กล่าวถึง@{u}นามแฝง / ทางลัดและนั่นคือสิ่งที่ฉันกำลังมองหา! ไม่มีเหตุผลที่จะเปรียบเทียบกับสาขาหลักหากคุณต้องการตรวจสอบว่าคุณต้องการดึงหรือไม่
Dan M.

1
@{u}คือระเบิด และมีมาตั้งแต่ 1.7.0 ซึ่งหมายความว่าหากไม่มีใน git ที่มีคนใช้ในปี 2018 อาจเป็นเพราะมีการอัพเกรด
Chris Cleeland

48

สาขาท้องถิ่นและรีโมทของพวกเขา

git branch -vv 

ทุกสาขาและติดตามระยะไกล

git branch -a -vv

ดูว่าสาขาในประเทศมีการกำหนดค่าอย่างชัดเจนสำหรับการกดและดึง

git remote show {remote_name}

21

นี่จะแสดงให้คุณเห็นสาขาที่คุณอยู่:

$ git branch -vv

สิ่งนี้จะแสดงเฉพาะสาขาปัจจุบันที่คุณอยู่:

$ git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)

ตัวอย่างเช่น:

myremote/mybranch

คุณสามารถค้นหา URL ของรีโมตที่ใช้โดยสาขาปัจจุบันที่คุณเปิดด้วย:

$ git remote get-url $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)|cut -d/ -f1)

ตัวอย่างเช่น:

https://github.com/someone/somerepo.git

19

คุณสามารถใช้git checkoutเช่น "ตรวจสอบสาขาปัจจุบัน" นี่คือไม่มีการ op ด้วยผลข้างเคียงเพื่อแสดงข้อมูลการติดตามถ้ามีสำหรับสาขาปัจจุบัน

$ git checkout 
Your branch is up-to-date with 'origin/master'.

17

ฉันไม่รู้ว่านี่นับเป็นการแยกวิเคราะห์ผลลัพธ์ของการกำหนดค่า git หรือไม่ แต่สิ่งนี้จะกำหนด URL ของรีโมตที่ต้นแบบกำลังติดตาม:

$ git config ระยะไกล $ (git config branch.master.remote). url

หรือgit config branch.$(git symbolic-ref -q HEAD).remoteถ้าคุณต้องการชื่อของรีโมตที่ถูกติดตามของสาขาปัจจุบัน -git config remote.$(git config branch.$(git symbolic-ref -q HEAD).remote).urlสำหรับ URL
Anakhand

ฉันจำเป็นต้องเพิ่ม--shortตัวเลือกเพื่อใช้งานได้ ดังนั้นสำหรับรับชื่อรีโมตของสาขาปัจจุบัน: git config branch.$(git symbolic-ref -q --short HEAD).remoteและสำหรับรับ URL ของรีโมตสาขาปัจจุบัน:git config remote.$(git config branch.$(git symbolic-ref -q --short HEAD).remote).url
Nelson

13

อีกวิธีหนึ่ง

git status -b --porcelain

สิ่งนี้จะทำให้คุณ

## BRANCH(...REMOTE)
modified and untracked files

10

อีกวิธีที่ง่ายคือการใช้

cat .git/config ใน repo คอมไพล์

รายการนี้จะแสดงรายละเอียดสำหรับสาขาท้องถิ่น


ทำงานได้ดีบน Linux จะไม่ทำงานบน Windows ยกเว้นในพรอมต์คล้าย Unix (เช่น cygwin หรือ git bash)
Contango

ใน Windows เพียงแค่ใช้type .git/configแทนcat .git/configของหลักสูตรในบรรทัดคำสั่งธรรมดา ..
khmarbaise

9

อีกวิธีหนึ่ง (ขอบคุณ osse) ถ้าคุณต้องการที่จะรู้ว่ามันมีอยู่หรือไม่:

if git rev-parse @{u} > /dev/null 2>&1
then
  printf "has an upstream\n"
else
  printf "has no upstream\n"
fi

ภาษาอะไร? ดูเหมือนว่าเชลล์สคริปต์ Linux แต่ไม่ได้ให้ข้อมูลหรือบริบทใด ๆ
Suncat2000

8

git branch -vv | grep 'BRANCH_NAME'

git branch -vv : ส่วนนี้จะแสดงสาขาในประเทศทั้งหมดพร้อมกับสาขาต้นน้ำ

grep 'BRANCH_NAME' : มันจะกรองสาขาปัจจุบันจากรายการสาขา



5

รายชื่อสาขาในประเทศและระยะไกล:

$ git branch -ra

เอาท์พุท:

  feature/feature1
  feature/feature2
  hotfix/hotfix1
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/master

3

git-status Porcelain (เอาต์พุตที่เครื่องอ่านได้) v2 มีลักษณะดังนี้:

$ git status -b --porcelain=v2
# branch.oid d0de00da833720abb1cefe7356493d773140b460
# branch.head the-branch-name
# branch.upstream gitlab/the-branch-name
# branch.ab +2 -2

และเพื่อให้ได้สาขาต้นน้ำเท่านั้น:

$ git status -b --porcelain=v2 | grep -m 1 "^# branch.upstream " | cut -d " " -f 3-
gitlab/the-branch-name

หากสาขาไม่มีต้นน้ำคำสั่งด้านบนจะสร้างเอาต์พุตว่าง (หรือล้มเหลวด้วยset -o pipefail)


2

หากคุณต้องการค้นหาอัพสตรีมสำหรับสาขาใด ๆ (ตรงข้ามกับสาขาที่คุณอยู่) นี่คือการแก้ไขเล็กน้อยสำหรับคำตอบของ @ cdunn2001:

git rev-parse --abbrev-ref --symbolic-full-name YOUR_LOCAL_BRANCH_NAME@{upstream}

YOUR_LOCAL_BRANCH_NAMEที่จะให้คุณชื่อสาขาที่ห่างไกลสำหรับสาขาในประเทศที่มีชื่อ


2

คุณสามารถลองสิ่งนี้:

git remote show origin | grep "branch_name"

branch_name จะต้องถูกแทนที่ด้วยสาขาของคุณ


จะเกิดอะไรขึ้นถ้าชื่อสาขาของคุณตรงกับสาขาอื่นด้วย จะเกิดอะไรขึ้นชื่อสาขาของคุณตรงกับข้อความอื่น ๆ บางอย่างในการส่งออกของgit remote show origin- ถ้ามันเรียกว่าmergesหรือconfigure?
Tom Swirly

ไม่ได้รับคุณ คุณหมายถึงหลายสาขาที่มีชื่อเดียวกัน
xpioneer

1

ฉันใช้นามแฝงนี้

git config --global alias.track '!sh -c "
if [ \$# -eq 2 ]
 then
   echo \"Setting tracking for branch \" \$1 \" -> \" \$2;
   git branch --set-upstream \$1 \$2;
 else
   git for-each-ref --format=\"local: %(refname:short) <--sync--> remote: %(upstream:short)\" refs/heads && echo --URLs && git remote -v;
fi  
" -'

แล้วก็

git track

โปรดทราบว่าสคริปต์ยังสามารถใช้เพื่อตั้งค่าการติดตาม

นามแฝงที่ยอดเยี่ยมเพิ่มเติมได้ที่https://github.com/orefalo/bash-profiles


0

ฉันใช้EasyGit (aka "eg")เป็น wrapper ที่มีน้ำหนักเบามากด้านบนของ Git (หรือด้านข้าง) Git EasyGit มีคำสั่งย่อย "info" ที่ให้ข้อมูลที่มีประโยชน์ทุกประเภทรวมถึงสาขาการติดตามระยะไกลสาขาปัจจุบัน นี่คือตัวอย่าง (ที่ชื่อสาขาปัจจุบันคือ "foo"):

pknotz @ s883422: (foo) ~ / พื้นที่ทำงาน / bd
$ เช่นข้อมูล
ความมุ่งมั่นทั้งหมด: 175
ที่เก็บในเครื่อง: .git
ที่เก็บข้อมูลระยะไกลที่ตั้งชื่อ: (ชื่อ -> ตำแหน่ง)
  แหล่งกำเนิด -> git: //sahp7577/home/pknotz/bd.git
สาขาปัจจุบัน: ฟู
  การตรวจสอบการเข้ารหัสลับ (sha1sum): bd248d1de7d759eb48e8b5ff3bfb3bb0eca4c5bf
  ที่เก็บแบบดึง / ดันเริ่มต้น: จุดเริ่มต้น
  ตัวเลือกดึง / ดันเริ่มต้น:
    branch.foo.remote = ที่มา
    branch.foo.merge = refs / heads / aal_devel_1
  จำนวนผู้มีส่วนร่วม: 3
  จำนวนไฟล์: 28
  จำนวนไดเรกทอรี: 20
  ขนาดไฟล์ใหญ่ที่สุดหน่วยเป็นไบต์: 32473 (pygooglechart-0.2.0 / COPYING)
  ข้อผูกพัน: 62

0

การปรับปรุงคำตอบนี้ทำให้ฉันมี.gitconfigนามแฝงเหล่านี้:

branch-name = "symbolic-ref --short HEAD"
branch-remote-fetch = !"branch=$(git branch-name) && git config branch.\"$branch\".remote || echo origin #"
branch-remote-push  = !"branch=$(git branch-name) && git config branch.\"$branch\".pushRemote || git config remote.pushDefault || git branch-remote-fetch #"
branch-url-fetch = !"remote=$(git branch-remote-fetch) && git remote get-url        \"$remote\" #"  # cognizant of insteadOf
branch-url-push  = !"remote=$(git branch-remote-push ) && git remote get-url --push \"$remote\" #"  # cognizant of pushInsteadOf

ภาษาไหน
Daniel Farrell

3
@Dan Farrell: เชลล์ ชื่อแทนเริ่มต้นด้วย! ใช้ / bin / sh เครื่องหมายคำพูดคู่ถูกยกมาสำหรับไฟล์ปรับแต่งของ git
Tom Hale

0

หากคุณใช้ Gradle

def gitHash = new ByteArrayOutputStream()
    project.exec {
        commandLine 'git', 'rev-parse', '--short', 'HEAD'
        standardOutput = gitHash
    }

def gitBranch = new ByteArrayOutputStream()
    project.exec {
        def gitCmd = "git symbolic-ref --short -q HEAD || git branch -rq --contains "+getGitHash()+" | sed -e '2,\$d'  -e 's/\\(.*\\)\\/\\(.*\\)\$/\\2/' || echo 'master'"
        commandLine "bash", "-c", "${gitCmd}"
        standardOutput = gitBranch
    }

-2

คำสั่งดังต่อไปนี้จะกำเนิดส้อมปัจจุบันระยะไกลมีการอ้างอิงถึง

git ระยะไกล

สำหรับการเพิ่มเส้นทางระยะไกล

คอมไพล์ต้นกำเนิดเพิ่มชื่อเส้นทาง path_name


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