Làm thế nào để biết chi nhánh địa phương nào đang theo dõi chi nhánh từ xa nào trong Git?


234

Tôi muốn biết liệu có cách nào để biết chi nhánh địa phương nào đang theo dõi chi nhánh từ xa nào trong Git không.

Tôi đang sử dụng một máy chủ từ xa, được đặt tên là "nguồn gốc".


Chỉnh sửa cho tôi nếu tôi sai tuy nhiên không phải là một nhánh từ xa được đặt tên gốc theo mặc định chứ không phải máy chủ ??
Chris Halcrow

Câu trả lời:


196

Sử dụng ví dụ về bản sao Puppet của tôi đã được kiểm tra từ kho lưu trữ Git ngược dòng trên Github.com ...

$ git remote show origin
* remote origin
  Fetch URL: git://github.com/reductivelabs/puppet.git
  Push  URL: git://github.com/reductivelabs/puppet.git
  HEAD branch: master
  Remote branches:
    0.24.x                 tracked
    0.25.x                 tracked
    2.6.x                  tracked
    master                 tracked
    next                   tracked
    primordial-ooze        tracked
    reins-on-a-horse       tracked
    testing                tracked
    testing-17-march       tracked
    testing-18-march       tracked
    testing-2-april        tracked
    testing-2-april-midday tracked
    testing-20-march       tracked
    testing-21-march       tracked
    testing-24-march       tracked
    testing-26-march       tracked
    testing-29-march       tracked
    testing-31-march       tracked
    testing-5-april        tracked
    testing-9-april        tracked
    testing4268            tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

Sau đó, nếu tôi đã thực hiện như sau:

$ git checkout -b local_2.6 -t origin/2.6.x 
Branch local_2.6 set up to track remote branch 2.6.x from origin.
Switched to a new branch 'local_2.6'

Và cuối cùng chạy lại git remote show originlệnh một lần nữa, sau đó tôi sẽ thấy phần dưới gần phía dưới:

  Local branches configured for 'git pull':
    local_2.6 merges with remote 2.6.x
    master    merges with remote master

1
Điều này có nghĩa là bạn có thể theo dõi tất cả các nhánh từ xa trong con rối mặc dù bạn có một vài nhánh cục bộ. Có bao nhiêu dấu hiệu "được theo dõi" có nghĩa là bạn thấy trong kết quả của lệnh? "Theo dõi" bởi chi nhánh địa phương nào?
PJ.

Các nhánh từ xa được theo dõi trong đó nếu bạn thực hiện git fetchhoặc git pullcập nhật lên các nhánh từ xa sẽ được theo dõi trong kho lưu trữ nhân bản của bạn. Các nhánh cục bộ chỉ là như vậy, các nhánh cục bộ của các nhánh từ xa và do đó cập nhật cho các nhánh từ xa sẽ được theo dõi và hợp nhất khi lệnh thích hợp để làm như vậy được đưa ra. Tôi rõ ràng bao gồm tùy chọn '-t' khi tạo nhánh cục bộ để đảm bảo nó theo dõi nhánh mà nó bắt nguồn từ đó. Hãy nhớ rằng một chi nhánh địa phương cũng có thể theo dõi một chi nhánh địa phương khác để không phải là một chi nhánh từ xa.
Jeremy Bouse

5
@PJ: Thuật ngữ theo dõi trực tuyến có hai ý nghĩa riêng biệt trong Git. Các dòng được theo dõi trên các dòng khác nhau được git remote show remote-nameđề cập đến các nhánh theo dõi trên nền tảng khác (các ảnh chụp nhanh của các nhánh từ kho lưu trữ từ xa). Các dòng sáp nhập với các dòng khác đề cập đến các nhánh địa phương có cấu hình nhánh nhánh ngược dòng của Google (được thực hiện với tùy chọn --track/ -tcủa nhánh git hoặc thanh toán git và do đó thường bị nhầm lẫn với các nhánh theo dõi của Drake).
Chris Johnsen

" Chi nhánh theo dõi từ xa " là mục từ điển cập nhật cho "chi nhánh theo dõi" được đề cập ở trên. Tài liệu đã được cập nhật trong 8b3f3f84 .
vào

124

Đối với tất cả các chi nhánh:

git branch -avv

Chỉ dành cho các chi nhánh địa phương:

git branch -lvv

Chỉ dành cho các chi nhánh từ xa:

git branch -rvv

cho bạn thấy tất cả các nhánh cũng như tên của nhánh ngược dòng.


2
Đây là câu trả lời đơn giản và đầy đủ nhất!

6
Trên phiên bản git 1.7.7.5, nó hiển thị cho tôi chi nhánh địa phương và sha-1 mà nó trỏ đến, nhưng nó không hiển thị chi nhánh từ xa được theo dõi ...
mpontillo

Hoạt động với tôi trên phiên bản git 1.7.4.1 'v' thứ hai là bắt buộc để hiển thị nhánh theo dõi từ xa.
Peter Johnson

4
để giảm sản lượng, git branch -lvvchỉ hiển thị các nhánh cục bộ với thượng nguồn có thể hữu ích
AB

5
^ git branch -vvlàm việc cho tôi ...
notacouch

52

Jeremy Bouse minh họa cách git remote showhiển thị thông tin theo dõi . Điều đó là đủ nếu bạn chỉ muốn thông tin cho con người.

