แสดงเฉพาะสาขาปัจจุบันใน Git


356

ฉันพยายามหาคำสั่ง Git พิเศษสำหรับสิ่งนี้ แต่หาไม่พบ สั้นกว่าหรือเร็วกว่านี้อีกหรือไม่?

git branch | awk '/\*/ { print $2; }'

1
ฉันคิดว่านี่เป็น fastes ทางเป็นไปได้ที่จะได้รับในปัจจุบันสาขา
Eimantas

2
เป็นไปได้ที่ซ้ำกันของวิธีรับชื่อสาขาปัจจุบันใน Git?
Chandrayya GK

@ChandrayyaGK: ไม่เพราะคำถามอื่นเกี่ยวกับการทำจากภายใน IDE ของคุณ (คำตอบหลายคำตอบสำหรับการใช้งานบรรทัดคำสั่งดังนั้นมันจึงคุ้มค่าที่จะดู แต่มันไม่ใช่การทำสำเนาที่ถูกต้องและบางทีคำตอบเหล่านั้นควรจะถูกย้ายที่นี่แทนหากมีสิ่งใดที่เพิ่มคุณค่าที่สำคัญให้กับสิ่งที่มีอยู่แล้ว)
tripleee

3
@Torek - นี่เป็นงานง่าย ๆ อีกอย่างที่ Git ทำได้ยาก
jww

คำตอบที่ดีที่สุดของลิงค์ @ChandrayyaGK ที่โพสต์ช้ากว่านี้มาก!
Colm Bhandal

คำตอบ:


660
$ git rev-parse --abbrev-ref HEAD
master

สิ่งนี้ควรใช้กับ Git 1.6.3 หรือใหม่กว่า


ไม่ได้ผลกับฉันด้วย git-1.6.2.5 คอมไพล์ Rev-แจง HEAD --abbrev-เตะ => --abbrev-เตะ 311172491a9a667f9321bdf1c4fe5e22cc6e2c08 (เช่น Rev-แจงไม่ยอมรับ --abbrev-เตะ (ไม่ได้อยู่ในหน้าคนใด))
JasonWoof

1
JasonWoof ทำงานสำหรับฉันใน 1.6.4.2, จำเป็นที่จะต้องเปลี่ยนแปลงเพื่อดูว่าเมื่อมันเกิดขึ้นได้ ;-)
ไมเคิล Krelin - แฮ็กเกอร์

7
เท่าที่ฉันสามารถบอกได้จากบันทึกของ Git คุณลักษณะนี้ได้ถูกรวมเข้าด้วยกันในปี 2009-04-20 และเผยแพร่ในรุ่น 1.6.3
เอิร์ล

1
ฉันก็อยากจะเข้าใจเช่นกัน มันใช้งานได้จริงอย่างไร? นอกจากนี้ดูเหมือนว่า --abbrev-ref จะไม่ส่งคืนสิ่งใดสำหรับการโต้แย้งอื่น ๆ มันอาจเป็นไปไม่ได้ที่จะมี HEAD เป็นข้อโต้แย้ง
Setafire

6
โปรดทราบว่าหากคุณอยู่ในการอ้างอิงสัญลักษณ์เดี่ยว (อาจหมายถึงคุณอยู่ในสาขา แต่ทำเครื่องหมายการกระทำก่อนหน้านี้) คำสั่งนี้จะกลับมาHEADไม่คาดหวังmaster
unifreak

129

ใน Git 1.8.1 คุณสามารถใช้คำสั่งgit symbolic-refกับตัวเลือก "--short":

$ git symbolic-ref HEAD
refs/heads/develop
$ git symbolic-ref --short HEAD
develop

ขอบคุณ สร้างนามแฝงแล้ว
Michael Burr

7
ดีกว่าคำตอบที่ยอมรับ IMO เพราะมันใช้ได้กับ repos ที่ไม่มีข้อผูกมัด
Jerome Dalbert

2
รับข้อผิดพลาดfatal: ref HEAD is not a symbolic refเมื่อรันสิ่งนี้เป็นส่วนหนึ่งของ TravisCI build
kmanzana

