Câu trả lời:
CẬP NHẬT: thêm thông tin!
Tôi nên làm điều này ngay từ đầu: Tôi đã ghi chú các ghi chú phát hành Git trong repo Git của Git (vì vậy meta!)
grep --color=always -R -C30 fetch Documentation/RelNotes/* | less
Sau đó, tôi đã thực hiện less
tìm kiếm --all
và đây là những gì tôi tìm thấy trong ghi chú phát hành cho phiên bản Git 1.6.6 :
git fetch
đã học--all
và--multiple
các tùy chọn, để chạy tìm nạp từ nhiều kho lưu trữ và--prune
tùy chọn để loại bỏ các nhánh theo dõi từ xa đã cũ. Những điều này làmgit remote update
vàgit remote prune
ít cần thiết hơn ( mặc dù không có kế hoạch để loại bỏremote update
cũng khôngremote prune
).
Phiên bản 1.6.6 không được phát hành cho đến ngày 23 tháng 12 năm 2009 và Poster gốc đã hỏi câu hỏi của anh ấy vào ngày 6 tháng 12 năm 2009.
Vì vậy, như bạn có thể thấy từ các ghi chú phát hành, các tác giả của Git đã nhận thức được thực tế rằng git remote update
chức năng lệnh đã bị trùng lặp đôi chút git fetch
, nhưng họ quyết định không xóa nó, có thể để tương thích ngược với các tập lệnh và chương trình hiện có, hoặc có thể vì nó chỉ là quá nhiều công việc và có những mục ưu tiên cao hơn.
Câu trả lời gốc với nhiều chi tiết hơn
câu trả lời xenoterracide của là 3,5 tuổi bây giờ, và Git đã trải qua nhiều phiên bản kể từ đó (nó đã đi từ v1.6.5.5 để v1.8.3.2 như các văn bản này), và nhìn vào hiện tại tài liệu cho git remote update
và git fetch
, có vẻ như họ cả hai có thể thực hiện về cơ bản là chức năng tương tự của lấy cam kết mới từ nhiều điều khiển từ xa , đưa ra các lựa chọn đúng đắn và lập luận.
Một cách để tìm nạp nhiều điều khiển từ xa là với --all
cờ:
git fetch --all
Điều này sẽ tìm nạp từ tất cả các điều khiển từ xa được cấu hình của bạn, giả sử rằng bạn chưa remote.<name>.skipFetchAll
đặt cho chúng:
Nếu đúng, điều khiển từ xa này sẽ bị bỏ qua theo mặc định khi cập nhật bằng git-fetch (1) hoặc tiểu ban cập nhật của git-remote (1) . - tài liệu git-config
Điều này sẽ tương đương với việc sử dụng
git remote update
mà không chỉ định bất kỳ nhóm từ xa nào để tìm nạp và cũng không có remotes.default
được đặt trong cấu hình repo của bạn và cũng không có điều khiển từ xa nào của bạn được remote.<name>.skipDefaultUpdate
đặt thành đúng.
Các 1.8.3.2 tài liệu hiện tại cho cấu hình của Git không đề cập đến các remotes.default
thiết lập, nhưng tôi tham khảo ý kiến các Đấng Toàn Năng Google về nó và tìm thấy lời giải thích hữu ích này từ Mislav Marohnić :
$ git config remotes.default 'origin mislav staging'
$ git remote update
# fetches remotes "origin", "mislav", and "staging"
Bạn có thể xác định một danh sách từ xa mặc định sẽ được tìm nạp bởi
remote update
lệnh. Đây có thể là điều khiển từ xa từ đồng đội của bạn, thành viên cộng đồng đáng tin cậy của một dự án mã nguồn mở hoặc tương tự.
Vì vậy, có lẽ, nếu bạn có remotes.default
thiết lập, và không phải tất cả các điều khiển từ xa của bạn được liệt kê trong đó, thì git remote update
sẽ không tìm nạp tất cả các điều khiển từ xa mà repo của bạn "biết".
Đối với remote.<name>.skipDefaultUpdate
cài đặt, các tài liệu Git giải thích nó như vậy:
Nếu đúng, điều khiển từ xa này sẽ bị bỏ qua theo mặc định khi cập nhật bằng git-fetch (1) hoặc tiểu ban cập nhật của git-remote (1) .
Thay vì tìm nạp tất cả các điều khiển từ xa, cả hai fetch
và remote update
cho phép bạn chỉ định nhiều điều khiển từ xa và các nhóm từ xa để tìm nạp:
git fetch [<options>] <group>
git fetch --multiple [<options>] [(<repository> | <group>)…]
git fetch [<options>] <group>
cho phép bạn tìm nạp nhiều điều khiển từ xa là một phần của một nhóm (để mượn một ví dụ khác từ Mislav ):
$ git config remotes.mygroup 'remote1 remote2 ...'
$ git fetch mygroup
git fetch --multiple
cho phép bạn chỉ định một số kho lưu trữ và nhóm kho lưu trữ để tìm nạp cùng một lúc (từ các tài liệu ):
Cho phép một số
<repository>
và<group>
đối số được chỉ định. Không<refspec>s
có thể được chỉ định.
Sự mơ hồ trong git remote update
tài liệu
Bản tóm tắtgit remote update
chỉ định rằng cú pháp lệnh như sau:
git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)…]
Chú ý phần cuối , [(<group> | <remote>)…]
? Các dấu chấm kéo theo ...
ngụ ý rằng bạn có thể chỉ định nhiều nhóm và điều khiển từ xa bằng lệnh, điều đó có nghĩa là nó hoạt động theo cùng một cách như git fetch --multiple
... xem cách cú pháp giữa hai nhóm này giống nhau như thế nào?
Tuy nhiên, trong cùng một tài liệu, lời giải thích cho update
lệnh không nói gì về việc chỉ định nhiều nhóm và các đối số từ xa, chỉ có điều nó
Tìm nạp các bản cập nhật cho một bộ điều khiển từ xa có tên trong kho lưu trữ như được định nghĩa bởi
remotes.<group>
.
Vì vậy, không rõ ràng nếu git remote update
hoạt động giống hệt vớigit fetch --multiple
liên quan đến việc chỉ định nhiều điều khiển từ xa riêng lẻ và nhiều nhóm từ xa.
Cuối cùng, mọi người đều biết trường hợp đơn giản là tìm nạp một điều khiển từ xa:
git fetch <remote>
Nó có thể là trường hợp mà bạn cũng có thể sử dụng
git remote update <remote>
để làm điều tương tự, nhưng như tôi đã đề cập trong phần trước, tài liệu cho git remote update
không rõ ràng về việc có thể tìm nạp bất cứ thứ gì ngoài một nhóm không điều khiển từ xa bằng lệnh không.
Như tôi đã giải thích, git fetch
và git remote update
hành xử tương tự đối với việc tìm nạp từ nhiều điều khiển từ xa. Họ chia sẻ cú pháp và đối số tương tự, mặc dùgit fetch
ngắn hơn, vì vậy mọi người có thể thấy dễ dàng nhập và sử dụng hơn.
Nó có thể là trường hợp git remote update
không thể được sử dụng để tìm nạp chỉ một điều khiển từ xa như với git fetch
, nhưng như tôi đã chỉ ra, tài liệu không làm rõ điều này.
Qua một bên
Sự trùng lặp về chức năng giữa các lệnh sứ Git, được minh họa bằng git fetch
và git remote update
ở trên, không phải là duy nhất. Tôi đã nhận thấy một tình huống tương tự với git rebase --onto
vàgit cherry-pick
, trong đó cả hai có thể thực hiện một loạt các cam kết để vá vào một cam kết cơ sở mới.
Tôi đoán rằng vì Git đã phát triển qua nhiều năm, một số chức năng (chắc chắn là sao?), Có lẽ đôi khi là sự tiện lợi cho người dùng cuối (ví dụ, đơn giản hơn là vượt qua một phạm vi cherry-pick
, hơn là vượt qua một cam kết duy nhất để chọn một phạm vi). Rõ ràng cherry-pick
không phải lúc nào cũng chấp nhận một loạt các cam kết, như được giải thích trong ghi chú phát hành v1.7.2 :
git cherry-pick
đã học cách chọn một loạt các cam kết (ví dụcherry-pick A..B
vàcherry-pick --stdin
), cũng vậygit revert
; những cái này không hỗ trợ điều khiển trình tự đẹp hơnrebase [-i]
, mặc dù.
Có và không. git remote update
lấy từ tất cả các điều khiển từ xa, không chỉ một.
Không cần nhìn vào mã để xem nếu remote update
chỉ là một tập lệnh shell (có thể), về cơ bản, nó sẽ chạy tìm nạp cho mỗi điều khiển từ xa. git fetch
có thể chi tiết hơn nhiều.
git remote update
, xem trang chủ git-remote.
git remote
không phải là một kịch bản shell, nhưng nó sinh ra git fetch
trong một remote update
.
git fetch
tùy chọn lệnh tương đương cho một git remote update
?
git fetch --all
git rebase
là thíchmv
vàgit cherry-pick
là như thếcp
. Công--onto
tắc không thay đổi điều đó. Bạn chỉ có thể nhận được hiệu ứng sao chépgit rebase
nếu bạn chỉ định các giá trị SHA1, nếu không chi nhánh của bạn sẽ bị di chuyển!