Nếu bạn có kế hoạch sử dụng thông tin trong ngữ cảnh tự động (ví dụ: tập lệnh), bạn nên sử dụng mức thấp hơn ( git for-each-refThay thế hệ thống ống nước) .

% git remote show origin
* remote origin
⋮
  Local branches configured for 'git pull':
    master merges with remote master
    pu     merges with remote pu
⋮
% git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads
master <- origin/master
pu <- origin/pu

Mã thông báo git for-each-refđã học %(upstream)trong Git 1.6.3 . Với các phiên bản Git trước đó, bạn sẽ phải trích xuất thông tin theo dõi git config branch.<name>.remotegit config branch.<name>.merge(có thể sử dụng git for-each-refđể xây dựng các lệnh cho từng tên nhánh cục bộ).


Đầu ra câu trả lời của bạn ngắn gọn hơn và dễ theo dõi hơn, vì vậy bạn nhận được phiếu bầu lên :)
Cuba

Để làm cho nó bớt gọn gàng hơn, nhưng cung cấp một cách hay để kiểm tra trực quan rằng các tên từ xa có giống với tên chi nhánh địa phương hay không, một git gotcha phổ biến: trong bashgit for-each-ref --format=$'\n'' '' '' '' '' '' ''/%(refname:short);%(upstream:short)' refs/heads | tr ';' $'\n'
hobs

19

Đối với một nhánh cụ thể, bạn có thể sử dụng git rev-parsevới @{u}hoặc @{upstream}hậu tố trên tên nhánh, ví dụ:

$  git rev-parse --symbolic-full-name master@{u}
refs/remotes/github-mhl/master

... hoặc cho dạng viết tắt, thêm --abbrev-ref

$ git rev-parse --symbolic-full-name --abbrev-ref master@{u}
github-mhl/master

Bạn thường có thể sử dụng branch@{upstream}cú pháp bất cứ nơi nào một cam kết được mong đợi.


1
+1 Câu trả lời của bạn đã cho tôi chính xác những gì tôi cần: git rev-parse --symbolic-full-name HEADvs. git rev-parse --symbolic-full-name HEAD@{u}, cảm ơn!
Tino

10

Tôi sử dụng tập lệnh shell sau (có tên git-tracks) để hiển thị nhánh từ xa được theo dõi bởi nhánh hiện tại:

#!/bin/sh -e
branch=$(git symbolic-ref HEAD)
branch=${branch##refs/heads/}
remote=$(git config "branch.${branch}.remote")
remoteBranch=$(git config "branch.${branch}.merge")
remoteBranch=${remoteBranch##refs/heads/}

echo "${remote:?}/${remoteBranch:?}"

Điều này cũng có thể sử dụng được đề cập git for-each-ref, nhưng tôi thấy việc truy cập trực tiếp có phần đơn giản hơn so với việc lọc đầu ra cho nhánh hiện tại.


Bạn có thể cân nhắc sử dụng "set -e" ở đầu tập lệnh. Điều đó sẽ cho phép bạn xóa tất cả các phiên bản của "|| exit $?" trong khi vẫn giữ nguyên hành vi thất bại sớm.
John Whitley

@JohnWhitley: Cảm ơn, tôi đã chỉnh sửa câu trả lời của mình. Tôi biết về set -e, nhưng thường dính vào kiểm tra rõ ràng. Nhưng trong trường hợp này, nó thực sự tốt hơn.
Ingo Karkat

Không làm việc cho tôi trên git version 1.9.4. Echos nothing :(
Ain

8

.git/config tập tin cũng sẽ cung cấp thông tin chi nhánh theo dõi như

[remote "Hub"]
    url = ssh://xxxx/tmp/Hub
    fetch = +refs/heads/*:refs/remotes/Hub/*
[branch "develop"]
    remote = Hub
    merge = refs/heads/develop
[branch "Dev1"]
    remote = Test
    merge = refs/heads/Dev1
[remote "Test"]
    url = ssh://xxxx/tmp/gittesting/Dev1GIT
    fetch = +refs/heads/*:refs/remotes/Test/*

5
git branch -vv

hiển thị chính xác những gì bạn yêu cầu. Nó cho thấy các nhánh cục bộ cùng với nhánh từ xa tương ứng mà chúng đang theo dõi.


2

Thêm các rune này vào [alias]phần của tệp .gitconfig của bạn:

show-tracking = !sh -c 'git ls-remote . |grep `git log -1 --grep="git-svn-id" --format=%H`|perl -pe "s/[[:alnum:]]+[[:space:]]//"'

0

Tôi cần tìm nhánh từ xa tương ứng (nếu có) cho mỗi nhánh cục bộ trong một vòng lặp đang hoạt động trên một danh sách các nhánh cục bộ. Tôi đã kết thúc bằng cách sử dụng như sau:

git for-each-ref --format='%(refname:short):%(upstream:short)' refs/heads | grep "^LocalBranchName:.*/" | sed "s/^LocalBranchName://"

Điều này sẽ không tạo ra gì (một chuỗi trống) cho các nhánh cục bộ không có nhánh từ xa tương ứng ("someremote / somebranch").


-1

Thử git branch với các tùy chọn :

 -r
List or delete (if used with -d) the remote-tracking branches. 

-a
List both remote-tracking branches and local branches. 

Nếu không, kiểm tra của bạn .git/config.


3
Họ hiển thị các chi nhánh, nhưng tôi không hiểu cái nào đang theo dõi.
PJ.
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.