Làm cách nào để liệt kê tất cả các nhánh từ xa trong Git 1.7+?


634

Tôi đã thử git branch -r, nhưng chỉ liệt kê các chi nhánh từ xa mà tôi đã theo dõi tại địa phương. Làm thế nào để tôi tìm thấy danh sách những người mà tôi không có? (Không quan trọng với tôi liệu lệnh có liệt kê tất cả các nhánh từ xa hay chỉ những nhánh không bị theo dõi.)


11
Bạn có nghĩa là bạn đã sửa đổi refspec mặc định, vì vậy git fetchgit remote updatekhông tìm nạp tất cả các nhánh của điều khiển từ xa? Bởi vì nếu không, bạn chỉ có thể tìm nạp sau đó sử dụng git branch -r...
Cascabel

2
Tôi phải có. git branch -rchỉ cho tôi thấy các chi nhánh từ xa mà tôi đã theo dõi tại địa phương. Bây giờ nó hoạt động tốt hơn.
James A. Rosen

Câu trả lời:


804

Đối với đại đa số [1] khách truy cập tại đây, câu trả lời chính xác và đơn giản nhất cho câu hỏi "Làm cách nào để liệt kê tất cả các chi nhánh từ xa trong Git 1.7+?" Là:

git branch -r

Đối với một thiểu số nhỏ [1] git branch -r không hoạt động. Nếu git branch -rkhông hoạt động hãy thử:

git ls-remote --heads <remote-name>

Nếu git branch -rkhông hoạt động, thì có thể như Cascabel nói "bạn đã sửa đổi refspec mặc định, vì vậy git fetchgit remote updatekhông lấy tất cả các remotenhánh" .


[1] Kể từ khi viết chú thích này 2018-Feb, tôi đã xem các bình luận và thấy rằng các git branch -rtác phẩm dành cho đại đa số (khoảng 90% hoặc 125 trên 140 ).

Nếu git branch -rkhông hoạt động, hãy kiểm tra git config --get remote.origin.fetchchứa ký tự đại diện ( *) theo câu trả lời này


15
Bạn cũng có thể làm git ls-remote [url]như vậy, bạn không phải sao chép nó trước :)
Zsub

142
Câu trả lời này đúng nhưng sai, điều đầu tiên người dùng đến đây từ các công cụ tìm kiếm nên xem là: git branch -rvì đó là câu trả lời đúng và đơn giản nhất, người hỏi đã có một trường hợp đặc biệt khi anh ta sửa đổi hành vi của mình git branch -rmà hầu hết người dùng đến đây sẽ không có
Stephan

24
@Stephan: bạn có chắc về điều này? git branch -rcũng không làm việc cho tôi. Nó chỉ liệt kê các chi nhánh đã được theo dõi tại địa phương. Nhưng git ls-remote --headsliệt kê tất cả các chi nhánh có sẵn trên kho lưu trữ từ xa ...
rexford

2
Nếu một người muốn tìm nạp từ các nhánh được liệt kê qua git ls-remote(và không được liệt kê tại git branch -r), người ta phải thực thi git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"trước khi tìm nạp như được mô tả tại stackoverflow.com/a/26649770/873282 .
koppor 14/2/2016

11
Đừng quên làm git fetch --alltrước để có được tất cả các chi nhánh từ xa hiện tại.
A. Attia

173

remote show hiển thị tất cả các nhánh trên điều khiển từ xa, bao gồm cả những nhánh không được theo dõi cục bộ và thậm chí cả những nhánh chưa được tìm nạp.

git remote show <remote-name>

Nó cũng cố gắng hiển thị trạng thái của các nhánh liên quan đến kho lưu trữ cục bộ của bạn:

> git remote show origin
* remote origin
  Fetch URL: C:/git/.\remote_repo.git
  Push  URL: C:/git/.\remote_repo.git
  HEAD branch: master
  Remote branches:
    branch_that_is_not_even_fetched new (next fetch will store in remotes/origin)
    branch_that_is_not_tracked      tracked
    branch_that_is_tracked          tracked
    master                          tracked
  Local branches configured for 'git pull':
    branch_that_is_tracked merges with remote branch_that_is_tracked
    master                 merges with remote master
  Local refs configured for 'git push':
    branch_that_is_tracked pushes to branch_that_is_tracked (fast-forwardable)
    master                 pushes to master                 (up to date)

