Thông báo lỗi khó hiểu từ git


90

Tôi nhận được tin nhắn này từ Git:

Bạn đã yêu cầu kéo từ 'origin' từ xa, nhưng không chỉ định nhánh. Vì đây không phải là điều khiển từ xa được cấu hình mặc định cho chi nhánh hiện tại của bạn, bạn phải chỉ định một chi nhánh trên dòng lệnh.

Bất cứ ai có thể giải thích nó? và quan trọng hơn là làm thế nào để khắc phục nó?

Câu trả lời:


89

Bạn phải cho git biết nhánh nào bạn muốn kéo từ kho lưu trữ từ xa "gốc".

Tôi đoán bạn muốn nhánh mặc định (chính) như vậy git pull origin master khắc phục sự cố của bạn.

Xem git help branch, git help pullgit help fetch để biết thêm thông tin.


2
để làm cho nó hoạt động, tôi phải kiểm tra nhánh "chính" (không có nhánh nào được chọn) và kéo, điều đó đã khắc phục sự cố.
cinek

@cinek: Vâng, git pullkéo và hợp nhất với nhánh hiện tại nên hành vi của nó hoàn toàn phụ thuộc vào nhánh nào được kiểm tra và với HEAD tách rời (không kiểm tra nhánh), không có cách nào nó có thể biết nhánh nào cần kéo.
Cascabel

@cinek: Tôi cho rằng bạn chưa quen với git nên tôi thừa nhận rằng bạn đang ở trạng thái hoàn toàn tiêu chuẩn trên máy chủ nhánh, thật tệ :-).
p4bl0

86

Để khắc phục, giả sử bạn đang ở trên masternhánh và muốn kéo masternhánh từ originđiều khiển từ xa, trong các phiên bản Git đủ mới (1.8 hoặc mới hơn):

git branch -u origin/master master

(Tương tự cho các nhánh và / hoặc điều khiển từ xa khác.)

Nếu bạn có thể kết hợp điều này với một cú đẩy, nó thậm chí còn ngắn hơn:

git push -u origin master

Sau đó, một đồng bằng git pull/ git pushsẽ làm những gì bạn mong đợi.


Trong loạt Git 1.7, git branchkhông có công -utắc (chỉ có git push), và thay vào đó bạn phải sử dụng lâu hơn --set-upstream:

git branch --set-upstream master origin/master

Lưu ý sự đảo ngược của các đối số so với -u. Tôi đã lần mò đơn đặt hàng này hơn một lần.


Nhân tiện, tất cả những điều này đều là những cách gọi tắt để thực hiện những việc sau mà bạn vẫn có thể thực hiện một cách rõ ràng:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

Trước ngày 1.7, bạn phải làm theo cách này.


Tôi nghĩ rằng lệnh ở trên cùng (ít nhất là trong phiên bản Git của tôi) đặt ngược dòng của một nhánh được gọi là "origin" thành "origin / master". Nếu chi nhánh của bạn ở địa phương được gọi là "chủ", tôi nghĩ bạn sẽ muốn:git branch --set-upstream master origin/master
Evan Donovan

Điều thú vị là -utùy chọn này không có tài liệu git branchtrong phiên bản 1.8.5.3 của tôi, làm cho tài liệu của bạn về nó ở đây càng quan trọng hơn. Và, như bạn lưu ý, tùy chọn này không có sẵn trong phiên bản 1.7. *. Vì -ulà viết tắt của --set-upstream, không nên đảo ngược thứ tự các đối số của nó như bạn đã làm --set-upstreamdo nhận xét của @ EvanDonovan?
hobs

Tuy nhiên, khi tôi sử dụng lệnh you show ( git branch -u origin/master master), nó hoạt động như mong đợi / dự định đối với tôi: "Branch master được thiết lập để theo dõi nhánh master từ xa từ nguồn gốc."
hobs

1
@hobs: đó thực sự là một nghịch cảnh của Git. Công -utắc thực sự không phải là dạng ngắn của --set-upstream. Thứ tự đối số của nó bị đảo ngược so với thứ tự cho --set-upstream. Tôi nghĩ chỉ sau này --set-upstream-to(lưu ý "-to") mới được giới thiệu, mà -ubây giờ thực sự là dạng rút gọn của.
Aristotle Pagaltzis,

Chà! Thực sự khó hiểu. Cảm ơn vì đã gỡ rối cho tôi.
hobs

3

Tin nhắn nói chính xác nội dung của nó. Chi nhánh hiện tại của bạn không được liên kết với (không theo dõi) bất kỳ chi nhánh nào tại nguồn gốc . Vì vậy, git không biết những gì để kéo.

Để làm gì? Mà phụ thuộc...

Trong hầu hết các tình huống thông thường bạn đang làm việc tắt một số chi nhánh địa phương xyz mà phân nhánh từ tổng thể được nhân bản từ nguồn gốc của chủ. Cách thông thường để giải quyết nó là chuyển sang master và pull để đồng bộ hóa nó với origin và sau đó quay lại xyzrebase master.

Nhưng trong tình huống của bạn, bạn có thể muốn làm điều gì đó khác. Chúng tôi không thể biết điều đó nếu không biết chi tiết về các chi nhánh và điều khiển từ xa của bạn và cách bạn có ý định sử dụng chúng.

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.