Git kéo mà không kiểm tra?


133

Tôi đã quen chạy git pull và các lệnh khác từ trong nhánh tôi đang làm việc. Nhưng tôi đã thiết lập một máy chủ phát triển mà nhiều người làm việc, vì vậy tôi không muốn phải chuyển đổi chi nhánh khi tôi làm việc đó. Nếu tôi muốn cập nhật một nhánh hiện có trên máy chủ dev từ kho github mà tất cả chúng ta sử dụng, thì đâu là cách đúng đắn để làm điều đó? Nếu tôi chạy lệnh 'git pull github Branchname' thì điều đó có đơn giản là kéo nhánh vào nhánh hiện tại không?

Tất cả các ví dụ git mà tôi có thể tìm thấy dường như chỉ ra rằng bạn chạy 'kiểm tra tên chi nhánh' trước, sau đó thực hiện thao tác kéo. Tôi đang cố tránh điều đó. Như tôi đã nói, đây là một chi nhánh hiện có và tôi chỉ muốn cập nhật lên phiên bản mới nhất.


6
git fetchnên làm những gì bạn muốn
Brad

11
git fetchsẽ cập nhật bản sao cục bộ của nhánh từ xa, nhưng không cập nhật bất kỳ nhánh cục bộ nào, ngay cả khi một bản được thiết lập để theo dõi nhánh từ xa cụ thể đó. Nó có thể hoặc không thể là những gì muốn. (Chỉnh sửa: theo mặc định, dù sao. Có thể gọi nó bằng các đối số để làm cho nó hoạt động khác đi, nhưng trong trường hợp đó, các đối số nên thực sự được chỉ ra.)

2
Tôi không hiểu lắm ... có phải mọi người đều sử dụng cùng một kho lưu trữ cục bộ trên máy chủ dev không? Có phải đó là lý do tại sao bạn không muốn chuyển đổi chi nhánh? Tại sao không chỉ có tất cả mọi người tạo bản sao riêng của họ mà họ có thể làm việc? Xem thêm git: cập nhật một chi nhánh địa phương mà không kiểm tra nó? .

Câu trả lời:


220

Tôi đã tìm kiếm điều tương tự và cuối cùng đã tìm thấy câu trả lời phù hợp với tôi trong một bài đăng stackoverflow khác: Hợp nhất, cập nhật và kéo các nhánh Git mà không cần sử dụng kiểm tra

Về cơ bản:

git fetch <remote> <srcBranch>:<destBranch>


Có cách nào để sử dụng nhánh ngược dòng thay vì chỉ định nhánh nguồn không?
quay cuồng vào

Đáng buồn thay, nhưng pullcó các tham số mà fetchkhông : -s <strategy>, -Xsubtree=...điều này rất quan trọng đối với tôi, vì vậy đây không phải là một sự thay thế tương đương. Tôi đã có một vấn đề được mô tả ở đây: congruityservice.com/blog/, nhưng trong trường hợp của tôi, tôi không muốn kiểm tra gì cả.
Andry

2
Xem xét câu hỏi là về kéo, có vẻ như câu trả lời nên thay thế git pull <remote> <srcBranch>:<destBranch>.
J Woodchuck

Nếu các xác nhận đã có trong kho lưu trữ cục bộ của bạn:git fetch . origin/master:master
Evan

74

Tôi có vấn đề rất tương tự với sự cần thiết phải cam kết hoặc stash thay đổi tính năng hiện tại, kiểm tra tổng thể chi nhánh, làm pulllệnh làm được tất cả mọi thứ từ xa đến địa phương masterkhông gian làm việc, sau đó chuyển lại cho một chi nhánh tính năng và thực hiện rebaseđể làm cho nó up-to-date với bậc thầy.

Để thực hiện tất cả điều này, hãy giữ không gian làm việc trên nhánh tính năng và tránh tất cả các chuyển đổi, tôi làm điều này:

git fetch origin master:master

git rebase master

Và nó thực hiện các mẹo độc đáo.


19
Đây là lời khuyên tốt nhưng hãy chôn vùi lede: theo các câu trả lời dưới đây, nếu bạn tiếp tục featurevà TẤT CẢ bạn muốn làm là cập nhật địa phương của bạn masterđể phù hợp với nguồn gốc, KHÔNG chạm vào feature, chỉ cần làm git fetch origin master:master... và như thể bạn đã làm stash-checkoutMaster-pull-checkoutFeature-stashPop!
btown

7
Để hợp nhất chủ gốc vào chi nhánh địa phương của bạn, bạn không cần phải kéo chủ địa phương. Bạn có thể sử dụng git merge origin/master
Dan