ดูเหมือนจะไม่ทำงานใน GIT 1.9.1 `` `รุ่น git 1.9.1 ถึงแก่ชีวิต: การอ้างอิง HEAD ไม่ใช่การอ้างอิงเชิงสัญลักษณ์` `
Richard

ทำงานได้สำหรับฉัน: git เวอร์ชั่น 2.16.2.windows.1
Tagc

59

ด้วย Git 2.22 (Q2 2019) git branch --show-currentคุณจะมีวิธีการที่เรียบง่าย:

ดูกระทำ 0ecb1fc (25 ตุลาคม 2018) โดยแดเนียลส์ Umanovskis (umanovskis )
(ผสานโดยJunio ​​C Hamano - gitster- in 3710f60 , 07 Mar 2019)

branch: แนะนำ--show-currentตัวเลือกการแสดงผล

เมื่อเรียกด้วย--show-current, git branchจะพิมพ์ชื่อสาขาในปัจจุบันและยุติ เฉพาะชื่อจริงได้รับการตีพิมพ์โดยไม่ต้อง
ในสถานะ HEAD ที่แยกออกไม่มีอะไรที่เป็นผลลัพธ์refs/heads

มีไว้สำหรับการเขียนสคริปต์และการใช้งานแบบโต้ตอบ / ให้ข้อมูล
ซึ่งแตกต่างจากgit branch --listไม่มีการกรองเป็นสิ่งจำเป็นที่จะเพียงแค่ได้รับชื่อสาขา


15
ในที่สุดสิ่งที่ดูเหมือนว่ามันควรจะมีตั้งแต่เริ่มต้นได้รับการเพิ่ม!
dtasev

27

คุณอาจจะสนใจในผลลัพธ์ของ

git symbolic-ref HEAD

โดยเฉพาะอย่างยิ่งขึ้นอยู่กับความต้องการและเค้าโครงที่คุณอาจต้องการทำ

basename $(git symbolic-ref HEAD)

หรือ

git symbolic-ref HEAD | cut -d/ -f3-

แล้วอีกครั้งมี.git/HEADไฟล์ที่อาจเป็นที่สนใจของคุณ


2
คุณสามารถร่นไปgit rev-parse --symbolic-full-name git symbolic-ref
เอิร์ล

1
คุณไม่จำเป็นต้องใช้basenameหรือcut; ใช้BR=${BR#refs/heads/}(โดยที่ BR เป็นชื่อของตัวแปรที่คุณบันทึกผลลัพธ์ของgit symbolic-ref HEAD)
Jakub Narębski

แน่นอนว่าไม่ใช่ Jakub หากคุณมีผลลัพธ์เป็นตัวแปร
Michael Krelin แฮกเกอร์

5
สามารถทำgit symbolic-ref --short HEADยัง
Fahad Siddiqui

2
สิ่งนี้จะพังถ้าคุณมีเครื่องหมายทับในชื่อสาขา ("task / foo", "feature / bar") พวงของ buildscripts ของฉันเริ่มล้มเหลวเมื่อเพื่อนร่วมงานตัดสินใจที่ถูกทับเย็น ...
Vacri

13

จากสิ่งที่ฉันสามารถบอกได้ไม่มีวิธีใดที่จะแสดงเฉพาะสาขาปัจจุบันใน Git ดังนั้นฉันจึงใช้:

git branch | grep '*'

3
ในขณะที่ทำงานกับ GNU coreutils grep '*'เป็นนามข้อผิดพลาดทางไวยากรณ์ คุณอาจต้องการgit branch | sed -n 's/^\* //p'ต่อไป หรือจริงๆแล้วสิ่งที่ OP โพสต์ไว้ในตอนแรกซึ่งมีจำนวนเท่ากัน
tripleee

@tripleee คุณช่วยสอนฉันเกี่ยวกับสาเหตุที่grep '*'เป็นข้อผิดพลาดทางไวยากรณ์ในนาม?
JK ABC

1
@JKABC: @tripleee หมายถึงอะไรนั่น'*'คือการแสดงออกปกติและเป็นเช่นนั้นมันไม่ถูกต้อง คุณอาจต้องการใช้'[*]'(นั่นคืออักขระ*แทนตัวดำเนินการ "เป็นศูนย์หรือมากกว่านั้น")
johndodo

2
@johndodo ขอบคุณสำหรับคำชี้แจงตอนนี้มันสมเหตุสมผลสำหรับฉันแล้ว ฉันมักจะทำโดยgrep '\*'
JK ABC

2
สามารถตัดชื่อสาขาด้วยgit branch | grep "*" | cut -d' ' -f2
Fahad Siddiqui

7

ฉันเดาว่าสิ่งนี้ควรจะรวดเร็วและสามารถใช้กับ Python API ได้:

git branch --contains HEAD
* master

4
สิ่งนี้จะไม่ส่งออกสาขาปัจจุบัน มันส่งออกรายการของสาขาที่เกิดขึ้นเพื่อชี้ไปที่การกระทำมุ่งหน้าไปยัง และใช่มันสามารถทับซ้อนกัน แต่อาจนำไปสู่ความเข้าใจผิด สร้างสาขาใหม่จากตำแหน่งที่คุณอยู่และลองใหม่อีกครั้ง: สองสาขา คำถามถามว่า " แค่สาขาปัจจุบัน "
RomainValeri

4

ฉันกำลังใช้

/etc/bash_completion.d/git

มันมาพร้อมกับ Git และให้พรอมต์ด้วยชื่อสาขาและอาร์กิวเมนต์ที่สมบูรณ์


จะเปิดใช้งานพรอมต์นี้ได้อย่างไร
อเล็กซ์

ใน ubuntu $ source /etc//bash_completion.d/git-prompt ไฟล์อาจมีชื่อแตกต่างกันไปตามระบบที่ต่างกัน (หมายเหตุ: sourceคำหลักเป็นเช่นเดียวกับเพียง.(dot) ในทุบตี.)
ไมเคิล

1

นี่ไม่ใช่สั้น แต่เกี่ยวข้องกับสาขาแยกเช่นกัน:

git branch | awk -v FS=' ' '/\*/{print $NF}' | sed 's|[()]||g'

1

เพื่อความสมบูรณ์echo $(__git_ps1)บน Linux อย่างน้อยควรให้ชื่อของสาขาปัจจุบันที่ล้อมรอบด้วยวงเล็บ

นี้อาจจะเป็นประโยชน์บางสถานการณ์ที่มันไม่ได้เป็นคำสั่ง Git (ในขณะที่ขึ้นอยู่กับ Git) สะดุดตาสำหรับการตั้งค่าคำสั่งทุบตีคุณพร้อมที่จะแสดงสาขาในปัจจุบัน

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

/mnt/c/git/ConsoleApp1 (test-branch)> echo $(__git_ps1)
(test-branch)
/mnt/c/git/ConsoleApp1 (test-branch)> git checkout master
Switched to branch 'master'
/mnt/c/git/ConsoleApp1 (master)> echo $(__git_ps1)
(master)
/mnt/c/git/ConsoleApp1 (master)> cd ..
/mnt/c/git> echo $(__git_ps1)

/mnt/c/git>

รายการเป็นนามแฝงและควรมีอยู่สำหรับสคริปต์เชลล์แบบโต้ตอบ มันอาจหายไปสำหรับสคริปต์ประเภทใดก็ได้
Alexander Stohr

0

บางคนอาจพบว่า ( ) เป็นประโยชน์ สาขาปัจจุบันจะแสดงด้วยเครื่องหมาย *git show-branch --current

host-78-65-229-191:idp-mobileid user-1$ git show-branch --current
! [CICD-1283-pipeline-in-shared-libraries] feat(CICD-1283): Use latest version of custom release plugin.
 * [master] Merge pull request #12 in CORES/idp-mobileid from feature/fix-schema-name to master
--
+  [CICD-1283-pipeline-in-shared-libraries] feat(CICD-1283): Use latest version of custom release plugin.
+  [CICD-1283-pipeline-in-shared-libraries^] feat(CICD-1283): Used the renamed AWS pipeline.
+  [CICD-1283-pipeline-in-shared-libraries~2] feat(CICD-1283): Point to feature branches of shared libraries.
-- [master] Merge pull request #12 in CORES/idp-mobileid from feature/fix-schema-name to master
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.