Chính xác. Không lấy, không theo dõi cục bộ.
Thufir 15/2/2015

3
branch_that_is_not_tracked tracked?
Piotr Dobrogost

3
@PiotrDobrogost Vâng! branch_that_is_not_trackedlà một nhánh không được theo dõi bởi bất kỳ nhánh git địa phương nào. Tuy nhiên, nó đã được tìm nạp vào kho lưu trữ cục bộ (vì vậy có một nhánh từ xa). Đối với một số lý do kỳ lạ git remote showgọi trạng thái này tracked, mặc dù không có chi nhánh địa phương theo dõi điều khiển từ xa. Trong trường hợp này, trái ngược với trackednew, có nghĩa là "không lấy".
Klas Mellbourn

điều này không hoạt động theo chương trình, quá khó để phân tích
Alexander Mills

Điều này đã bắt gặp một trường hợp đặc biệt mà tôi có khi tôi đã kéo một nhánh từ xa cục bộ mà sau đó đã được gỡ bỏ trên điều khiển. Sau đó git branch -rgợi ý rằng vẫn còn một nhánh từ xa, nhưng git remote show origincho thấy điều đó refs/remotes/origin/my-now-dead-branch stale (use 'git remote prune' to remove). Hữu ích hơn nhiều!
icc97

