Phiên bản TL; DR: chi nhánh theo dõi từ xa đã origin/master
từng tồn tại, nhưng hiện tại không có, vì vậy chi nhánh địa phương source
đang theo dõi thứ gì đó không tồn tại, điều đáng nghi ngờ nhất là điều đó có nghĩa là một tính năng Git khác không thể làm gì cho bạn. Git đang cảnh báo bạn về nó. Bạn đã hòa thuận tốt mà không có tính năng "theo dõi ngược dòng" hoạt động như dự định, do đó, tùy thuộc vào việc bạn có nên thay đổi bất cứ điều gì hay không.
Đối với một cài đặt ngược dòng khác, hãy xem Tại sao tôi phải "git đẩy --set-upstream origin <Branch>"?
Cảnh báo này là một điều mới trong Git, xuất hiện đầu tiên trong Git 1.8.5. Các ghi chú phát hành chỉ chứa một mục đạn ngắn về nó:
- "Git chi nhánh -v -v" (và "trạng thái git") không phân biệt giữa một nhánh không dựa trên bất kỳ nhánh nào khác, một nhánh được đồng bộ hóa với nhánh ngược dòng của nó và một nhánh được cấu hình với một luồng ngược dòng nhánh không còn tồn tại.
Để mô tả ý nghĩa của nó, trước tiên bạn cần biết về "điều khiển từ xa", "các nhánh theo dõi từ xa" và cách Git xử lý "theo dõi ngược dòng". ( Chi nhánh theo dõi từ xa là một thuật ngữ thiếu sót khủng khiếp Tôi đã bắt đầu sử dụng tên từ xa theo dõi thay vào đó, mà tôi nghĩ là một sự cải thiện nhẹ. Dưới đây, tuy nhiên, tôi sẽ sử dụng "từ xa theo dõi chi nhánh" cho phù hợp với tài liệu Git. )
Mỗi "remote" chỉ đơn giản là một tên, như origin
hoặc octopress
trong trường hợp này. Mục đích của họ là ghi lại những thứ như URL đầy đủ của những nơi mà bạn git fetch
hoặc git pull
cập nhật. Khi bạn sử dụng 1 Git, hãy chuyển đến điều khiển từ xa đó (sử dụng URL đã lưu) và mang đến bộ cập nhật thích hợp. Nó cũng ghi lại các bản cập nhật, sử dụng "các nhánh theo dõi từ xa".git fetch remote,
"Chi nhánh theo dõi từ xa" (hoặc tên theo dõi từ xa) chỉ đơn giản là bản ghi tên chi nhánh như được nhìn thấy lần cuối trên một số "từ xa". Mỗi điều khiển từ xa là một kho lưu trữ Git, vì vậy nó có các nhánh. Các nhánh trên "nguồn gốc" từ xa được ghi lại trong kho lưu trữ cục bộ của bạn bên dưới remotes/origin/
. Các văn bản mà bạn thấy nói rằng có một chi nhánh tên source
trên origin
, và các chi nhánh đặt tên 2.1
, linklog
và vân vân trên octopress
.
(Tất nhiên, một nhánh "bình thường" hoặc "cục bộ" chỉ là một tên nhánh mà bạn đã tạo trong kho lưu trữ của riêng bạn.)
Cuối cùng, bạn có thể thiết lập một nhánh (cục bộ) để "theo dõi" một "nhánh theo dõi từ xa". Khi nhánh cục bộ L
được đặt để theo dõi nhánh theo dõi từ xa R
, Git sẽ gọi R
"nhánh ngược" của nó và cho bạn biết liệu bạn có "đi trước" và / hoặc "phía sau" ngược dòng hay không (về mặt cam kết). Đó là bình thường (thậm chí khuyên-thể) cho các chi nhánh địa phương và từ xa theo dõi các chi nhánh để sử dụng cùng tên (trừ phần tiền tố từ xa), giống như source
và origin/source
, nhưng đó không phải là thực sự cần thiết.
Và trong trường hợp này, điều đó không xảy ra. Bạn có một chi nhánh địa phương source
theo dõi một chi nhánh theo dõi từ xa origin/master
.
Bạn không cần phải biết cơ chế chính xác về cách thức Git thiết lập một chi nhánh địa phương để theo dõi một điều khiển từ xa, nhưng chúng có liên quan dưới đây, vì vậy tôi sẽ trình bày cách thức hoạt động của nó. Chúng tôi bắt đầu với tên chi nhánh địa phương của bạn , source
. Có hai mục cấu hình sử dụng tên này, đánh vần branch.source.remote
và branch.source.merge
. Từ đầu ra mà bạn đã hiển thị, rõ ràng cả hai đều được đặt, do đó bạn sẽ thấy những điều sau nếu bạn chạy các lệnh đã cho:
$ git config --get branch.source.remote
origin
$ git config --get branch.source.merge
refs/heads/master
Đặt những thứ này lại với nhau, 2 cái này cho Git biết rằng chi nhánh source
của bạn theo dõi "chi nhánh theo dõi từ xa" của bạn , origin/master
.
Nhưng bây giờ hãy nhìn vào đầu ra của git branch -a
, trong đó hiển thị tất cả các tên nhánh theo dõi cục bộ và từ xa trong kho lưu trữ của bạn. Các tên theo dõi từ xa được liệt kê dưới remotes/
... và không córemotes/origin/master
. Có lẽ đã có lúc, nhưng giờ nó đã biến mất.
Git đang nói với bạn rằng bạn có thể loại bỏ thông tin theo dõi --unset-upstream
. Điều này sẽ xóa cả hai branch.source.origin
và branch.source.merge
, và dừng cảnh báo.
Dường như khá có khả năng những gì bạn muốn, mặc dù, là để chuyển đổi từ theo dõi origin/master
, sang theo dõi một thứ khác: có thể origin/source
, nhưng có thể là một trong nhữngoctopress/
cái tên.
Bạn có thể làm điều này với git branch --set-upstream-to
, 3 vd:
$ git branch --set-upstream-to=origin/source
(giả sử bạn vẫn ở trên "nguồn" chi nhánh và điều đó origin/source
là thượng nguồn mà bạn muốn, không có cách nào để tôi nói cái nào, nếu có, dù bạn thực sự muốn gì).
(Xem thêm Làm thế nào để bạn tạo một nhánh Git hiện có theo dõi một nhánh từ xa? )
Tôi nghĩ rằng cách bạn đến đây là khi bạn mới làm một thứ git clone
, thứ bạn nhân bản từ một nhánh master
. Bạn cũng có một nhánh master
, được đặt để theo dõi origin/master
(đây là một thiết lập tiêu chuẩn, bình thường cho git). Điều này có nghĩa là bạn đã có branch.master.remote
và branch.master.merge
thiết lập, đến origin
và refs/heads/master
. Nhưng sau đó origin
remote của bạn đổi tên từ master
thành source
. Để phù hợp, tôi tin rằng bạn cũng đã thay đổi tên địa phương của bạn từ master
thành source
. Đây đã thay đổi tên của các thiết lập của bạn, từ branch.master.remote
đến branch.source.remote
và đi từ branch.master.merge
để branch.source.merge
... nhưng nó bỏ cái cũ giá trị , vì vậy branch.source.merge
bây giờ đã sai.
Chính tại thời điểm này, liên kết "ngược dòng" đã bị hỏng, nhưng trong các phiên bản Git cũ hơn 1.8.5, Git không bao giờ nhận thấy cài đặt bị hỏng. Bây giờ bạn có 1.8.5, nó chỉ ra điều này.
Điều đó bao gồm hầu hết các câu hỏi, nhưng không phải là câu hỏi "tôi có cần sửa nó không". Có khả năng là bạn đã làm việc xung quanh tình trạng hỏng hóc trong nhiều năm nay, bằng cách thực hiện (ví dụ :). Nếu bạn tiếp tục làm điều đó, nó sẽ tiếp tục giải quyết vấn đề, vì vậy, không, bạn không cần phải sửa nó. Nếu bạn thích, bạn có thể sử dụng để loại bỏ ngược dòng và dừng các khiếu nại, và không có chi nhánh địa phương được đánh dấu là cógit pull remote branch
git pull origin source
--unset-upstream
source
bất kỳ thượng nguồn nào cả.
Điểm có một thượng nguồn là làm cho các hoạt động khác nhau thuận tiện hơn. Chẳng hạn, git fetch
theo sau git merge
thường sẽ "làm điều đúng" nếu dòng ngược được đặt chính xác và git status
sau đó git fetch
sẽ cho bạn biết liệu repo của bạn có khớp với dòng ngược dòng, cho nhánh đó không.
Nếu bạn muốn sự thuận tiện, hãy thiết lập lại ngược dòng.
1 lầngit pull
sử dụng git fetch
và kể từ Git 1.8.4, điều này (cuối cùng!) Cũng cập nhật thông tin "chi nhánh theo dõi từ xa". Trong các phiên bản cũ hơn của Git, các bản cập nhật không được ghi lại trong các nhánh theo dõi từ xa git pull
, chỉ với git fetch
. Vì Git của bạn phải có ít nhất phiên bản 1.8.5, đây không phải là vấn đề đối với bạn.
2 Vâng, điều này cộng với một dòng cấu hình tôi cố tình bỏ qua được tìm thấy bên dưới remote.origin.fetch
. Git phải ánh xạ tên "hợp nhất" để tìm ra rằng tên địa phương đầy đủ cho nhánh từ xa là refs/remotes/origin/master
. Ánh xạ hầu như luôn luôn hoạt động giống như thế này, tuy nhiên, do đó, nó có thể dự đoán rằng master
đi vào origin/master
.
3 Hoặc, với git config
. Nếu bạn chỉ muốn đặt ngược dòng thành origin/source
phần duy nhất phải thay đổi là branch.source.merge
, và git config branch.source.merge refs/heads/source
sẽ làm điều đó. Nhưng --set-upstream-to
nói những gì bạn muốn làm, thay vì bắt bạn tự làm bằng tay, vì vậy đó là "cách tốt hơn".