จะรับชื่อสาขาปัจจุบันใน Git ได้อย่างไร?


2591

ฉันมาจากพื้นหลังการโค่นล้มและเมื่อฉันมีสาขาฉันรู้ว่าฉันกำลังทำงานกับ "ไฟล์งานเหล่านี้ชี้ไปที่สาขานี้"

แต่ด้วย Git ฉันไม่แน่ใจเมื่อฉันแก้ไขไฟล์ใน NetBeans หรือ Notepad ++ ไม่ว่าจะเชื่อมโยงกับต้นแบบหรือสาขาอื่น

ไม่มีปัญหาgitในการทุบตีมันบอกฉันว่าฉันกำลังทำอะไรอยู่


11
ให้ IDE ของคุณแสดงไฟล์.git/HEADซึ่งอาจอยู่ในไดเรคทอรีหลัก
Tino

101
stackoverflow.com/questions/1417957/… $ git rev-parse --abbrev-ref HEAD
fantastory


7
ซ้ำซ้อนที่เป็นไปได้ของแสดงเฉพาะสาขาปัจจุบันใน Git
techraf

9
ด้วย Git 2.22 (Q2 2019) git branch --show-currentคุณจะมีวิธีการที่เรียบง่าย: ดูคำตอบของฉันที่นี่
VonC

คำตอบ:


2302
git branch

ควรแสดงสาขาในพื้นที่ของ repo ของคุณ สาขาที่ติดดาวคือสาขาปัจจุบันของคุณ

หากคุณต้องการดึงชื่อเฉพาะสาขาที่คุณอยู่คุณสามารถทำได้:

git rev-parse --abbrev-ref HEAD

แต่นั่นไม่ได้ช่วยฉันด้วย Notepad ++ และ Netbeans เพียงแค่คอมไพล์ bash (และ Probobly Vim) และฉันพูดถึงมัน ฉันกำลังพยายามทำงานร่วมกับเครื่องมือแก้ไขข้อความและตัวอักษรอื่น ๆ ของ arent ที่บรรทัดคำสั่ง
mike628

@ mike628 ที่จริงแล้วพวกเขากำลังช่วยคุณยกเว้นคุณต้องการให้บางสิ่งสามารถเข้าถึงได้ผ่าน GUI แก้ไข?
Tadeck

2
หากคุณยินดีที่จะทำงานใน Eclipse มีโปรแกรมที่เรียกว่า "eGit" ที่มี GUI ที่จะบอกสาขาปัจจุบันของ repos ทั้งหมดในนั้น ไม่เช่นนั้นฉันไม่รู้ .. คุณจะอยู่ในความเมตตาของผู้สร้างปลั๊กอินใด ๆ ที่คุณต้องการใช้ซึ่งเข้ากันได้กับโปรแกรมที่คุณเลือก (ถ้ามี)
roberttdev

2
หลังจากทำgit checkout --orphan fooแล้วล้มเหลวในการแสดงสาขาgit branch fooในขณะที่git symbolic-ref HEADตามที่แนะนำคำตอบอื่นทำงาน
Marcus Junius Brutus

2
downvote เราต้องการเฉพาะสาขาปัจจุบันที่เป็น stdout ไม่ใช่สาขาทั้งหมด
Alexander Mills

4657

ในการแสดงสาขาปัจจุบันที่คุณเปิดโดยไม่แสดงสาขาอื่นคุณสามารถทำสิ่งต่อไปนี้:

git rev-parse --abbrev-ref HEAD

อ้างอิง:


132
@ChrisNelson เพราะมันจะแสดงเฉพาะสาขาปัจจุบันมากกว่ารายชื่อสาขาทั้งหมด
avakar

73
ดีอย่างหนึ่งน่าเศร้าที่มันไม่ทำงานถ้าคุณอยู่ในสถานะ 'HEAD HEAD' (มันแค่เอาท์พุท 'HEAD' ซึ่งไร้ประโยชน์โดยสิ้นเชิง)
Carlos Campderrós

34
ฉันเดาจากภายใน git ถ้าคุณอยู่ในสถานะ 'HEAD HEAD' ไม่มีการติดตามสาขาที่เป็นของเพราะการgit branchแสดง* (no branch)ซึ่งไม่มีประโยชน์ ...
Carlos Campderrós

76
"git symbolic-ref --short HEAD" สามารถใช้งานเพื่อจุดประสงค์เดียวกันนี้ได้เช่นกัน
dusktreader

22
git rev-parse --abbrev-ref HEAD 2>/dev/null ส่วน / dev / null ป้องกันไม่ให้คุณเห็นข้อผิดพลาดหากคุณเพิ่งสร้างที่เก็บใหม่ที่ยังไม่ได้เป็น HEAD
Paradiesstaub

