Chỉ hiển thị chi nhánh hiện tại trong Git


356

Tôi đã cố gắng tìm kiếm một lệnh Git đặc biệt cho việc này, nhưng tôi không thể tìm thấy. Có bất cứ điều gì ngắn hơn hoặc nhanh hơn sau đây?

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

1
tôi nghĩ rằng đây là cách nhanh nhất có thể để có được chi nhánh hiện tại
Eimantas


@ChandrayyaGK: Không, bởi vì câu hỏi khác là về việc thực hiện nó từ bên trong IDE của bạn. .
tripleee

3
@Torek - đây là một nhiệm vụ đơn giản khác gây khó khăn cho Git.
jww

Câu trả lời hàng đầu cho liên kết @ChandrayyaGK được đăng chậm hơn nhiều so với điều này!
Colm Bhandal

Câu trả lời:


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

Điều này sẽ hoạt động với Git 1.6.3 hoặc mới hơn.


Nó cũng không hoạt động với tôi, với git-1.6.2.5. git rev-parse ĐẦU --abbrev-ref => --abbrev-ref 311172491a9a667f9321bdf1c4fe5e22cc6e2c08 (tức là rev-phân tích cú pháp không chấp nhận --abbrev-ref (không nằm trong man page hoặc))
JasonWoof

1
JasonWoust, làm việc cho tôi trong 1.6.4.2, cần thay đổi để xem chính xác khi nào nó xảy ra ;-)
Michael Krelin - hacker

7
Theo như tôi có thể biết từ nhật ký Git, tính năng này đã được hợp nhất vào năm 2009-04-20 và được phát hành với phiên bản 1.6.3.
bá tước

1
Tôi thực sự muốn hiểu điều đó, quá. Làm thế nào điều này thực sự hoạt động? Ngoài ra, có vẻ như --aboustv-ref không trả lại bất cứ điều gì cho bất kỳ đối số nào khác. Nó không thể chỉ có thể có ĐẦU làm đối số.
Setafire

6
Lưu ý rằng nếu bạn đang ở trong một tham chiếu tượng trưng tách rời (có thể có nghĩa là bạn đang ở trong một chi nhánh, nhưng đã kiểm tra cam kết trước đó), lệnh này sẽ chỉ trở lại HEAD, không được mong đợimaster
hủy kết nối vào

129

Trong Git 1.8.1, bạn có thể sử dụng lệnh git Symbolic -ref với tùy chọn "--short":

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

Cảm ơn. Bí danh được tạo ra.
Michael Burr

7
Tốt hơn câu trả lời được chấp nhận IMO, bởi vì nó hoạt động trên các repos không có cam kết
Jerome Dalbert

2
fatal: ref HEAD is not a symbolic refGặp lỗi khi chạy nó như là một phần của bản dựng
TravisCI

dường như không làm việc trong GIT 1.9.1 `` `phiên bản git 1.9.1 gây tử vong: ref TRỤ không phải là một biểu tượng ref` ``
Richard

Hoạt động với tôi: git phiên bản 2.16.2.windows.1
Tagc 26/03/18

59

Với Git 2.22 (quý 2 năm 2019), bạn sẽ có một cách tiếp cận đơn giản hơn : git branch --show-current.

Xem cam kết 0ecb1fc (ngày 25 tháng 10 năm 2018) của Daniels Umanovskis ( umanovskis) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 3710f60 , ngày 07 tháng 3 năm 2019)

branch: giới thiệu --show-currenttùy chọn hiển thị

Khi được gọi với --show-current, git branchsẽ in tên chi nhánh hiện tại và chấm dứt.
Chỉ có tên thực tế được in, không có refs/heads.
Trong trạng thái CHÍNH tách ra, không có gì là đầu ra.

Dự định cả cho kịch bản và sử dụng tương tác / thông tin.
Không giống như git branch --list, không cần lọc để chỉ lấy tên chi nhánh.


15
Cuối cùng, những gì có vẻ như nó đã có ở đó từ đầu, đã được thêm vào!
dtasev

27

Bạn có thể quan tâm đến đầu ra của

git symbolic-ref HEAD

Đặc biệt, tùy thuộc vào nhu cầu và bố cục của bạn, bạn có thể muốn làm

basename $(git symbolic-ref HEAD)

hoặc là

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

