ดูเพิ่มเติม:
ฉันจะดูได้อย่างไรว่าสาขา Git ใดกำลังติดตามสาขาระยะไกล / ต้นน้ำ
ฉันจะทราบได้อย่างไรว่าสาขาในพื้นที่ห่างไกลสาขาใดที่ติดตามอยู่
ฉันต้องแยกวิเคราะห์git config
เอาต์พุตหรือมีคำสั่งที่จะทำสิ่งนี้ให้ฉันได้หรือไม่?
ดูเพิ่มเติม:
ฉันจะดูได้อย่างไรว่าสาขา Git ใดกำลังติดตามสาขาระยะไกล / ต้นน้ำ
ฉันจะทราบได้อย่างไรว่าสาขาในพื้นที่ห่างไกลสาขาใดที่ติดตามอยู่
ฉันต้องแยกวิเคราะห์git config
เอาต์พุตหรือมีคำสั่งที่จะทำสิ่งนี้ให้ฉันได้หรือไม่?
คำตอบ:
นี่คือคำสั่งที่ให้การติดตามสาขาทั้งหมด (กำหนดค่าสำหรับ 'ดึง') ดู:
$ 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
git branch -av
หรือgit remote show origin
ให้ข้อมูลมากมายแก่คุณไม่ใช่แค่เพียงรีโมทที่ติดตาม
git status
และgit status -sb
เมื่อคุณอัปเกรดเป็น 1.8.5.x คำถามนี้ (และคำตอบ) ไม่เกี่ยวข้อง
สองทางเลือก:
% 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
%(refname:short)
--format
git help revisions
(หนึ่งที่รู้จักกันน้อย แต่มีประโยชน์มากที่สุดส่วนของเอกสาร) upstream
และค้นหา
git diff `git rev-parse --abbrev-ref --symbolic-full-name @{upstream}`
echo 'git for-each-ref --format=\'%(refname:short) -> %(upstream:short)\' refs/heads/$1' > ~/bin/git-show-upstream; chmod +x ~/bin/git-show-upstream
git for-each-ref --format='%(upstream:short)' $(git rev-parse --symbolic-full-name SOMEBRANCH)
อัพสตรีมสำหรับสาขาอื่น ๆ ตัวเลือกที่สองคือ: แทนที่ SOMEBRANCH ด้วยชื่อสาขาหรือ "HEAD" สำหรับสาขาปัจจุบัน
ฉันคิดว่า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)
git remote show origin
จะแสดงสาขาท้องถิ่นและสิ่งที่พวกเขาติดตามทั้งการผลักและดึง
origin
ในขณะที่มันอาจเป็นอะไรก็ได้จริง ๆ (เช่นหลายรีโมทด้วยสาขาที่แตกต่างกันติดตามสาขาจากรีโมทที่แตกต่างกัน)
อัปเดต:ก็เป็นเวลาหลายปีแล้วที่ฉันโพสต์สิ่งนี้! สำหรับวัตถุประสงค์เฉพาะของฉันในการเปรียบเทียบ 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
git name-rev --name-only HEAD
จะไม่บอกคุณว่าสาขาที่คุณอยู่จริง สำหรับสิ่งที่ฉันเพิ่งใช้git branch | grep '^\*' | cut -d' ' -f2
@{u}
นามแฝง / ทางลัดและนั่นคือสิ่งที่ฉันกำลังมองหา! ไม่มีเหตุผลที่จะเปรียบเทียบกับสาขาหลักหากคุณต้องการตรวจสอบว่าคุณต้องการดึงหรือไม่
@{u}
คือระเบิด และมีมาตั้งแต่ 1.7.0 ซึ่งหมายความว่าหากไม่มีใน git ที่มีคนใช้ในปี 2018 อาจเป็นเพราะมีการอัพเกรด
สาขาท้องถิ่นและรีโมทของพวกเขา
git branch -vv
ทุกสาขาและติดตามระยะไกล
git branch -a -vv
ดูว่าสาขาในประเทศมีการกำหนดค่าอย่างชัดเจนสำหรับการกดและดึง
git remote show {remote_name}
นี่จะแสดงให้คุณเห็นสาขาที่คุณอยู่:
$ 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
คุณสามารถใช้git checkout
เช่น "ตรวจสอบสาขาปัจจุบัน" นี่คือไม่มีการ op ด้วยผลข้างเคียงเพื่อแสดงข้อมูลการติดตามถ้ามีสำหรับสาขาปัจจุบัน
$ git checkout
Your branch is up-to-date with 'origin/master'.
ฉันไม่รู้ว่านี่นับเป็นการแยกวิเคราะห์ผลลัพธ์ของการกำหนดค่า 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
--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
อีกวิธีหนึ่ง
git status -b --porcelain
สิ่งนี้จะทำให้คุณ
## BRANCH(...REMOTE)
modified and untracked files
อีกวิธีที่ง่ายคือการใช้
cat .git/config
ใน repo คอมไพล์
รายการนี้จะแสดงรายละเอียดสำหรับสาขาท้องถิ่น
type .git/config
แทนcat .git/config
ของหลักสูตรในบรรทัดคำสั่งธรรมดา ..
อีกวิธีหนึ่ง (ขอบคุณ osse) ถ้าคุณต้องการที่จะรู้ว่ามันมีอยู่หรือไม่:
if git rev-parse @{u} > /dev/null 2>&1
then
printf "has an upstream\n"
else
printf "has no upstream\n"
fi
git branch -vv | grep 'BRANCH_NAME'
git branch -vv
: ส่วนนี้จะแสดงสาขาในประเทศทั้งหมดพร้อมกับสาขาต้นน้ำ
grep 'BRANCH_NAME'
: มันจะกรองสาขาปัจจุบันจากรายการสาขา
git branch -r -vv
จะแสดงรายการทุกสาขารวมถึงรีโมต
รายชื่อสาขาในประเทศและระยะไกล:
$ git branch -ra
เอาท์พุท:
feature/feature1
feature/feature2
hotfix/hotfix1
* master
remotes/origin/HEAD -> origin/master
remotes/origin/develop
remotes/origin/master
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
)
หากคุณต้องการค้นหาอัพสตรีมสำหรับสาขาใด ๆ (ตรงข้ามกับสาขาที่คุณอยู่) นี่คือการแก้ไขเล็กน้อยสำหรับคำตอบของ @ cdunn2001:
git rev-parse --abbrev-ref --symbolic-full-name YOUR_LOCAL_BRANCH_NAME@{upstream}
YOUR_LOCAL_BRANCH_NAME
ที่จะให้คุณชื่อสาขาที่ห่างไกลสำหรับสาขาในประเทศที่มีชื่อ
คุณสามารถลองสิ่งนี้:
git remote show origin | grep "branch_name"
branch_name
จะต้องถูกแทนที่ด้วยสาขาของคุณ
git remote show origin
- ถ้ามันเรียกว่าmerges
หรือconfigure
?
ฉันใช้นามแฝงนี้
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
ฉันใช้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
การปรับปรุงคำตอบนี้ทำให้ฉันมี.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
หากคุณใช้ 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
}
คำสั่งดังต่อไปนี้จะกำเนิดส้อมปัจจุบันระยะไกลมีการอ้างอิงถึง
git ระยะไกล
สำหรับการเพิ่มเส้นทางระยะไกล
คอมไพล์ต้นกำเนิดเพิ่มชื่อเส้นทาง path_name
git remote show origin
ที่จะทำออกมาคำถามเช่น คำตอบหลักในคำถามอื่นคือสคริปต์ทุบตีพันคำตอบง่ายๆที่นี่ซึ่งอาจมีประโยชน์สำหรับบางคน หวังว่าคำถามนี้จะไม่ปิดอย่างสมบูรณ์