523

คุณยังมีgit symbolic-ref HEADที่แสดง refspec เต็มรูปแบบ

ในการแสดงเฉพาะชื่อสาขาใน Git v1.8 และใหม่กว่า (ขอบคุณ Greg สำหรับการชี้ให้เห็น):

git symbolic-ref --short HEAD

ใน Git v1.7 + คุณสามารถทำได้:

git rev-parse --abbrev-ref HEAD

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

บันทึก:

สำหรับลูกค้าก่อนหน้านี้ดูเหมือนว่าจะทำงาน:

git symbolic-ref HEAD | sed -e "s/^refs\/heads\///"

- Darien 26. มีนาคม 2014


7
ในฐานะที่เป็นคำตอบอื่น ๆ ทั้งหมดนี้ไม่ทำงานเมื่อคุณอยู่ในสถานะ 'HEAD HEAD'
Carlos Campderrós

51
@ CarlosCampderrós: ​​หากคุณอยู่ในสถานะ HEAD เดี่ยวไม่มีสิ่งใดเป็นสาขาปัจจุบัน ท้ายที่สุดความมุ่งมั่นที่คุณมีอยู่อาจเข้าถึงได้โดยมีศูนย์สาขาหนึ่งสาขาขึ้นไป
Flimm

2
สิ่งนี้ทำให้เกิดปัญหาในที่เก็บ git ที่ว่างเปล่าเมื่อไม่มี HEAD
Arne

8
ด้วย git เวอร์ชั่น 2.4.4 git rev-parse --abbrev-ref HEADจะแสดงHEADเมื่อคุณอยู่บนหัวเดี่ยว
peterhil

คำตอบที่ดีที่สุดยังคงเป็นgit symbolic-ref HEAD | sed -e "s/^refs\/heads\///" เพราะมันจะแสดงสตริงเหมือนHEAD detached at a63917fเมื่ออยู่ในสถานะเดี่ยวซึ่งแตกต่างจากคำตอบอื่น ๆ ที่แสดงอะไรหรือหัว นี้เป็นสิ่งสำคัญ.
เบอร์นาร์ด

265

สำหรับการอ้างอิงของฉัน (แต่อาจเป็นประโยชน์กับผู้อื่น) ฉันทำภาพรวมของเทคนิค (บรรทัดคำสั่งพื้นฐาน) ส่วนใหญ่ที่กล่าวถึงในหัวข้อนี้แต่ละรายการที่ใช้กับกรณีการใช้งานหลายกรณี: HEAD คือ (ชี้ไปที่):

  • สาขาท้องถิ่น (ปรมาจารย์)
  • สาขาการติดตามระยะไกลซิงค์กับสาขาท้องถิ่น (ต้นกำเนิด / หลักที่กระทำเหมือนกับมาสเตอร์)
  • สาขาการติดตามระยะไกลไม่ซิงค์กับสาขาท้องถิ่น (ต้นทาง / ฟีเจอร์ - ฟู)
  • แท็ก (v1.2.3)
  • submodule (ทำงานในไดเรกทอรี submodule)
  • หัวแฝดทั่วไป (ไม่มีข้อใดข้างต้น)

ผล:

  • git branch | sed -n '/\* /s///p'
    • สาขาท้องถิ่น: master
    • สาขาการติดตามระยะไกล (ซิงค์): (detached from origin/master)
    • สาขาการติดตามระยะไกล (ไม่ซิงค์): (detached from origin/feature-foo)
    • แท็ก: (detached from v1.2.3)
    • submodule: (HEAD detached at 285f294)
    • หัวเดี่ยวทั่วไป: (detached from 285f294)
  • git status | head -1
    • สาขาท้องถิ่น: # On branch master
    • สาขาการติดตามระยะไกล (ซิงค์): # HEAD detached at origin/master
    • สาขาการติดตามระยะไกล (ไม่ซิงค์): # HEAD detached at origin/feature-foo
    • แท็ก: # HEAD detached at v1.2.3
    • submodule: # HEAD detached at 285f294
    • หัวเดี่ยวทั่วไป: # HEAD detached at 285f294
  • git describe --all
    • สาขาท้องถิ่น: heads/master
    • สาขาการติดตามระยะไกล (ซิงค์): heads/master(หมายเหตุ: ไม่ remotes/origin/master )
    • สาขาการติดตามระยะไกล (ไม่ซิงค์): remotes/origin/feature-foo
    • แท็ก: v1.2.3
    • submodule: remotes/origin/HEAD
    • หัวเดี่ยวทั่วไป: v1.0.6-5-g2393761
  • cat .git/HEAD:
    • สาขาท้องถิ่น: ref: refs/heads/master
    • submodule: cat: .git/HEAD: Not a directory
    • กรณีการใช้งานอื่น ๆ ทั้งหมด: SHA ของการกระทำที่สอดคล้องกัน
  • git rev-parse --abbrev-ref HEAD
    • สาขาท้องถิ่น: master
    • กรณีการใช้งานอื่น ๆ ทั้งหมด: HEAD
  • git symbolic-ref --short HEAD
    • สาขาท้องถิ่น: master
    • กรณีการใช้งานอื่น ๆ ทั้งหมด: fatal: ref HEAD is not a symbolic ref

