2015-03-13 15 views
6

Trong khi làm việc trên một chi nhánh tính năng, tôi sử dụng lệnh Git này để cập nhật của tôi "phát triển" nhánh sang trạng thái mới nhất, ngay trước khi sáp nhập chi nhánh tính năng của tôi với "phát triển":Tại sao "git fetch origin branch: branch" chỉ hoạt động trên một nhánh không hiện hành?

git fetch origin develop:develop 

này hoạt động, tức là điểm "phát triển" cục bộ tại cùng một cam kết là "nguồn gốc/phát triển" và ở trạng thái mới nhất có nguồn gốc.

Bằng cách nào đó, tuy nhiên, lệnh này không thành công khi "phát triển" chi nhánh được kiểm tra ra:

fatal: Refusing to fetch into current branch refs/heads/develop of non-bare repository 
fatal: The remote end hung up unexpectedly 

Nó sẽ giúp tôi hiểu Git tốt hơn, nếu tôi biết lý do tại sao nó xảy ra như vậy.

Trả lời

7

Thông báo lỗi đến từ builtin/fetch.c#check_not_current_branch().
Đó chức năng đi tất cả các cách trở lại commit 8ee5d73, Oct. 2008, git 1.6.0.4

Các bình luận là bài học:

Một số hướng dẫn gây nhầm lẫn cho rằng nó sẽ là một ý tưởng tốt để lấy vào chi nhánh hiện tại với một cái gì đó như thế này:

git fetch origin master:master 

(hoặc thậm chí tệ hơn: dòng lệnh tương tự với "kéo" inste quảng cáo "tìm nạp").
Mặc dù có thể lưu trữ những gì bạn muốn kéo, thông thường là sai khi nhánh hiện tại là "master".
Điều này chỉ được phép khi (không chính xác) "git pull origin master:master" cố gắng làm việc xung quanh bằng cách cung cấp --update-head-ok cho "git fetch" cơ bản, và nói cách khác chúng ta nên từ chối nó, nhưng ở đâu đó dọc theo dòng chúng ta đã mất hành vi đó.

Séc hiện tại của chi nhánh hiện tại là chỉ được thực hiện trong các kho không trống , đây là một cải tiến so với hành vi ban đầu.

Xét rằng chức năng check_not_current_branch()called with:

if (!update_head_ok) 
     check_not_current_branch(ref_map); 

Điều đó có nghĩa một git fetch -u origin develop:develop nên làm việc.

-u 
--update-head-ok 

By git mặc định lấy từ chối để cập nhật các đầu tương ứng với các chi nhánh hiện hành. Cờ này sẽ vô hiệu hóa séc.
Điều này hoàn toàn là sử dụng nội bộ cho git pull để liên lạc với git fetch và trừ khi bạn đang triển khai Sứ của riêng mình, bạn không được phép sử dụng nó.

Mặc dù bạn đang không được phép sử dụng tùy chọn đó, nó không trả lời yêu cầu ban đầu của bạn, làm cho công việc “git fetch origin branch:branch” trên một hiện chi nhánh.


Về nguồn gốc của bản vá này, follow the discussion there.

Trong khi nó có thể làm cho tinh thần để lưu trữ những gì bạn muốn kéo

Đó là phần fetch: nó lưu lịch sử từ xa từ cập nhật origin/master.
Nhưng điều đó đặc biệt bị hỏng khi chi nhánh địa phương hiện tại cũng là master.
Như đã đề cập in this answer:

Tôi nghĩ rằng "git fetch url side:master" khi master là chi nhánh hiện tại và chúng tôi đã bỏ qua --update-head-ok bị hỏng.
Kiểm tra không thành công trên master hiện tại.

Nó cũng sẽ không cập nhật thư mục làm việc và sẽ để lại chỉ mục như thể bạn đang xóa mọi thứ.

+0

Bạn có thể làm cho rõ ràng hơn _why_ git ngăn chặn 'git fetch origin master: master' theo mặc định? Tôi cảm thấy như chìa khóa để hiểu điều này có thể là trong báo giá này, nhưng ý nghĩa là không rõ ràng với tôi: _ "Trong khi nó có thể có ý nghĩa để lưu trữ những gì bạn muốn kéo, nó thường là sai khi nhánh hiện tại là ' master '. ”_ Tác giả có ý nghĩa gì khi" lưu trữ những gì bạn muốn kéo "? – sleeparrow

+0

@sleeparrow Tôi phải quay lại chủ đề ban đầu cho bản vá này: https://www.spinics.net/lists/git/msg82242.html. Tôi đã cập nhật câu trả lời. – VonC

1

git fetch chỉ lấy về dữ liệu từ repo từ xa

  1. nó không cập nhật các chi nhánh địa phương của bạn, thậm chí the're thiết lập để theo dõi những người từ xa
  2. (vì 1) nó không thể lấy từ xa chi nhánh vào một địa phương. Nó chỉ là không phải những gìgit fetch làm

Theo man:

git fetch [< tùy chọn>] [< kho> [< refspec> ...]]

Bạn có thể chạy điều này như git fetch origin develop và nó sẽ chỉ cập nhật chi nhánh từ xa của bạn refernece origin/develop

Để cập nhật chi nhánh địa phương của bạn, bạn có thể làm điều này bằng cách này trong các cách sau:

  1. định rõ những gì chi nhánh ở xa nên được kéo đến những gì chi nhánh địa phương: git pull origin develop:develop
  2. nếu develop chi nhánh được kiểm tra ra bây giờ và nó được thiết lập để theo dõi origin/develop bạn chỉ có thể chạy git pull và nó sẽ tìm ra những gì để kéo

cập nhật

Thêm từ người đàn ông:

Khi git fetch được điều hành với các ngành và/hoặc thẻ rõ ràng để lấy về dòng lệnh, ví dụ git fetch origin master, s được đưa ra trên dòng lệnh xác định những gì sẽ được tìm nạp (ví dụ: master in ví dụ, đó là viết tắt của master :, có nghĩa là "fetch master branch but I do không rõ ràng những gì chi nhánh theo dõi từ xa để cập nhật với nó từ dòng lệnh "), và lệnh mẫu sẽ tìm nạp chỉ nhánh chính. Giá trị remote..fetch xác định chi nhánh theo dõi từ xa , nếu có, được cập nhật.Khi được sử dụng theo cách này, giá trị từ xa..tìm nạp không có bất kỳ tác dụng nào trong việc quyết định những gì được tìm nạp (nghĩa là giá trị không được sử dụng làm refspecs khi danh sách dòng lệnh refspecs); chúng chỉ được sử dụng để quyết định nơi các tham chiếu được tìm nạp được lưu trữ bằng cách hoạt động như một ánh xạ.

Có thể cập nhật các nhánh địa phương, nhưng tôi vẫn không hiểu tại sao không thể thực hiện được khi bạn đang ở nhánh bạn muốn cập nhật.

+1

"nó không thể tìm nạp nhánh từ xa vào nhánh địa phương" - nhưng nó có! Xem câu hỏi được cập nhật của tôi. Nó hoạt động, với điều kiện là "phát triển" cục bộ KHÔNG được kiểm tra. – MaDa

+0

@MaDa, vâng, bạn nói đúng. Tôi bỏ lỡ điều này ... bây giờ tôi đang bối rối quá :) –

Các vấn đề liên quan