Câu hỏi Làm thế nào để có được tên chi nhánh hiện tại trong Git?


Tôi từ một nền Subversion và, khi tôi có một chi nhánh, tôi biết những gì tôi đã làm việc với "Những điểm làm việc tập tin đến chi nhánh này".

Nhưng với Git tôi không chắc chắn khi tôi đang chỉnh sửa một tập tin trong NetBeans hoặc Notepad ++, cho dù đó là gắn với chủ hoặc chi nhánh khác.

Không có vấn đề gì với git trong bash, nó cho tôi biết tôi đang làm gì.


1718
2018-06-05 20:13


gốc


Hãy để IDE của bạn hiển thị tệp .git/HEAD, có thể trong thư mục cha - Tino
stackoverflow.com/questions/1417957/… $ git rev-parse - HEAD đầu tư - fantastory
có thể trùng lặp Làm thế nào để lập trình xác định hiện tại kiểm tra chi nhánh Git - tripleee
Với View -> Show versioning Labels được kích hoạt trong NetBeans, tất cả những gì bạn cần làm là di chuột qua thư mục Project (hoặc File hoặc Favorite) để xem nhánh hiện tại. - idclaar
Có thể trùng lặp Chỉ hiển thị nhánh hiện tại trong Git - techraf


Các câu trả lời:


git branch

nên hiển thị tất cả các chi nhánh địa phương của repo của bạn. Chi nhánh được gắn dấu sao là chi nhánh hiện tại của bạn.


1298
2018-06-05 20:17