(FYI นี้ทำได้ด้วย git รุ่น 1.8.3.1)


6
โดยสรุปดูเหมือนจะไม่มีใครทำสิ่งที่ฉันต้องการด้วยมือ
bukzor

6
สิ่งนี้มีประโยชน์สำหรับฉัน: git describe --all --exact-match 2>/dev/null | sed 's=.*/=='เป็นทางออกที่ดีที่สุดสำหรับฉัน (ชื่อที่ดีสำหรับแท็กและหัวสาขาไม่มีผลลัพธ์สำหรับหัวเดี่ยวที่แยกออกมา
Alex Dupuy

1
อย่างไรก็ตามฉันเพิ่งค้นพบว่าการใช้git describeมีความล้มเหลวอย่างร้ายแรงเมื่อมีหลายสาขาที่อ้างอิงการกระทำเดียวกันเช่นหลังจากgit checkout -b foo- มันใช้หนึ่งในนั้นโดยพลการ (ดูเหมือนว่าอาจจะเป็นที่เพิ่งสร้างล่าสุด) ฉันจะเปลี่ยนกลยุทธ์ของฉันเพื่อใช้ผลลัพธ์ที่กรองgit branchแล้วและใช้เฉพาะในgit describeกรณีที่ผลลัพธ์เป็นบางสิ่งเกี่ยวกับส่วนหัวที่แยกออก
Alex Dupuy

ที่จริงแล้วฉันต้องใช้git branch --no-colorเพื่อให้แน่ใจว่าชื่อไฟล์นั้นไม่มีรหัสหลบหนีเทอร์มินัลที่น่ารำคาญ
Alex Dupuy

2
นี่เป็นประโยชน์กับฉันมากกว่าหนึ่งครั้งขอบคุณมากที่ได้เป็นอย่างนั้น!
Alice Purcell

154

ในฐานะเวอร์ชั่น 2.22 ของ git คุณสามารถใช้:

git branch --show-current

ตามหน้าคน:

พิมพ์ชื่อของสาขาปัจจุบัน ในสถานะ HEAD ที่แยกออกไม่มีอะไรถูกพิมพ์


2
ใช่ฉันบอกว่าเดือนมีนาคมในความคิดเห็นของหน้านั้น: stackoverflow.com/questions/6245570/... และในstackoverflow.com/a/55088865/6309
VonC

5
อย่างน้อยพูดถึงสิ่งนี้ไม่ทำงานในสถานะ HEAD เดี่ยว เพียงไม่กี่ชั่วโมงที่หายไปได้รับคอมไพล์ 2.22 รวบรวมเพื่ออะไร ...
เดวิด Deprost

136

อีกหนึ่งทางเลือก:

git name-rev --name-only HEAD

นอกจากนี้ยังสามารถเรียกคืนได้ด้วยecho ${$(git symbolic-ref --quiet HEAD)#refs/heads/}
Antoine

12
มันไม่ทำงานหาก HEAD เหมือนกันสำหรับ Master และฟีเจอร์ Branch (เช่นระหว่างการผสาน) มันจะส่งกลับ 'ต้นแบบ' แม้ว่าจะดำเนินการในสาขาฟีเจอร์
Orest Hera

1
git checkout master && git name-rev --name-only HEAD # ac-187มันไม่ทำงานตามที่คาดไว้
Alexander Abashkin

ฉันบันทึกสิ่งนี้ลงในตัวแปรก่อนที่จะรวมและในกรณีที่หัวของฉันอาจถูกยกเลิกการเชื่อมต่อถ้าฉันชำระเงินการกระทำที่เฉพาะเจาะจง ในกรณีนี้ใช้งานได้ดี
Ishaan Sejwal

4
ฉันกำลังทำสิ่งนี้จากท่อส่งเจนกินส์ ดังนั้นนี่จึงเป็นคำตอบที่ดีที่สุดสำหรับฉัน ทำเพียงแค่พูดว่าgit branch --list * (HEAD detached at 7127db5)ทำgit rev-parse --abbrev-ref HEADเพียงแค่พูดว่าHEADและอื่น ๆ
Mig82

91

ง่ายดีพอฉันได้มันในหนึ่งซับ (ทุบตี)

git branch | sed -n '/\* /s///p'

(เครดิต: การชดเชย จำกัด )

และในขณะที่ฉันอยู่ที่นั่นสายการบินเดียวที่จะรับสาขาการติดตามระยะไกล (ถ้ามี)

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

8
เครื่องหมายทับมากเกินไป! :) sed -n 's/\* //p'ไม่หลอกลวง sed -n 's/^\* //p'ถึงแม้ว่าผมจะมีแนวโน้มไปหวาดระแวงดังนั้นฉันจะยึดมันด้วย
Mark Reed

64

คุณสามารถพิมพ์คำสั่ง (คอนโซล) บน Linux ในไดเรกทอรีที่เก็บ:

$ git status

และคุณจะเห็นข้อความซึ่งคล้ายกับ:

...
On branch master
...

ซึ่งหมายความว่าคุณอยู่ในmasterสาขา หากคุณกำลังแก้ไขไฟล์ใด ๆ ในขณะนั้นและตั้งอยู่ในพื้นที่เก็บข้อมูลเดียวกัน (ไดเรกทอรีท้องถิ่นที่มีไฟล์ที่อยู่ภายใต้การจัดการการควบคุมเวอร์ชัน Git) คุณกำลังแก้ไขไฟล์ในสาขานี้


2
ขึ้นอยู่กับสิ่งที่คุณต้องการคุณสามารถใช้git statusและรับเฉพาะบรรทัดแรกของเอาต์พุตgit status | head -1ที่ให้ผลลัพธ์เช่น# On branch masterนั้น ฉันแน่ใจว่าต้องใช้ความแตกต่างของเวอร์ชันด้วยเช่นกัน
Joshua Pinter

@JoshPinter: คุณสามารถใช้git status | grep 'On branch'ซึ่งควรมีผลเหมือนกัน (ควรไม่ได้หมายความว่าจะเกิดขึ้นหาก Git เวอร์ชั่นของคุณแสดงแตกต่างกัน) หรือgit branch | grep '*'ซึ่งจะแสดงชื่อของสาขาด้วยดาวที่จุดเริ่มต้นของมัน
Tadeck

ใช่ว่าใช้งานได้ดีและอาจมีความยืดหยุ่นมากกว่า ผลลัพธ์สุดท้ายของฉันในการแสดงเพียงชื่อสาขาในแอพพลิเคชั่น Rail Rail คือ:<tick>git status | head -1<tick>.gsub('# On branch ', '')
Joshua Pinter

1
git statusอาจใช้เวลานานในการส่งคืนค่าหากมีการจัดการไฟล์จำนวนมาก
คนดีบุก

ใช่ถ้าคุณต้องการพิมพ์สาขาบนหน้าเว็บgit statusอาจทำการเก็บเวลาการสร้างของทั้งหน้า
Artem Russakovskii

36
git symbolic-ref -q --short HEAD

ฉันใช้สิ่งนี้ในสคริปต์ที่ต้องการชื่อสาขาปัจจุบัน มันจะแสดงสัญลักษณ์อ้างอิงสั้น ๆ ปัจจุบันให้กับ HEAD ซึ่งจะเป็นชื่อสาขาปัจจุบันของคุณ


1
ขอบคุณใช้งานได้ดี! - ฉันยังเพิ่ม "-C path_to_folder" ในสคริปต์ของฉันด้วยสิ่งนี้
โทนี่

1
นี่เป็นวิธีแก้ปัญหาที่ดีเพราะด้วยตัวเลือก -q จะส่งคืนรหัสข้อผิดพลาดในสถานะ "ถอดหัว" แต่ไม่พิมพ์อะไรไปยัง stderr
hallidave

นี่เป็นทางออกเดียวที่ทำงานสำหรับฉันใน repo สดโดยไม่ต้องกระทำใด ๆ
kundasaba

26
git branch | grep -e "^*" | cut -d' ' -f 2

จะแสดงเฉพาะชื่อสาขา


หากสาขาของคุณแสดง somethig เช่นนี้ "* (ถอดหัวที่ SUM_BRANCH_01)" ให้ลอง "git branch | grep -e" ^ * "| cut -d '' -f 5 | cut -d ')' -f 1 "
Dylan Kapp

ฉันเพิ่งสร้างสคริปต์เดียวกันนี้เพื่อรับชื่อสาขาปัจจุบัน ฉันคิดว่ามันอาจช่วย diffs
tggagne

25

git branch แสดงชื่อสาขาปัจจุบันเท่านั้น

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

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

git rev-parse --abbrev-ref HEAD

นี่เป็นสิ่งที่ยอดเยี่ยมสำหรับ ci และเครื่องมือสร้างอื่น ๆ !
phouse512

คำตอบที่ดีที่สุดสำหรับการใช้งานในสคริปต์
Ben Keil

1
@DylanNicholson git branch --containsบางครั้งมีรายการมากกว่าหนึ่งสาขา
โจ Chacko

22

พบโซลูชันบรรทัดคำสั่งที่มีความยาวเท่ากันกับOliver Refalo'sโดยใช้ good ol 'awk:

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

awkอ่านว่าเป็น "ทำสิ่งต่าง ๆ ใน{}บรรทัดที่ตรงกับ regex" โดยค่าเริ่มต้นจะถือว่าฟิลด์ที่คั่นด้วยช่องว่างดังนั้นคุณพิมพ์ที่สอง หากคุณสามารถสันนิษฐานได้ว่ามีเพียงบรรทัดที่สาขาของคุณมี * คุณสามารถวาง ^ อ้าทุบตีกอล์ฟ!



18

ทำไมไม่ใช้เชลล์พรอมต์ git-aware ซึ่งจะบอกชื่อของสาขาปัจจุบัน? git statusยังช่วย


วิธีgit-prompt.shจากcontrib/มัน (git รุ่น 2.3.0) ตามที่กำหนดไว้ใน__git_ps1ฟังก์ชั่นผู้ช่วย:

  1. ขั้นแรกมีกรณีพิเศษหากตรวจพบการดำเนินการรีบูต Git ใช้สาขาที่ไม่มีชื่อ (HEAD เดี่ยว) ในระหว่างกระบวนการรีบูตเพื่อทำให้เป็นอะตอมและจะบันทึกสาขาเดิมไว้ที่อื่น

  2. หาก.git/HEADไฟล์นั้นเป็นลิงก์สัญลักษณ์ (เป็นกรณีที่หายากมากจากประวัติศาสตร์โบราณของ Git) ไฟล์นั้นจะใช้git symbolic-ref HEAD 2>/dev/null

  3. อื่นมันอ่าน.git/HEADไฟล์ ขั้นตอนถัดไปขึ้นอยู่กับเนื้อหา:

    • หากไฟล์นี้ไม่มีอยู่แสดงว่าไม่มีสาขาปัจจุบัน สิ่งนี้มักจะเกิดขึ้นถ้าที่เก็บเปลือย

    • ถ้ามันเริ่มต้นด้วย'ref: 'คำนำหน้าก็.git/HEADคือ symref (การอ้างอิงสัญลักษณ์) และเราอยู่ในสาขาปกติ ตัดคำนำหน้านี้เพื่อรับชื่อเต็มและดึงrefs/heads/เพื่อรับชื่อย่อของสาขาปัจจุบัน:

      b="${head#ref: }"
      # ...
      b=${b##refs/heads/}
      
    • ถ้ามันไม่ได้เริ่มต้นด้วย'ref: 'มันจะถูกถอดออก HEAD (สาขาที่ไม่ระบุชื่อ) ชี้ไปที่การกระทำบางอย่างโดยตรง ใช้git describe ...เพื่อเขียนการกระทำปัจจุบันในรูปแบบที่มนุษย์อ่านได้

ฉันหวังว่าจะช่วย


3
และถ้าคุณกำลังพัฒนา shell prompt ที่ใช้คอมไพล์คุณควรใช้คำตอบข้อใดในที่นี้? เต่าตลอดทางลง
tripleee

1
@tripleee: ยืมไอเดียจากgithub.com/git/git/blob/master/contrib/completion/git-prompt.sh
Jakub Narębski

4
สิ่งใดสำหรับบันทึกที่ดูเหมือนว่ากำลังทำอยู่git describe --contains --all HEADซึ่งฉันไม่เห็นที่อื่นในหน้านี้ในขณะนี้ ในขณะที่ฉันแน่ใจว่าคุณรู้ว่าไม่แนะนำให้ใช้คำตอบแบบลิงก์เท่านั้นใน StackOverflow
tripleee

2
@tripleee: ฉันได้เพิ่มคำอธิบายวิธีgit-prompt.sh(aka __git_ps1) ทำ ...
Jakub Narębski

17

รุ่นที่มีเสียงดังน้อยกว่าสำหรับสถานะคอมไพล์จะทำเคล็ดลับ

git status -bsuno

มันพิมพ์ออกมา

## branch-name

1
## พัฒนา ... ที่มา / พัฒนา
Kalpesh Soni

16

ขออภัยนี่เป็นคำตอบที่เป็นคำสั่งอื่น แต่นั่นคือสิ่งที่ฉันกำลังมองหาเมื่อฉันพบคำถามนี้และคำตอบเหล่านี้มีประโยชน์ วิธีการแก้ปัญหาของฉันคือฟังก์ชั่นเปลือกทุบตีต่อไปนี้:

get_branch () {
    git rev-parse --abbrev-ref HEAD | grep -v HEAD || \
    git describe --exact-match HEAD 2> /dev/null || \
    git rev-parse HEAD
}

git checkoutนี้ควรให้ฉันบางสิ่งบางอย่างทั้งที่มนุษย์สามารถอ่านและใช้งานได้โดยตรงเป็นอาร์กิวเมนต์ไปยัง

  • ในสาขาท้องถิ่น: feature/HS-0001
  • ในการติดแท็กการกระทำ (เดี่ยว): v3.29.5
  • ในสาขาระยะไกล (ถอดออกไม่ได้ติดแท็ก): SHA1
  • ในการกระทำอื่นที่แยกออก: SHA1

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

15

คุณสามารถใช้ git bash กับคำสั่งไดเรกทอรีทำงานได้ดังต่อไปนี้

git status -b

มันจะบอกคุณว่าสาขาไหนที่คุณอยู่มีคำสั่งมากมายซึ่งเป็นประโยชน์บางอย่างของพวกเขา

-s

- สั้นให้ผลลัพธ์ในรูปแบบสั้น

-b - สาขาแสดงสาขาและข้อมูลการติดตามแม้ในรูปแบบสั้น

- พอร์ซเลน [=] ให้เอาต์พุตในรูปแบบที่ง่ายต่อการแยกวิเคราะห์สำหรับสคริปต์ สิ่งนี้คล้ายกับเอาต์พุตแบบสั้น แต่จะยังคงเสถียรในเวอร์ชัน Git และไม่ว่าผู้ใช้จะกำหนดค่าแบบใด ดูรายละเอียดด้านล่าง

พารามิเตอร์ version ใช้เพื่อระบุเวอร์ชันการจัดรูปแบบ นี่เป็นทางเลือกและเป็นค่าเริ่มต้นของรูปแบบ v1 รุ่นดั้งเดิม

- ยาวให้ผลลัพธ์ในรูปแบบยาว นี่คือค่าเริ่มต้น

-v --verbose นอกเหนือจากชื่อของไฟล์ที่มีการเปลี่ยนแปลงแล้วยังแสดงการเปลี่ยนแปลงที่เป็นข้อความที่จัดฉากที่จะกระทำ (เช่นเช่นการส่งออกของ git diff --cached) หากระบุ -v สองครั้งจากนั้นก็แสดงการเปลี่ยนแปลงในแผนผังการทำงานที่ยังไม่ได้ถูกจัดฉาก (เช่นเช่นเอาต์พุตของ git diff)


14
git status 

จะให้ชื่อสาขาพร้อมกับการเปลี่ยนแปลงด้วย

เช่น

>git status
On branch master // <-- branch name here
.....

13

เมื่อเวลาผ่านไปเราอาจมีรายชื่อสาขายาวมาก

ในขณะที่วิธีแก้ปัญหาอื่น ๆ นั้นยอดเยี่ยมนี่คือสิ่งที่ฉันทำ (ทำให้ง่ายขึ้นจากคำตอบของยาโคบ):

git branch | grep \*

ตอนนี้

git status

ใช้งานได้ แต่เฉพาะถ้ามีการเปลี่ยนแปลงใด ๆ ในท้องถิ่น


13

ฉันขอแนะนำให้ใช้คำสั่งใด ๆ ของทั้งสองนี้

git branch | grep -e "^*" | cut -d' ' -f 2

หรือ

git status | sed -n 1p | cut -d' ' -f 3

หรือ (verbose เพิ่มเติม)

git status -uno -bs| cut -d'#' -f 3 | cut -d . -f 1| sed -e 's/^[ \t]//1'| sed -n 1p


12

ใน Netbeans ให้แน่ใจว่าเปิดใช้งานคำอธิบายประกอบการกำหนดเวอร์ชัน (ดู -> แสดงป้ายกำกับการกำหนดเวอร์ชัน) จากนั้นคุณสามารถดูชื่อสาขาถัดจากชื่อโครงการ

http://netbeans.org/bugzilla/show_bug.cgi?id=213582


เมื่อเปิดใช้งานคำอธิบายประกอบการกำหนดเวอร์ชันแล้วสิ่งที่คุณต้องทำคือเลื่อนเมาส์ไปวางเหนือโฟลเดอร์โครงการ (หรือไฟล์หรือรายการโปรด) เพื่อดูสาขาปัจจุบัน
idclaar

12

แล้วเรื่องนี้ล่ะ

{ git symbolic-ref HEAD 2> /dev/null || git rev-parse --short HEAD 2> /dev/null } | sed "s#refs/heads/##"

1
คำตอบที่ดีกว่ามากเพราะสามารถจัดการกับกล่อง HEAD ที่ถอดออกได้ดี
Pat

2
ดูเหมือนว่าคุณควรใช้ () ไม่ใช่ {} เพื่อตัดคำสั่ง git
Pat

@ Pat ไม่จำเป็นต้องวางไข่ subshell แยกสำหรับสิ่งนี้ตามที่ () จะทำ {} ไม่เป็นไรเว้นแต่คุณจะต้องเพิ่ม; หรือขึ้นบรรทัดใหม่ก่อน} ที่จริงแล้วคุณสามารถละทิ้ง {} โดยสิ้นเชิงเว้นแต่ว่าคุณต้องการจัดกลุ่มคำสั่ง
aij

ไม่ไม่ได้เป็นsymbolic-refส่วนหนึ่งยังต้อง--shortเพื่อหลีกเลี่ยงการ prefixing BRANCHNAME ด้วยrefs/heads/?
rjp

11

ฉันมีสคริปต์ง่าย ๆ ที่เรียกว่าgit-cbr( สาขาปัจจุบัน ) ซึ่งพิมพ์ชื่อสาขาปัจจุบัน

#!/bin/bash

git branch | grep -e "^*"

ฉันวางสคริปต์นี้ในโฟลเดอร์ที่กำหนดเอง ( ~/.bin) $PATHอยู่ในโฟลเดอร์

ดังนั้นเมื่อฉันอยู่ใน repo คอมไพล์ฉันเพียงแค่พิมพ์git cbrเพื่อพิมพ์ชื่อสาขาปัจจุบัน

$ git cbr
* master

นี้ทำงานได้เพราะคำสั่งจะใช้เวลาอาร์กิวเมนต์แรกและพยายามที่จะเรียกใช้สคริปต์ที่จะไปตามชื่อของที่git git-arg1ตัวอย่างเช่นgit branchพยายามเรียกใช้สคริปต์ที่เรียกว่าgit-branchฯลฯ


11

คุณสามารถตั้งค่าเอาต์พุต bash ของคุณอย่างถาวรเพื่อแสดงชื่อ git-branch ของคุณ มันมีประโยชน์มากเมื่อคุณทำงานกับสาขาต่าง ๆ ไม่จำเป็นต้องพิมพ์$ git statusตลอดเวลา Github repo คอมไพล์ตระหนักถึงพรอมต์

เปิดเทอร์มินัลของคุณ (ctrl-alt-t) และป้อนคำสั่ง

mkdir ~/.bash
cd ~/.bash
git clone git://github.com/jimeh/git-aware-prompt.git

แก้ไข. bashrc ของคุณด้วยsudo nano ~/.bashrcคำสั่ง (สำหรับ Ubuntu) และเพิ่มรายการต่อไปนี้ไว้ด้านบน:

export GITAWAREPROMPT=~/.bash/git-aware-prompt
source "${GITAWAREPROMPT}/main.sh"

จากนั้นวางรหัส

export PS1="\${debian_chroot:+(\$debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\] \[$txtcyn\]\$git_branch\[$txtred\]\$git_dirty\[$txtrst\]\$ "

ในตอนท้ายของไฟล์เดียวกันคุณวางรหัสการติดตั้งไว้ก่อนหน้านี้ สิ่งนี้จะให้ผลลัพธ์ของ colorized:ป้อนคำอธิบายรูปภาพที่นี่


10

คำสั่งเชลล์ต่อไปนี้จะบอกสาขาที่คุณอยู่ในปัจจุบัน

git branch | grep ^\*

เมื่อคุณไม่ต้องการพิมพ์คำสั่งแบบยาวนั้นทุกครั้งที่คุณต้องการรู้สาขาและคุณกำลังใช้ Bash ให้ตั้งชื่อแทนแบบสั้น ๆ เช่นชื่อแทนcbเช่นนั้น

alias cb='git branch | grep ^\*'

เมื่อคุณอยู่ในสาขาหลักและพรอมต์ของคุณคือ$คุณจะได้รับ* masterดังต่อไปนี้

$ cb
* master

สิ่งนี้ไม่ได้ให้คำตอบสำหรับคำถาม หากต้องการวิจารณ์หรือขอคำชี้แจงจากผู้แต่งโปรดแสดงความคิดเห็นใต้โพสต์ของพวกเขา - จากรีวิว
Rashwan L

1
ทำไมคุณคิดอย่างงั้น?
mrrusof

คุณควรแสดงความคิดเห็นและอธิบายโพสต์ของคุณสำหรับ OP ด้วยวิธีนี้จะง่ายต่อการเข้าใจโพสต์ของคุณ
Rashwan L

1
ทำให้รู้สึกที่สมบูรณ์แบบ
mrrusof

1
ถ้าคุณใช้ zsh คุณจะต้องตัด grep regex ด้วยเครื่องหมายคำพูดเดี่ยว:git branch | grep '^\*'
aaaarrgh

9

ส่งคืนชื่อสาขาหรือ SHA1 เมื่ออยู่บนเฮดเดอร์เดี่ยว:

git rev-parse --abbrev-ref HEAD | grep -v ^HEAD$ || git rev-parse HEAD

นี่เป็นคำตอบสั้น ๆ ของ @ dmaestro12 และไม่มีการสนับสนุนแท็ก


8
ดีกว่า:git symbolic-ref --quiet --short HEAD || git rev-parse --short HEAD
blueyed

8

หากคุณต้องการให้สาขา / แท็กล่าสุดเช็คเอาต์ในสถานะ HEAD ที่แยกออกมาเช่นกัน

git reflog HEAD | grep 'checkout:' | head -1 | rev | cut -d' ' -f1 | rev

อัปเดต นี่คือดีกว่าถ้าคุณมีและไม่กลัว awk

git reflog HEAD | grep 'checkout:' | head -1 | awk '{print $NF}'

rev | cut -d' ' -f1| revได้ง่ายด้วยawk '{print $NF}'
สตีฟ Buzonas

1
ในขณะที่นี่ไม่ใช่สิ่งที่ไม่สามารถป้องกันได้เช่นกันเนื่องจากคุณสามารถชำระเงินการแก้ไขเฉพาะโดยแฮชเพื่อให้การอ้างอิงเพียงแค่แสดงcheckout: moving from ba7571b7fc5b8f31b8d0625821269afaa655577e to f68be8cf7bea917a5a0562b619e50368de0068a9ว่ามันยังคงเป็นเคล็ดลับที่มีประโยชน์ที่อาจช่วยในการแก้ปัญหาบางกรณี
Alex Dupuy

1
ยิ่งย่อให้สั้นลงถึงgit reflog | awk '$3=="checkout:" {print $NF; exit}'
jthill

6

ฉันรู้ว่ามันสาย แต่ใน linux / mac จาก terminal คุณสามารถใช้สิ่งต่อไปนี้

git status | sed -n 1p

คำอธิบาย:

สถานะ git -> รับค่าสถานะต้นไม้ทำงาน
sed -n 1p -> รับบรรทัดแรกจากเนื้อหาสถานะ

การตอบสนองต่อคำสั่งด้านบนจะมีลักษณะดังนี้:

"On branch your_branch_name"

2
head -1จะเป็นวิธีปกติ
bukzor

5

คุณสามารถใช้ตัวแปร GIT_BRANCH ตามที่ปรากฏที่นี่: https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin

ปลั๊กอิน git ตั้งค่าตัวแปรสภาพแวดล้อมหลายอย่างที่คุณสามารถใช้ในสคริปต์ของคุณ:

GIT_COMMIT - SHA ของปัจจุบัน

GIT_BRANCH - ชื่อของสาขาที่ใช้อยู่ในปัจจุบันเช่น "master" หรือ "origin / foo"

GIT_PREVIOUS_COMMIT - SHA ของการคอมมิชชันที่สร้างไว้ก่อนหน้าจากสาขาเดียวกัน (SHA ปัจจุบันในการบิลด์ครั้งแรกในสาขา)

GIT_URL - ที่เก็บรีโมต URL

GIT_URL_N - ที่เก็บรีโมต URL เมื่อมีรีโมตมากกว่า 1 ตัวเช่น GIT_URL_1, GIT_URL_2

GIT_AUTHOR_EMAIL - อีเมลผู้มอบหมาย / ผู้แต่ง

GIT_COMMITTER_EMAIL - อีเมลผู้มอบหมาย / ผู้แต่ง


5

เพิ่มลงในการPS1ใช้ Mac:

PS1='\W@\u >`[ -d .git ] && git branch | grep  ^*|cut -d" " -f2`> $ '

ก่อนรันคำสั่งด้านบน:

ป้อนคำอธิบายรูปภาพที่นี่

หลังจากรันคำสั่งนั้น:

ป้อนคำอธิบายรูปภาพที่นี่

ไม่ต้องกังวลหากไม่ใช่ที่เก็บข้อมูล GIT ก็จะไม่แสดงข้อผิดพลาดเนื่องจากการ[-d .git]ตรวจสอบว่า.gitมีโฟลเดอร์อยู่หรือไม่

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