-1

Nếu bạn muốn các mẹo chi nhánh địa phương được chỉ định lại sau git fetch, bạn cần một số bước bổ sung.

Cụ thể hơn, giả sử repo github có chi nhánh D, B, C, và master(lý do lẻ chi nhánh-name-bộ này sẽ được rõ ràng trong một thời điểm). Bạn đang ở trên máy chủ devhostvà bạn đang ở trong một repo, đó originlà repo github. Bạn làm git fetch, mang lại trên tất cả các đối tượng và cập nhật origin/D, origin/B, origin/C, và origin/master. Càng xa càng tốt. Nhưng bây giờ bạn nói rằng bạn muốn một cái gì đó xảy ra, trên devhost, để địa phương , ngành D, B, C, và / hoặc master?

Tôi có những câu hỏi rõ ràng (với tôi dù thế nào):

  1. Tại sao bạn muốn các mẹo của tất cả các chi nhánh được cập nhật?
  2. Điều gì xảy ra nếu một số chi nhánh (ví dụ, B) cam kết rằng repo từ xa (github) thiếu? Chúng có nên được hợp nhất, nổi loạn hay ...?
  3. Điều gì xảy ra nếu bạn ở một số chi nhánh (ví dụ C:) và thư mục công việc và / hoặc chỉ mục được sửa đổi nhưng không được cam kết?
  4. Điều gì xảy ra nếu repo từ xa có các nhánh mới được thêm ( A) và / hoặc các nhánh bị xóa ( D)?

Nếu câu trả lời cho (1) là "bởi vì devhostthực tế không phải là để phát triển, mà là một tấm gương cục bộ chỉ đơn giản là giữ một bản sao của github repo để tất cả các nhà phát triển thực tế của chúng tôi có thể đọc nhanh từ đó thay vì đọc chậm github ", sau đó bạn muốn có một" tấm gương "chứ không phải là một repo" bình thường ". Nó không nên có một thư mục công việc, và có lẽ nó cũng không nên chấp nhận đẩy, trong trường hợp đó, các câu hỏi còn lại sẽ biến mất.

Nếu có một số câu trả lời khác, (2-4) trở thành vấn đề.

Trong mọi trường hợp, đây là một cách để khắc phục việc cập nhật các ref cục bộ dựa trên các ref từ xa ( git fetch -pví dụ sau khi chạy ):

for ref in $(git for-each-ref refs/remotes/origin/ --format '%(refname)'); do
    local=${ref#refs/remotes/origin/}
    ... code here ...
done

Những gì diễn ra trong ... code here ...phần phụ thuộc vào câu trả lời cho các câu hỏi (2-4).


-5

Sử dụng

git fetch

thay thế. Nó cập nhật các ref và đối tượng từ xa trong repo của bạn, nhưng để lại các nhánh cục bộ, HEAD và worktree một mình.


17
Nhưng điều đó không cập nhật các nhánh cục bộ của máy chủ phát triển của anh ta ... nó chỉ làm mới các nhánh "gốc" trên thư mục git đó, tương ứng với repo github của người hỏi.
ANeves

1
Hoặc, nếu bạn muốn phiên bản vấn đề của tôi: Tôi muốn hợp nhất nhánh làm việc của mình với "master" chứ không phải với "origin / master of ssh: // bla bla bla". Làm fetch sẽ cập nhật nguồn gốc / master, nhưng không master.
ANeves

-6

EDIT: Sử dụng 'git pull' Nó sẽ tìm nạp tất cả các nhánh từ repo và cũng cập nhật lên mới nhất nếu nhánh thoát ra trên hệ thống cục bộ chỉ cho nhánh hiện tại. Lưu ý: git pull tương đương với tìm nạp + hợp nhất tìm nạp tất cả các nhánh nhưng chỉ hợp nhất nhánh hiện tại.


6
Tốt hơn để nói: pullthực hiện tìm nạp (mà, vâng, tìm nạp mọi thứ từ xa) nhưng sau đó chỉ hợp nhất chi nhánh hiện tại .

Không có ý định xúc phạm với downvote của tôi, tôi biết rằng những gì bạn đang nói là chính xác và thực tế, và OP thực sự đã yêu cầu xác nhận về những gì kéo (và bạn đã cho anh ta lời giải thích đó), nhưng nó không giải quyết mấu chốt của những gì anh ấy đã theo đuổi: Có cách nào để cập nhật một trong những chi nhánh địa phương của bạn lên các cam kết mới nhất trong chi nhánh từ xa liên kết của nó mà không phải kiểm tra chi nhánh trước.
Gurce
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.