Nếu bạn sẵn sàng làm việc trong Eclipse, có một chương trình được gọi là "eGit" có một GUI sẽ cho bạn biết nhánh hiện tại cho tất cả các repos trong nó. Nếu không, tôi không biết .. bạn sẽ được ở lòng thương xót của tác giả của bất cứ plugin nào bạn muốn sử dụng đó là tương thích với sự lựa chọn của bạn của chương trình (nếu có). - roberttdev
git branch | grep \* chỉ trả về nhánh hiện tại (nhưng vẫn còn với một ngôi sao ở phía trước nó) - fboes
git branch | grep \* | cut -d ' ' -f2 để phân chia không gian sau ngôi sao, chỉ trả lại tên. Dựa trên nhận xét của @fboes - jgraup
git branch | grep \* | cut -d ' ' -f2- - Tôi sẽ đề nghị thay đổi nhỏ thành bình luận của @ jgraup (thay thế -f2 với -f2-) để có được mọi thứ sau không gian thứ nhất, bởi vì trong trường hợp * (HEAD detached at ff3de3c) bạn lấy (HEAD chỉ có - boobiq
BTW: git rev-parse --abbrev-ref HEAD (như đã đề cập bên dưới) hoạt động mà không cần thêm bất kỳ quảng cáo nào và trả về tên chi nhánh hiện tại mà không có sed hoặc là grep - fboes


git rev-parse --abbrev-ref HEAD --

Điều đó sẽ hiển thị nhánh hiện tại.

Tài liệu tham khảo:


3643
2017-08-27 12:33



@ChrisNelson, bởi vì nó chỉ hiển thị các chi nhánh hiện tại, chứ không phải là một danh sách dài của tất cả các chi nhánh. - avakar
Tốt nhất, thật đáng buồn nó không hoạt động nếu bạn đang ở trong trạng thái 'tách rời' (nó chỉ xuất ra 'HEAD', điều đó hoàn toàn vô dụng). - Carlos Campderrós
Tôi đoán bởi git internals nếu bạn đang ở trong trạng thái 'tách rời', không có sự theo dõi của nhánh nó thuộc về, bởi vì git branch trình diễn * (no branch), cũng vô dụng ... - Carlos Campderrós
"git symbolic-ref --short HEAD" cũng hoạt động cho cùng mục đích này - dusktreader
git rev-parse --abbrev-ref HEAD 2>/dev/null  Phần / dev / null ngăn bạn nhìn thấy lỗi nếu bạn vừa tạo một kho lưu trữ mới chưa có HEAD. - Paradiesstaub


Bạn cũng có git symbolic-ref HEAD hiển thị toàn bộ refspec.

Để chỉ hiển thị tên chi nhánh trong Git v1.8 trở lên (cảm ơn Greg vì đã chỉ ra điều đó):

$ git symbolic-ref --short HEAD

Trên Git v1.7 + bạn cũng có thể làm:

$ git rev-parse --abbrev-ref HEAD

Cả hai nên cung cấp cho cùng một tên chi nhánh nếu bạn đang ở trên một chi nhánh. Nếu bạn đang ở trên một câu trả lời đầu tách rời khác nhau.

Chú thích:

Trên một khách hàng trước đó, điều này dường như làm việc:

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

- - Darien 26. Tháng 3 năm 2014


399
2017-08-08 15:55



Như tất cả các câu trả lời khác, điều này không hiệu quả khi bạn ở trạng thái 'tách rời' - Carlos Campderrós
@ CarlosCampderrós: ​​nếu bạn ở trạng thái HEAD bị tách rời, không có thứ gì như một nhánh hiện tại. Sau khi tất cả, cam kết mà bạn đang ở trong có thể đạt được bằng không, một hoặc nhiều chi nhánh. - Flimm
điều này gây ra vấn đề trong kho lưu trữ git trống khi không có HEAD - Arne
Với phiên bản git 2.4.4 git rev-parse --abbrev-ref HEAD trình diễn HEAD khi bạn đang ở trên đầu tách rời. - peterhil
Câu trả lời hay nhất vẫn là git symbolic-ref HEAD | sed -e "s/^refs\/heads\///"  vì nó sẽ hiển thị một chuỗi như HEAD detached at a63917f khi ở trạng thái tách rời, không giống như các câu trả lời khác hiển thị hoặc không có gì hoặc HEAD. Cái này quan trọng. - Alkaline


Để tôi tham khảo (nhưng nó có thể hữu ích cho người khác) Tôi đã giới thiệu tổng quan về các kỹ thuật (dòng lệnh cơ bản) được đề cập trong chủ đề này, mỗi kỹ thuật được áp dụng cho một số trường hợp sử dụng: HEAD là (chỉ vào):

  • chi nhánh địa phương (chính)
  • từ xa theo dõi chi nhánh, đồng bộ với chi nhánh địa phương (nguồn gốc / chủ tại cùng một cam kết như chủ)
  • chi nhánh theo dõi từ xa, không đồng bộ với chi nhánh địa phương (origin / feature-foo)
  • thẻ (v1.2.3)
  • đầu tách rời chung (không có cái nào ở trên)

Các kết quả:

  • git branch | sed -n '/\* /s///p'
    • chi nhánh địa phương: master
    • chi nhánh theo dõi từ xa (đồng bộ): (detached from origin/master)
    • chi nhánh theo dõi từ xa (không đồng bộ): (detached from origin/feature-foo)
    • nhãn: (detached from v1.2.3)
    • chung rời đầu: (detached from 285f294)
  • git status | head -1
    • chi nhánh địa phương: # On branch master
    • chi nhánh theo dõi từ xa (đồng bộ): # HEAD detached at origin/master
    • chi nhánh theo dõi từ xa (không đồng bộ): # HEAD detached at origin/feature-foo
    • nhãn: # HEAD detached at v1.2.3
    • chung rời đầu: # HEAD detached at 285f294
  • git describe --all
    • chi nhánh địa phương: heads/master
    • chi nhánh theo dõi từ xa (đồng bộ): heads/master (chú thích: không phải  remotes/origin/master)
    • chi nhánh theo dõi từ xa (không đồng bộ): remotes/origin/feature-foo
    • nhãn: v1.2.3
    • chung rời đầu: v1.0.6-5-g2393761
  • cat .git/HEAD:
    • chi nhánh địa phương: ref: refs/heads/master
    • tất cả các trường hợp sử dụng khác: SHA của cam kết tương ứng
  • git rev-parse --abbrev-ref HEAD
    • chi nhánh địa phương: master
    • tất cả các trường hợp sử dụng khác: HEAD
  • git symbolic-ref --short HEAD
    • chi nhánh địa phương: master
    • tất cả các trường hợp sử dụng khác: fatal: ref HEAD is not a symbolic ref

(FYI điều này được thực hiện với phiên bản git 1.8.3.1)


168
2017-10-25 08:53



Tóm lại, không ai có vẻ làm được những gì tôi sẽ làm bằng tay. - bukzor
Điều này khá hữu ích đối với tôi: git describe --all --exact-match 2>/dev/null | sed 's=.*/==' là giải pháp tốt nhất cho tôi (tên tốt cho các thẻ và đầu chi nhánh, không có đầu ra cho các đầu tách rời ngẫu nhiên. - Alex Dupuy
Tuy nhiên, tôi vừa phát hiện ra rằng sử dụng git describe có lỗi nghiêm trọng khi có nhiều chi nhánh tham chiếu cùng một cam kết, ví dụ: ngay sau khi git checkout -b foo - nó sử dụng một trong số chúng một cách tùy ý (có vẻ như có thể được tạo ra gần đây nhất). Tôi sẽ thay đổi chiến lược của mình để sử dụng kết quả được lọc từ git branchvà chỉ sử dụng git describe nếu kết quả là một cái gì đó về một đầu tách rời. - Alex Dupuy
Thực ra, tôi cần sử dụng git branch --no-color để đảm bảo rằng tên tệp không có mã thoát khỏi thiết bị đầu cuối gây phiền nhiễu. - Alex Dupuy
Điều này đã thực sự hữu ích đối với tôi nhiều lần, cảm ơn vì đã quá kỹ lưỡng! - Alice Purcell


Một lựa chọn khác:

git name-rev --name-only HEAD

118
2017-11-02 19:17



nó cũng có thể được lấy với echo ${$(git symbolic-ref --quiet HEAD)#refs/heads/} - Antoine
Nó không hoạt động nếu HEAD giống nhau đối với nhánh chính và đặc điểm (ví dụ: trong quá trình hợp nhất). Nó trả về 'master' ngay cả khi được thực thi trên nhánh feature. - Orest Hera
git checkout master && git name-rev --name-only HEAD # ac-187 Nó không hoạt động như mong đợi - Alexander Abashkin
Tôi lưu điều này vào một biến ngay trước khi hợp nhất và cũng trong trường hợp HEAD của tôi có thể bị loại bỏ nếu tôi kiểm tra một cam kết cụ thể. Trong trường hợp này hoạt động tốt. - Ishaan Sejwal
Tôi đang làm điều này từ một đường ống Jenkins. Vì vậy, điều này dường như là thời gian là câu trả lời tốt nhất cho tôi. Đang làm git branch --list chỉ nói * (HEAD detached at 7127db5). Đang làm git rev-parse --abbrev-ref HEAD chỉ nói HEAD và vân vân. - Mig82


Cũng đủ đơn giản, tôi đã nhận nó trong một lớp lót (bash)

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

(credit: Limited Atonement)

Và trong khi tôi ở đó, một nhánh để lấy nhánh theo dõi từ xa (nếu có)

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

87
2018-04-04 15:20



Quá nhiều dấu gạch chéo! :) sed -n 's/\* //p' không lừa. Mặc dù tôi có khuynh hướng hướng đến hoang tưởng nên tôi sẽ neo nó với sed -n 's/^\* //p'. - Mark Reed


Bạn có thể chỉ cần gõ vào dòng lệnh (console) trên Linux, trong thư mục kho lưu trữ:

$ git status

và bạn sẽ thấy một số văn bản, trong đó một cái gì đó tương tự như:

...
On branch master
...

có nghĩa là bạn hiện đang ở master chi nhánh. Nếu bạn đang chỉnh sửa bất kỳ tệp nào tại thời điểm đó và nó nằm trong cùng một kho lưu trữ cục bộ (thư mục cục bộ chứa các tệp nằm trong quản lý kiểm soát phiên bản Git), bạn đang chỉnh sửa tệp trong nhánh này.


49
2018-06-05 20:31



Dựa trên những gì bạn muốn làm, bạn có thể sử dụng git status và chỉ nhận được dòng đầu ra đầu tiên với git status | head -1 mang lại một cái gì đó như # On branch master. Tôi chắc chắn rằng sự khác biệt về phiên bản cũng sẽ cần được tính toán. - Joshua Pinter
@ JoshPinter: Bạn cũng có thể sử dụng git status | grep 'On branch', nên có cùng một hiệu ứng (nên, không có nghĩa là nếu phiên bản Git của bạn hiển thị theo cách khác). Hoặc là git branch | grep '*', sẽ hiển thị tên của chi nhánh với một ngôi sao ở đầu nó. - Tadeck
Yep, hoạt động tốt và có thể linh hoạt hơn. Kết quả cuối cùng của tôi để chỉ hiển thị tên chi nhánh trong ứng dụng dev Rails là: <tick>git status | head -1<tick>.gsub('# On branch ', '') - Joshua Pinter
git status có thể mất một thời gian dài để trả về một giá trị nếu có rất nhiều tệp đang được quản lý. - the Tin Man


git symbolic-ref -q --short HEAD

Tôi sử dụng điều này trong các script cần tên nhánh hiện tại. Nó sẽ hiển thị cho bạn tham chiếu biểu tượng ngắn hiện tại tới HEAD, đây sẽ là tên nhánh hiện tại của bạn.


26
2017-10-02 22:09



Cảm ơn, hoạt động tuyệt vời! - Tôi cũng thêm "-C path_to_folder" trong kịch bản của tôi với điều này. - Tony


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

sẽ chỉ hiển thị tên chi nhánh


24
2018-06-14 13:08



Nếu nhánh của bạn hiển thị như thế này "* (HEAD tách ra tại SUM_BRANCH_01)", sau đó thử "git branch | grep -e" ^ * "| cắt -d '' -f 5 | cut -d ')' -f 1 " - Dylan Kapp
Tôi vừa tạo chính kịch bản lệnh này để lấy tên nhánh hiện tại. Tôi figured nó có thể giúp với diffs. - tggagne


Tìm thấy một giải pháp dòng lệnh có cùng độ dài như Oliver Refalo's, sử dụng tốt ol 'awk:

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

awk đọc rằng "làm những thứ trong {} Theo mặc định, nó giả định các trường được phân cách bằng khoảng trắng, vì vậy bạn in thứ hai, nếu bạn có thể giả định rằng chỉ có dòng với nhánh của bạn có *, bạn có thể thả ^. Ah, bash golf!


21
2018-02-19 22:50