Sự khác nhau giữa git cập nhật từ xa và tìm nạp?


Câu trả lời:


112

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 lesstìm kiếm --allvà đâ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--multiplecác tùy chọn, để chạy tìm nạp từ nhiều kho lưu trữ và --prunetùy chọn để loại bỏ các nhánh theo dõi từ xa đã cũ. Những điều này làm git remote updategit remote pruneít cần thiết hơn ( mặc dù không có kế hoạch để loại bỏ remote updatecũng không remote 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 updatechứ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 updategit 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.

Tìm nạp tất cả các điều khiển từ xa

Một cách để tìm nạp nhiều điều khiển từ xa là với --allcờ:

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.defaultthiế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 updatesẽ 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>.skipDefaultUpdatecà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) .

Tìm nạp một nhóm từ xa được chỉ định

Thay vì tìm nạp tất cả các điều khiển từ xa, cả hai fetchremote updatecho 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 --multiplecho 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><group>đối số được chỉ định. Không <refspec>scó thể được chỉ định.

Sự mơ hồ trong git remote updatetà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 updatehoạ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.

Tìm nạp một điều khiển 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 updatekhô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.

Gói (lại

Như tôi đã giải thích, git fetchgit remote updatehà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 updatekhô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 fetchgit 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 --ontogit 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-pickkhô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..Bcherry-pick --stdin), cũng vậy git revert; những cái này không hỗ trợ điều khiển trình tự đẹp hơn rebase [-i], mặc dù.


4
FYI: git rebaselà thích mvgit cherry-picklà như thế cp. Công --ontotắc không thay đổi điều đó. Bạn chỉ có thể nhận được hiệu ứng sao chép git rebasenế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!
Robert Siemer

141

Có và không. git remote updatelấ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 updatechỉ 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 fetchcó thể chi tiết hơn nhiều.


3
Bạn có thể định cấu hình từ xa để tìm nạp khi chạy git remote update, xem trang chủ git-remote.
Jakub Narębski

Ngẫu nhiên, git remotekhông phải là một kịch bản shell, nhưng nó sinh ra git fetchtrong một remote update.
mipadi

1
Có một git fetchtùy chọn lệnh tương đương cho một git remote update?
hoa tulip

15
@tuler Có: đó làgit fetch --all
LoKi
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.