53
git branch -a | grep remotes/*

10
Điều này về cơ bản tương đương với git branch -r, điều mà OP cho rằng không đủ tốt.
Cascabel

9
Trên thực tế cả hai git branch -agit branch -rliệt kê tất cả các chi nhánh từ xa cho tôi, tôi không chắc những gì OP nói là đúng. Tôi chỉ thiết lập một kho lưu trữ thử nghiệm và xác minh điều này (chỉ có nguồn gốc / chủ theo dõi chính nhưng vẫn thấy tất cả các nhánh từ xa có cả hai cờ).
Idan K

2
có vẻ như điều này không liệt kê tất cả các chi nhánh từ xa nếu tôi sao chép từ một repo hiện có và sau đó trỏ điểm gốc theo cách thủ công tại máy chủ git. Câu trả lời được chấp nhận xử lý trường hợp này.
nielsbot

Giải pháp này dường như không liệt kê các nhánh từ xa được tạo kể từ khi tôi tìm nạp lần cuối.
Anubian Noob

Điều kỳ lạ: Trong nhiều năm tôi đã sử dụng git fetchtheo sau git branch -a, điều mà chỉ gần đây mới bắt đầu thất bại đối với tôi. Có lẽ hành vi git đã được thay đổi?
Sebastian Mach

39

Sử dụng git branch -rdanh sách tất cả các chi nhánh từ xa và git branch -aliệt kê tất cả các chi nhánh trên địa phương và từ xa. Những danh sách này đã lỗi thời mặc dù. Để giữ cho các danh sách này được cập nhật, hãy chạy

git remote update --prune

sẽ cập nhật danh sách chi nhánh địa phương của bạn với tất cả những cái mới từ xa và loại bỏ bất kỳ cái nào không còn ở đó. Chạy lệnh cập nhật này mà không có --prune sẽ truy xuất các nhánh mới nhưng không xóa các nhánh không còn trên điều khiển từ xa.

Bạn có thể tăng tốc bản cập nhật này bằng cách chỉ định một điều khiển từ xa, nếu không nó sẽ kéo các bản cập nhật từ tất cả các điều khiển từ xa bạn đã thêm, như vậy

git remote update --prune origin

Điều này đã khắc phục sự cố của tôi - 'git chi nhánh -r' hiện hoạt động với tôi.
Francis Norton

27

Nhưng

git branch -ar

Hãy làm nó.


41
Truyền trong cả hai đối số là dư thừa. chỉ-r trả về các chi nhánh từ xa. trả về cả các chi nhánh địa phương từ xa. Do đó, và cả hai đều mang lại sản lượng như nhau. -agit branch -agit branch -ar
Walter Roman

19

Bạn cũng có thể làm git fetchtheo a git branch -r. Nếu không tìm nạp, bạn sẽ không thấy các nhánh mới nhất.


git fetch --allđể có tất cả các chi nhánh hiện tại
A. Attia

19

Phân nhánh Git - Chi nhánh từ xa

git ls-remote

Tài liệu Git .


git ls-remote - đầu để có kết quả cụ thể hơn
Wolfgang Fahl

1
Đây là lệnh duy nhất cũng liệt kê chi nhánh của tôi mà tôi vô tình đẩy mà không heads/vào refs/heads/features/my-branch, cảm ơn!
msa


9

TL; TR;

Đây là giải pháp cho vấn đề của bạn:

git remote update --prune    # To update all remotes
git branch -r                # To display remote branches

hoặc là:

git remote update --prune    # To update all remotes
git branch <TAB>             # To display all branches

5

Lệnh tốt nhất để chạy là git remote show [remote]. Điều này sẽ hiển thị tất cả các chi nhánh, từ xa và địa phương, theo dõi và không bị theo dõi.

Đây là một ví dụ từ một dự án nguồn mở:

> git remote show origin
* remote origin
  Fetch URL: https://github.com/OneBusAway/onebusaway-android
  Push  URL: https://github.com/OneBusAway/onebusaway-android
  HEAD branch: master
  Remote branches:
    amazon-rc2                   new (next fetch will store in remotes/origin)
    amazon-rc3                   new (next fetch will store in remotes/origin)
    arrivalStyleBDefault         new (next fetch will store in remotes/origin)
    develop                      tracked
    master                       tracked
    refs/remotes/origin/branding stale (use 'git remote prune' to remove)
  Local branches configured for 'git pull':
    develop merges with remote develop
    master  merges with remote master
  Local refs configured for 'git push':
    develop pushes to develop (local out of date)
    master  pushes to master  (up to date)

Nếu chúng ta chỉ muốn lấy các nhánh từ xa, chúng ta có thể sử dụng grep. Lệnh chúng tôi muốn sử dụng sẽ là:

grep "\w*\s*(new|tracked)" -E

Với lệnh này:

> git remote show origin | grep "\w*\s*(new|tracked)" -E
    amazon-rc2                   new (next fetch will store in remotes/origin)
    amazon-rc3                   new (next fetch will store in remotes/origin)
    arrivalStyleBDefault         new (next fetch will store in remotes/origin)
    develop                      tracked
    master                       tracked

Bạn cũng có thể tạo bí danh cho việc này:

git config --global alias.branches "!git remote show origin | grep \w*\s*(new|tracked) -E"

Sau đó, bạn có thể chạy git branches.




4

Chỉ cần chạy một git fetchlệnh. Nó sẽ kéo tất cả các nhánh từ xa vào kho lưu trữ cục bộ của bạn và sau đó thực hiện git branch -ađể liệt kê tất cả các nhánh.


1

Nếu có một chi nhánh từ xa mà bạn biết nên được liệt kê, nhưng nó không được liệt kê, bạn có thể muốn xác minh rằng nguồn gốc của bạn được thiết lập đúng với điều này:

git remote show origin

Nếu tất cả đều tốt, có lẽ bạn nên chạy cập nhật:

git remote update

Giả sử chạy thành công, bạn sẽ có thể làm những gì các câu trả lời khác nói:

git branch -r

1

Sử dụng lệnh này,

git log -r --oneline --no-merges --simplify-by-decoration --pretty=format:"%n %Cred CommitID %Creset: %h %n %Cred Remote Branch %Creset :%d %n %Cred Commit Message %Creset: %s %n"

CommitID       : 27385d919
Remote Branch  : (origin/ALPHA)
Commit Message :  New branch created

Nó liệt kê tất cả các nhánh từ xa bao gồm các thông điệp cam kết và ID cam kết được gọi bởi các nhánh từ xa.


1

Tôi sẽ dùng:

git branch -av

Lệnh này không chỉ hiển thị cho bạn danh sách của tất cả các chi nhánh, bao gồm các chi nhánh từ xa bắt đầu /remotemà còn cung cấp cho bạn *thông tin phản hồi về những gì bạn đã cập nhật và các nhận xét cam kết cuối cùng.


0

Hãy chắc chắn rằng nguồn gốc từ xa mà bạn đang liệt kê thực sự là kho lưu trữ mà bạn muốn chứ không phải là một bản sao cũ.


0

Tôi cuối cùng đã làm một đường ống vỏ lộn xộn để có được những gì tôi muốn. Tôi vừa sáp nhập các chi nhánh từ xa nguồn gốc:

git branch -r --all --merged \
    | tail -n +2 \
    | grep -P '^  remotes/origin/(?!HEAD)' \
    | perl -p -e 's/^  remotes\/origin\///g;s/master\n//g'

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.