Tìm hiểu chi nhánh từ xa mà chi nhánh địa phương đang theo dõi


842

Xem thêm:
Làm cách nào tôi có thể thấy các nhánh Git đang theo dõi nhánh từ xa / ngược dòng nào?

Làm thế nào tôi có thể tìm ra chi nhánh từ xa mà chi nhánh địa phương đang theo dõi?

Tôi có cần phân tích git configđầu ra không, hoặc có một lệnh sẽ làm điều này cho tôi không?


18
Sheesh. Đây không phải là một bản sao chính xác. Đây là một tập hợp con khác, nhưng có nhiều cách khác để làm câu hỏi ra, như thế nào git remote show origin. Câu trả lời chính trong câu hỏi khác là một tập lệnh bash bao quanh câu trả lời đơn giản ở đây, có thể hữu ích với một số người. Hy vọng rằng câu hỏi này sẽ không hoàn toàn đóng cửa.
cdunn2001

5
Đồng ý, điều này chắc chắn không nên là một bản dupe. Đó là hỏi một cái gì đó hoàn toàn khác với câu hỏi được liên kết
Adam Batkin

Câu trả lời:


1003

Đây là một lệnh cung cấp cho bạn tất cả các nhánh theo dõi (được định cấu hình cho 'pull'), xem:

$ git branch -vv
  main   aaf02f0 [main/master: ahead 25] Some other commit
* master add0a03 [jdsumsion/master] Some commit

Bạn phải lội qua SHA và bất kỳ thông điệp cam kết dài dòng nào, nhưng thật nhanh chóng để nhập và tôi nhận được các nhánh theo dõi được căn chỉnh theo chiều dọc trong cột thứ 3.

Nếu bạn cần thông tin về cả cấu hình 'kéo' và 'đẩy' trên mỗi nhánh, hãy xem câu trả lời khác trên git remote show origin.


Cập nhật

Bắt đầu từ phiên bản git 1.8.5, bạn có thể hiển thị nhánh ngược dòng với git statusgit status -sb


6
Đầu ra này trực tiếp hơn git branch -avhoặc git remote show origin, cung cấp cho bạn RẤT NHIỀU dữ liệu, không chỉ là điều khiển từ xa được theo dõi
SimplGy

60
BTW, phiên bản mới nhất của git (1.8.5.x) hiện cũng hiển thị nhánh ngược dòng trong git statusgit status -sb- vì vậy một khi bạn nâng cấp lên 1.8.5.x, câu hỏi này (và câu trả lời) là không liên quan.
jdsumsion 17/12/13

11
Trong khi điều này cung cấp cho bạn thông tin bạn muốn, tôi sẽ không đồng ý vì đó là câu trả lời chính xác. Đó là một câu trả lời giống như cách cho ai đó một từ điển trả lời "làm thế nào để bạn đánh vần XYZ". trong trường hợp, bạn muốn sử dụng câu trả lời kết quả (tên chi nhánh) cho một số thao tác .. Câu trả lời này chỉ giúp tôi thấy nó một cách trực quan ... không cung cấp cho bạn một cái gì đó có thể sử dụng được trong một lệnh tiếp theo.
UpAndAdam

Đầu ra của lệnh này có thể gây hiểu nhầm vì thông điệp cam kết có thể dễ dàng bắt đầu bằng ví dụ "[tính năng của tôi] ...". Vui lòng xem câu trả lời của @ cdunn2001 chỉ hiển thị nhánh ngược dòng (nếu có) và không có gì khác.
Jonas Berlin

1
Tôi đồng ý với câu trả lời của @ jonas-berlin - cdunn2001 sẽ tốt hơn nếu bạn muốn phân tích kết quả - câu trả lời của tôi là tốt nếu bạn đang tìm kiếm một lệnh đơn giản và sẵn sàng quét trực quan đầu ra
jdsumsion 22/03/2016

372

Hai lựa chọn:

% git rev-parse --abbrev-ref --symbolic-full-name @{u}
origin/mainline

hoặc là

% git for-each-ref --format='%(upstream:short)' "$(git symbolic-ref -q HEAD)"
origin/mainline

12
Đẹp! Cái đầu tiên đưa ra các lỗi xấu trong trường hợp không có gì được theo dõi, trong khi cái thứ hai đặc biệt hữu ích cho việc viết kịch bản. BTW %(refname:short)là tên của ref hiện tại trong --format.
Tino

