TL; DR: git branch --set-upstream-to origin/solaris
Câu trả lời cho câu hỏi mà bạn đã hỏi, trong đó tôi sẽ viết lại một chút là "tôi có phải đặt ngược dòng" không, không, bạn hoàn toàn không phải đặt ngược dòng.
Tuy nhiên, nếu bạn không có dòng ngược cho nhánh hiện tại, Git cũng thay đổi hành vi của nó git push
và trên các lệnh khác.
Câu chuyện đẩy hoàn chỉnh ở đây dài và nhàm chán và quay trở lại trong lịch sử trước phiên bản Git 1.5. Để rút ngắn nó rất nhiều, git push
được thực hiện kém. 1 Kể từ phiên bản Git 2.0, Git hiện có một núm cấu hình được đánh vần push.default
mà bây giờ mặc định là simple
. Đối với một số phiên bản Git trước và sau 2.0, mỗi khi bạn chạy git push
, Git sẽ phát ra nhiều tiếng ồn khi cố gắng thuyết phục bạn cài đặt push.default
chỉ git push
để im lặng.
Bạn không đề cập đến phiên bản Git nào bạn đang chạy, cũng như bạn đã cấu hình chưa push.default
, vì vậy chúng tôi phải đoán. Tôi đoán là bạn đang sử dụng Git phiên bản 2-point-một cái gì đó, và rằng bạn đã thiết lập push.default
để simple
làm cho nó im lặng. Chính xác là phiên bản Git nào bạn có, và nếu bất cứ điều gì bạn push.default
đặt ra, đều quan trọng, do lịch sử lâu dài và nhàm chán đó, nhưng cuối cùng, thực tế là bạn đang nhận được một khiếu nại khác từ Git cho thấy Git của bạn là cấu hình để tránh một trong những sai lầm từ quá khứ.
Một thượng nguồn là gì?
Một thượng nguồn chỉ đơn giản là một tên nhánh khác, thường là một nhánh theo dõi từ xa, được liên kết với một nhánh (thông thường, cục bộ).
Mỗi nhánh có tùy chọn có một (1) bộ ngược dòng. Đó là, mỗi nhánh hoặc có một thượng nguồn hoặc không có một thượng nguồn. Không có chi nhánh có thể có nhiều hơn một thượng nguồn.
Thượng nguồn nên , nhưng không nhất thiết phải là một nhánh hợp lệ (cho dù theo dõi từ xa như thế nào hay như cục bộ ). Đó là, nếu nhánh B hiện tại có U ngược dòng , nên hoạt động. Nếu nó không hoạt động, nếu nó phàn nàn rằng U không tồn tại thì thì hầu hết các Git hoạt động như thể dòng ngược dòng không được thiết lập. Một vài lệnh, như , sẽ hiển thị cài đặt ngược dòng nhưng đánh dấu nó là "biến mất".origin/B
master
git rev-parse U
git branch -vv
Những gì tốt là một thượng nguồn?
Nếu bạn push.default
được đặt thành simple
hoặc upstream
, cài đặt ngược dòng sẽ thực hiệngit push
, được sử dụng mà không có đối số bổ sung, chỉ hoạt động.
Đó là nó, đó là tất cả những gì nó làm git push
. Nhưng điều đó khá quan trọng, vì đây git push
là một trong những nơi mà một lỗi đánh máy đơn giản gây ra những cơn đau đầu lớn.
Nếu bạn push.default
được thiết lập để nothing
, matching
hoặc current
, thiết lập một thượng nguồn không có gì ở tất cả cho git push
.
(Tất cả điều này giả định phiên bản Git của bạn ít nhất là 2.0.)
Thượng nguồn ảnh hưởng git fetch
Nếu bạn chạy git fetch
không có đối số bổ sung, Git hiểu ra mà từ xa để lấy từ bằng cách tham khảo ý kiến thượng nguồn các chi nhánh hiện hành. Nếu thượng nguồn là một nhánh theo dõi từ xa, Git sẽ tìm nạp từ điều khiển đó. (Nếu ngược dòng không được đặt hoặc là một nhánh cục bộ, Git sẽ thử tìm nạp origin
.)
Thượng nguồn ảnh hưởng git merge
và git rebase
quá
Nếu bạn chạy git merge
hoặc git rebase
không có đối số bổ sung, Git sử dụng ngược dòng của nhánh hiện tại. Vì vậy, nó rút ngắn việc sử dụng hai lệnh này.
Thượng nguồn ảnh hưởng git pull
Dù sao thì bạn cũng không nên sử dụng 2 lầngit pull
, nhưng nếu có, hãy git pull
sử dụng cài đặt ngược dòng để tìm ra từ xa nào cần tìm nạp và sau đó là nhánh nào để hợp nhất hoặc khởi động lại. Đó là, git pull
làm điều tương tự như git fetch
-because nó thực sự chạy git fetch
-Và sau đó làm điều tương tự như git merge
hoặc git rebase
, bởi vì nó thực sự chạy git merge
haygit rebase
.
.
Thượng nguồn ảnh hưởng git status
Điều này thực sự có thể là quan trọng nhất. Khi bạn có một bộ ngược dòng, git status
có thể báo cáo sự khác biệt giữa nhánh hiện tại của bạn và ngược dòng của nó, về mặt cam kết.
Nếu, như trường hợp bình thường, bạn đang ở nhánh B
với dòng ngược được đặt thành và bạn chạy , bạn sẽ ngay lập tức xem liệu bạn có cam kết bạn có thể đẩy hay không và / hoặc cam kết bạn có thể hợp nhất hoặc khởi động lại.origin/B
git status
Điều này là do git status
chạy:
git rev-list --count @{u}..HEAD
: bạn có bao nhiêu cam kết B
mà không có ?origin/B
git rev-list --count HEAD..@{u}
: bạn có bao nhiêu cam kết mà không có ?origin/B
B
Thiết lập một thượng nguồn cung cấp cho bạn tất cả những điều này.
Làm thế nào đến master
đã có một bộ ngược dòng?
Khi bạn lần đầu tiên sao chép từ một số điều khiển từ xa, sử dụng:
$ git clone git://some.host/path/to/repo.git
hoặc tương tự, bước cuối cùng mà Git thực hiện là, về cơ bản , git checkout master
. Điều này kiểm tra chi nhánh địa phương của master
bạn, bạn không có chi nhánh địa phương master
.
Mặt khác, bạn làm có một chi nhánh từ xa theo dõi tên origin/master
, bởi vì bạn chỉ cần nhân bản nó.
Git đoán rằng bạn phải có nghĩa là: "làm cho tôi một địa phương mới master
trỏ đến cùng cam kết như từ xa theo dõi origin/master
, và, trong khi bạn đang ở đó, thiết lập các thượng nguồn cho master
đến origin/master
."
Điều này xảy ra cho mọi chi nhánh git checkout
mà bạn chưa có. Git tạo ra nhánh và làm cho nó "theo dõi" (có dòng ngược) là nhánh theo dõi từ xa tương ứng.
Nhưng điều này không làm việc cho mới ngành, ví dụ, chi nhánh không có chi nhánh từ xa theo dõi chưa .
Nếu bạn tạo một chi nhánh mới :
$ git checkout -b solaris
Có, như vậy, không origin/solaris
. Địa phương của bạn solaris
không thể theo dõi chi nhánh theo dõi từ xa origin/solaris
vì nó không tồn tại.
Khi bạn lần đầu tiên đẩy chi nhánh mới:
$ git push origin solaris
mà tạo solaris
trên origin
, và do đó cũng tạo ra origin/solaris
trong kho Git của riêng bạn. Nhưng đã quá muộn: Bạn đã có một địa phương solaris
mà không có thượng nguồn . 3
Không phải Git chỉ nên đặt nó, bây giờ, là thượng nguồn tự động?
Có lẽ. Xem "triển khai kém" và chú thích 1. Bây giờ thật khó để thay đổi : Có hàng triệu 4 tập lệnh sử dụng Git và một số có thể phụ thuộc vào hành vi hiện tại của nó. Thay đổi hành vi yêu cầu một bản phát hành chính mới, nag-ware để buộc bạn đặt một số trường cấu hình, v.v. Nói tóm lại, Git là nạn nhân của sự thành công của chính nó: bất kỳ sai lầm nào trong đó, ngày nay, chỉ có thể được sửa chữa nếu thay đổi chủ yếu là vô hình, rõ ràng tốt hơn nhiều hoặc được thực hiện chậm theo thời gian.
Thực tế là, nó không có ngày hôm nay, trừ khi bạn sử dụng --set-upstream
hoặc -u
trong thời gian git push
. Đó là những gì tin nhắn đang nói với bạn.
Bạn không cần phải làm như thế. Vâng, như chúng tôi đã lưu ý ở trên, bạn hoàn toàn không phải làm điều đó, nhưng hãy nói rằng bạn muốn một thượng nguồn. Bạn đã tạo chi nhánh solaris
trên origin
, thông qua một lần đẩy trước đó và khi git branch
đầu ra của bạn hiển thị, bạn đã có origin/solaris
trong kho lưu trữ cục bộ của mình.
Bạn không nên đặt nó làm thượng nguồn cho solaris
.
Để đặt nó ngay bây giờ, thay vì trong lần đẩy đầu tiên, hãy sử dụng git branch --set-upstream-to
. Lệnh --set-upstream-to
phụ lấy tên của bất kỳ nhánh hiện có nào, chẳng hạn như origin/solaris
, và đặt ngược dòng của nhánh hiện tại với nhánh khác.
Đó là nó, đó là tất cả những gì nó làm nhưng nó có tất cả những ý nghĩa được ghi nhận ở trên. Điều đó có nghĩa là bạn chỉ có thể chạy git fetch
, sau đó nhìn xung quanh, sau đó chạy git merge
hoặc git rebase
khi thích hợp, sau đó thực hiện các cam kết mới và chạy git push
, mà không cần phải loay hoay thêm.
1 Để công bằng, sau đó không rõ ràng rằng việc triển khai ban đầu dễ bị lỗi. Điều đó chỉ trở nên rõ ràng khi mọi người dùng mới đều mắc lỗi giống nhau mỗi lần. Bây giờ "ít nghèo" hơn, không có nghĩa là "tuyệt vời".
2 "Không bao giờ" là một chút mạnh mẽ, nhưng tôi thấy rằng những người mới Git hiểu mọi thứ tốt hơn rất nhiều khi tôi tách ra các bước, đặc biệt là khi tôi có thể chỉ cho họ những gì git fetch
thực sự đã làm, và sau đó họ có thể thấy những gì git merge
hoặc git rebase
sẽ làm gì tiếp theo.
3 Nếu bạn chạy lần đầu tiên git push
với tư cách git push -u origin solaris
làieie, nếu bạn thêm -u
cờ thì Git sẽ đặt origin/solaris
làm thượng nguồn cho nhánh hiện tại của bạn nếu (và chỉ khi) việc đẩy thành công. Vì vậy, bạn nên cung cấp -u
trên đẩy đầu tiên . Trong thực tế, bạn có thể cung cấp nó cho bất kỳ lần đẩy nào sau này và nó sẽ thiết lập hoặc thay đổi ngược dòng tại thời điểm đó. Nhưng tôi nghĩ git branch --set-upstream-to
là dễ dàng hơn, nếu bạn quên.
4 Đo bằng phương pháp Austin Powers / Dr Evil chỉ đơn giản là nói "một TRIỆU-YUN", dù sao đi nữa.