và sau đó một lần nữa có các .git/HEADtập tin cũng có thể quan tâm cho bạn.


2
Bạn có thể rút ngắn git rev-parse --symbolic-full-nameđể git symbolic-ref.
bá tước

1
Bạn không cần phải sử dụng basenamehoặc cut; sử dụng BR=${BR#refs/heads/}(trong đó BR là tên của biến bạn đã lưu đầu ra của git symbolic-ref HEAD).
Jakub Narębski

Jakub, tất nhiên là không, miễn là bạn có đầu ra trong biến.
Michael Krelin - tin tặc

5
có thể làm git symbolic-ref --short HEADcũng
Fahad Siddiqui

2
Điều này sẽ phá vỡ nếu bạn có dấu gạch chéo trong tên chi nhánh của bạn ("task / foo", "Feature / bar"). Một loạt các bản dựng của tôi bắt đầu thất bại khi các đồng nghiệp quyết định rằng dấu gạch chéo rất tuyệt ...
vacri

13

Từ những gì tôi có thể nói, không có cách nào để chỉ hiển thị chi nhánh hiện tại trong Git, vì vậy tôi đã sử dụng:

git branch | grep '*'

3
Mặc dù nó hoạt động với GNU coreutils, nhưng thường grep '*'là lỗi cú pháp. Bạn có thể muốn git branch | sed -n 's/^\* //p'dù sao đi nữa. Hoặc thực sự, những gì OP đăng ở vị trí đầu tiên, tương đương với điều tương tự.
tripleee

@tripleee bạn có thể khai sáng cho tôi về lý do tại sao grep '*'trên danh nghĩa là lỗi cú pháp không?
JK ABC

1
@JKABC: ý nghĩa của @tripleee là đó '*'là một biểu thức chính quy và như vậy nó không hợp lệ. Bạn có thể muốn sử dụng '[*]'(nghĩa là ký tự *thay vì toán tử "không hoặc nhiều lần").
johndodo

2
@johndodo cảm ơn bạn đã làm rõ, nó có ý nghĩa với tôi bây giờ. Tôi thường làm điều đó bằng cáchgrep '\*'
JK ABC

2
chỉ có thể cắt tên chi nhánh bằnggit branch | grep "*" | cut -d' ' -f2
Fahad Siddiqui

7

Tôi đoán việc này sẽ nhanh chóng và có thể được sử dụng với API Python:

git branch --contains HEAD
* master

4
Điều này không xuất ra chi nhánh hiện tại. Nó đưa ra danh sách các nhánh xảy ra để trỏ đến các điểm CHÍNH cam kết. Và vâng, nó có thể chồng chéo, nhưng điều này có thể dẫn đến sự hiểu lầm. Tạo một nhánh mới từ nơi bạn đang ở và thử lại dòng của bạn: hai nhánh. Câu hỏi yêu cầu " chỉ chi nhánh hiện tại ".
RomainValeri

4

Tôi đang sử dụng

/etc/bash_completion.d/git

Nó đi kèm với Git và cung cấp một dấu nhắc với tên nhánh và hoàn thành đối số.


Làm thế nào để nhắc nhở này có thể được kích hoạt?
Alex

Trong Ubuntu, $ source /etc//bash_completion.d/git-prompt File có thể được đặt tên khác nhau trên các hệ thống khác nhau. (Lưu ý: sourcetừ khóa giống như chỉ .(dấu chấm) trong bash.)
michael

1

Đây không phải là ngắn hơn, nhưng nó cũng liên quan đến các chi nhánh tách ra:

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

1

Để đầy đủ, echo $(__git_ps1)trên Linux, ít nhất, nên cung cấp cho bạn tên của nhánh hiện tại được bao quanh bởi dấu ngoặc đơn.

Điều này có thể hữu ích là một số tình huống vì nó không phải là lệnh Git (trong khi tùy thuộc vào Git), đáng chú ý là để thiết lập dấu nhắc lệnh Bash của bạn để hiển thị nhánh hiện tại .

Ví dụ:

/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>

mục này là một bí danh và nên có mặt cho các kịch bản shell tương tác. nó có lẽ vắng mặt cho bất kỳ loại kịch bản.
Alexander Stohr

0

Ai đó có thể thấy điều này ( ) hữu ích. Nhánh hiện tại được hiển thị với dấu *.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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.