9
git help revisions(một trong những phần ít được biết đến nhưng hữu ích nhất của các tài liệu) và tìm kiếm upstream.
cdunn2001

15
Câu trả lời này tốt hơn nhiều so với hai câu trả lời ở trên, đặc biệt nếu bạn muốn làm một cái gì đó nhưgit diff `git rev-parse --abbrev-ref --symbolic-full-name @{upstream}`
Jian

2
Điều này thực sự hữu íchecho 'git for-each-ref --format=\'%(refname:short) -> %(upstream:short)\' refs/heads/$1' > ~/bin/git-show-upstream; chmod +x ~/bin/git-show-upstream
albfan

6
Nếu bạn muốn tìm ra thượng nguồn cho một số chi nhánh khác, một biến thể của lựa chọn thứ hai là: git for-each-ref --format='%(upstream:short)' $(git rev-parse --symbolic-full-name SOMEBRANCH)thay thế SOMEBRANCH bằng tên chi nhánh hoặc "ĐẦU" cho chi nhánh hiện tại
Jonas Berlin

220

Tôi nghĩ rằng git branch -avchỉ cho bạn biết những chi nhánh bạn có và cam kết của họ, khiến bạn phải suy luận những chi nhánh từ xa mà các chi nhánh địa phương đang theo dõi.

git remote show originnói rõ cho bạn biết nhánh nào đang theo dõi nhánh nào từ xa. Đây là ví dụ đầu ra từ một kho lưu trữ với một cam kết duy nhất và một nhánh từ xa được gọi là 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

đấu với

$ 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)

3
Tôi cần một lệnh phát hiện ra nhánh ngược dòng, vì vậy sử dụng 'origin' làm đầu vào đang tạo ra một giả định, vì vậy điều này không hiệu quả với tôi
Alexander Mills

1
Nhưng điều này KHÔNG trả lời OP. Lệnh git remote show originhiển thị cho bạn các nhánh cục bộ và những gì chúng theo dõi cho cả đẩy và kéo.
dudewad

1
@dudewad Tôi nghĩ rằng vấn đề là lệnh này giả định rằng điều khiển từ xa được gọi origin, trong khi nó thực sự có thể là bất cứ điều gì (ví dụ: nhiều điều khiển từ xa, với các nhánh khác nhau theo dõi các nhánh từ các điều khiển từ xa khác nhau).
Ruslan

74

Cập nhật: Vâng, đã vài năm kể từ khi tôi đăng bài này! Với mục đích cụ thể của tôi là so sánh HEAD với ngược dòng, bây giờ tôi sử dụng @{u}, đây là một phím tắt đề cập đến HEAD của nhánh theo dõi ngược dòng. (Xem https://git-scm.com/docs/gitrevutions#gitrevutions-emltbranchnamegtupstreamemegemmasterupstreamememuem ).

Câu trả lời gốc: Tôi cũng đã chạy qua vấn đề này. Tôi thường sử dụng nhiều điều khiển từ xa trong một kho lưu trữ duy nhất và thật dễ dàng để quên chi nhánh nào hiện tại của bạn đang theo dõi. Và đôi khi thật hữu ích khi biết điều đó, chẳng hạn như khi bạn muốn xem xét các cam kết địa phương của mình thông qua git log remotename/branchname..HEAD.

Tất cả nội dung này được lưu trữ trong các biến cấu hình git, nhưng bạn không phải phân tích đầu ra cấu hình git. Nếu bạn gọi git config theo sau là tên của một biến, nó sẽ chỉ in giá trị của biến đó, không cần phân tích cú pháp. Với ý nghĩ đó, đây là một số lệnh để nhận thông tin về thiết lập theo dõi chi nhánh hiện tại của bạn:

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`

Trong trường hợp của tôi, vì tôi chỉ muốn tìm ra tên của điều khiển từ xa hiện tại của tôi, tôi làm điều này:

git config branch.`git name-rev --name-only HEAD`.remote

2
Điều này rất hữu ích trong việc tạo ra một bí danh để phản đối bất kể chi nhánh hiện tại của tôi là gì. Cảm ơn!
Justin Spahr-Summers

Tương tự như vậy cũng hữu ích cho bí danh 'nhanh chóng' của chúng tôi, điều này sẽ đưa nhánh theo dõi cục bộ đến điều khiển từ xa miễn là thao tác này được tiến hành nhanh.
Altreus

4
Trên thực tế tôi phát hiện ra điều này git name-rev --name-only HEADsẽ không cho bạn biết bạn thực sự ở chi nhánh nào. Cho rằng tôi vừa sử dụnggit branch | grep '^\*' | cut -d' ' -f2
Altreus

1
Cảm ơn! Các câu trả lời khác cho các câu hỏi tương tự không đề cập đến @{u}bí danh / phím tắt và đó chính xác là những gì tôi đang tìm kiếm! Không có lý do để so sánh với nhánh chính nếu bạn chỉ muốn xác định xem bạn có cần kéo hay không.
Dan M.

1
@{u}là quả bom. Và đã có từ ngày 1.7.0, điều đó có nghĩa là nếu nó không có sẵn trong một git mà ai đó đang sử dụng vào năm 2018, thì có lẽ họ đã được nâng cấp.
Chris Cleeland

48

Các chi nhánh địa phương và điều khiển từ xa của họ.

git branch -vv 

Tất cả các chi nhánh và theo dõi từ xa.

git branch -a -vv

Xem nơi các nhánh cục bộ được cấu hình rõ ràng để đẩy và kéo.

git remote show {remote_name}

21

Điều này sẽ cho bạn thấy chi nhánh bạn đang ở:

$ git branch -vv

Điều này sẽ chỉ hiển thị chi nhánh hiện tại bạn đang trên:

$ git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)

ví dụ:

myremote/mybranch

Bạn có thể tìm ra URL của điều khiển từ xa được sử dụng bởi chi nhánh hiện tại bạn đang sử dụng :

$ git remote get-url $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)|cut -d/ -f1)

ví dụ:

https://github.com/someone/somerepo.git

19

Bạn có thể sử dụng git checkout, tức là "kiểm tra chi nhánh hiện tại". Đây là một no-op với tác dụng phụ để hiển thị thông tin theo dõi, nếu tồn tại, cho chi nhánh hiện tại.

$ git checkout 
Your branch is up-to-date with 'origin/master'.

17

Tôi không biết nếu điều này được tính là phân tích cú pháp đầu ra của git config, nhưng điều này sẽ xác định URL của điều khiển từ xa mà chủ đang theo dõi:

$ git config từ xa. $ (git config Branch.master.remote) .url

Hoặc git config branch.$(git symbolic-ref -q HEAD).remotenếu bạn chỉ muốn tên của điều khiển từ xa được theo dõi của nhánh hiện tại của Google git config remote.$(git config branch.$(git symbolic-ref -q HEAD).remote).urlcho URL.
Anakhand

Tôi cần thêm --shorttùy chọn để nó hoạt động. Vì vậy, để có được tên từ xa của chi nhánh hiện tại: git config branch.$(git symbolic-ref -q --short HEAD).remotevà để nhận URL của điều khiển từ xa của chi nhánh hiện tại:git config remote.$(git config branch.$(git symbolic-ref -q --short HEAD).remote).url
Nelson

13

Một cách khác

git status -b --porcelain

Điều này sẽ cung cấp cho bạn

## BRANCH(...REMOTE)
modified and untracked files

10

Một cách đơn giản khác là sử dụng

cat .git/config trong một repo git

Điều này sẽ liệt kê chi tiết cho các chi nhánh địa phương


Hoạt động độc đáo trên Linux. Sẽ không hoạt động trên Windows trừ khi trong lời nhắc giống như Unix (ví dụ: cygwin hoặc git bash).
Contango

Trong Windows chỉ cần sử dụng type .git/configthay vì cat .git/configtất nhiên trên dòng lệnh đơn giản ..
khmarbaise

9

Một phương pháp khác (cảm ơn osse), nếu bạn chỉ muốn biết liệu nó có tồn tại hay không:

if git rev-parse @{u} > /dev/null 2>&1
then
  printf "has an upstream\n"
else
  printf "has no upstream\n"
fi

Ngôn ngữ nào? Điều này trông giống như một kịch bản shell Linux nhưng không cung cấp thông tin hoặc bối cảnh nào khác.
Suncat2000

8

git branch -vv | grep 'BRANCH_NAME'

git branch -vv : Phần này sẽ hiển thị tất cả các chi nhánh địa phương cùng với chi nhánh thượng nguồn của họ.

grep 'BRANCH_NAME' : Nó sẽ lọc chi nhánh hiện tại từ danh sách chi nhánh.



5

Liệt kê cả các chi nhánh địa phương và từ xa:

$ git branch -ra

Đầu ra:

  feature/feature1
  feature/feature2
  hotfix/hotfix1
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/master

3

đầu ra sứ git-status (có thể đọc bằng máy) v2 trông như thế này:

$ git status -b --porcelain=v2
# branch.oid d0de00da833720abb1cefe7356493d773140b460
# branch.head the-branch-name
# branch.upstream gitlab/the-branch-name
# branch.ab +2 -2

Và để có được chi nhánh ngược dòng:

$ git status -b --porcelain=v2 | grep -m 1 "^# branch.upstream " | cut -d " " -f 3-
gitlab/the-branch-name

Nếu nhánh không có dòng ngược, lệnh trên sẽ tạo ra một đầu ra trống (hoặc thất bại với set -o pipefail).


2

Nếu bạn muốn tìm ngược dòng cho bất kỳ nhánh nào (trái ngược với chỉ bạn đang ở trên), đây là một sửa đổi nhỏ cho câu trả lời của @ cdunn2001:

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

Điều đó sẽ cung cấp cho bạn tên chi nhánh từ xa cho chi nhánh địa phương được đặt tên YOUR_LOCAL_BRANCH_NAME.


2

Bạn có thể thử điều này:

git remote show origin | grep "branch_name"

branch_name cần phải được thay thế với chi nhánh của bạn


Điều gì xảy ra nếu tên chi nhánh của bạn cũng phù hợp với các chi nhánh khác? Điều gì xảy ra tên chi nhánh của bạn khớp với một số văn bản khác trong đầu ra của git remote show origin- nếu nó được gọi mergeshoặc configure?
Tom Swirly

không hiểu bạn bạn có nghĩa là nhiều chi nhánh có cùng tên
xpione

1

Tôi sử dụng bí danh này

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  
" -'

sau đó

git track

lưu ý rằng tập lệnh cũng có thể được sử dụng để thiết lập theo dõi.

Nhiều bí danh tuyệt vời hơn tại https://github.com/orefalo/bash-profiles


0

Tôi sử dụng EasyGit (còn gọi là "vd") như một trình bao bọc siêu nhẹ ở trên (hoặc dọc theo) Git. EasyGit có một tiểu ban "thông tin" cung cấp cho bạn tất cả các loại thông tin siêu hữu ích, bao gồm cả chi nhánh theo dõi từ xa hiện tại. Đây là một ví dụ (trong đó tên chi nhánh hiện tại là "foo"):

poulz @ s883422: (foo) ~ / không gian làm việc / bd
$ ví dụ thông tin
Tổng số cam kết: 175
Kho lưu trữ cục bộ: .git
Kho lưu trữ từ xa được đặt tên: (tên -> vị trí)
  nguồn gốc -> git: //sahp7577/home/poulz/bd.git
Chi nhánh hiện tại: foo
  Kiểm tra mật mã (sha1sum): bd248d1de7d759eb48e8b5ff3bfb3bb0eca4c5bf
  Kho lưu trữ kéo / đẩy mặc định: origin
  Tùy chọn kéo / đẩy mặc định:
    chi nhánh.foo.remote = nguồn gốc
    chi nhánh.foo.merge = refs / Heads / aal_devel_1
  Số người đóng góp: 3
  Số lượng tệp: 28
  Số lượng thư mục: 20
  Kích thước tệp lớn nhất, tính bằng byte: 32473 (pygooglechart-0.2.0 / SAO CHÉP)
  Cam kết: 62

0

Cải thiện câu trả lời này , tôi đã đưa ra những .gitconfigbí danh:

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

ngôn ngữ đó là gì?
Daniel Farrell

3
@Dan Farrell: vỏ. Bí danh bắt đầu bằng a! sử dụng / thùng / sh. Các trích dẫn kép được trích dẫn cho tập tin cấu hình của git.
Tom Hale

0

Nếu bạn đang sử dụng 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
    }

-2

Lệnh sau sẽ từ xa nguồn gốc hiện tại đang đề cập đến

git từ xa -v

Để thêm một đường dẫn từ xa,

git từ xa thêm nguồn gốc path_name


Ở đây bạn không tìm thấy đường dẫn từ xa - bạn đang thêm
serup
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.