Sự khác biệt giữa git push.default = current và push.default = ngược dòng là gì?


89

Trang man cho git-config liệt kê các tùy chọn này cho push.default:

nothing - do not push anything.
matching - push all matching branches. All branches having the same name in both ends are considered to be matching. This is the default.
upstream - push the current branch to its upstream branch.
tracking - deprecated synonym for upstream.
current - push the current branch to a branch of the same name.

Trong hầu hết các trường hợp, tôi sẽ giả định rằng việc đẩy đến một nhánh ngược dòng của một nhánh sẽ giống như đẩy đến một nhánh cùng tên, vì nhánh ngược dòng thường sẽ có cùng tên và vì nhánh cùng tên ("hiện tại" ) thường (hoặc luôn luôn, theo định nghĩa?) là ngược dòng. Vậy sự khác biệt là gì?

CẬP NHẬT : Trang man cho git-config đã được cập nhật (như người ta mong đợi), do đó, sự khác biệt được thực hiện ở đó có thể rõ ràng hơn nhiều.


2
đối với các nhà phát triển, thực sự khó chịu khi khác biệt những điều này, vì vậy 'đơn giản' được giới thiệu và sẽ là bahavior mặc định cho git-push. thực sự nó đã xuất hiện trong git 1.7.11
xhlwill

14
Để biết thêm về cảnh báo git gần đây push.default is unset; its implicit value is changing in Git 2.0và về matchingso sánh với simplehãy xem stackoverflow.com/questions/13148066/…
Nate

iconoclaust: Tôi không nghĩ rằng bản chỉnh sửa của mình đã thay đổi tính toàn vẹn của câu hỏi, và thông tin lỗi thời chỉ cần được sửa. Tại sao lại bắt người dùng thực hiện thêm công việc nhấp vào liên kết?
Flimm

Câu trả lời:


72

Bạn đã tóm tắt sự khác biệt trong câu hỏi của mình. upstreamđẩy đến nhánh ngược dòng được cấu hình , trong khi currentgiả sử nhánh ngược dòng có cùng tên với nhánh cục bộ hiện tại và đẩy đến tên cụ thể đó. Trên thực tế, không có lý do gì để giả định nhánh theo dõi ngược dòng của một nhánh cục bộ có cùng tên với chính nhánh cục bộ.

Ví dụ: nếu bạn làm việc trong nhiều kho hoặc trên nhiều điều khiển từ xa của nhà phát triển được chia sẻ, bạn thường theo dõi các nhánh khác nhau của cùng một nhánh, chẳng hạn như allen-masterhoặc susan-mastercả hai đều theo dõi masternhánh trong kho của Allen và Susan, tương ứng. Trong trường hợp này, currentsẽ là cài đặt không chính xác, vì những tên nhánh đó không tồn tại trên điều khiển từ xa của chúng. upstream, tuy nhiên, sẽ hoạt động tốt.

Một ví dụ thực tế hơn có thể theo dõi cả a developmentproductionrepository. Quy trình làm việc của bạn có thể sử dụng một nhánh dòng chính khác nhau cho mỗi dòng, nhưng điều đó có thể gây nhầm lẫn. Giả sử bạn là một nhà tích hợp mã và muốn theo dõi mastercác nhánh của cả hai kho lưu trữ riêng biệt.

git checkout -b production --track production/master
git checkout -b development --track development/master

Bây giờ bạn đã có hai nhánh theo dõi các kho tương ứng của chúng, cả hai nhánh đều không sử dụng masterquy ước đặt tên. Có một chút nhầm lẫn về tên chi nhánh: Chúng mô tả rõ ràng những gì chúng theo dõi. Tuy nhiên, push.default = currentsẽ không có ý nghĩa gì vì không có điều khiển từ xa nào chứa một developmenthoặc productionnhánh.


6
Bạn đang đưa ra hai ví dụ về thời điểm upstreamđược ưu tiên hơn current. Tôi nghĩ rằng nó là khá rõ ràng, vì vậy bạn nên đưa ra một ví dụ cho trường hợp ngược lại.
AndreKR

1
@AndreKR AFAIK currenttốt hơn trong trường hợp bạn là một nhà phát triển mới vì bạn không cần git confignhiều điều đặc biệt là nếu bạn đã nhân bản từ một nơi nào đó. currentđẩy đến hoặc tạo các nhánh đồng âm-sau đó-đẩy-đến trên kho lưu trữ từ xa cho bạn nếu chúng chưa tồn tại, ngược lại simplesẽ từ chối thực hiện điều này hoàn toàn khi một nhánh cùng tên chưa tồn tại. upstreamcó cùng hành vi trong trường hợp này trừ khi một nhánh ngược dòng đã được thiết lập rõ ràng hoặc được đặt theo cách khác như đã đề cập trong câu trả lời của Yawar .
Hiếm khi 'Where's Monica' Needy

6

current sẽ đẩy chi nhánh hiện tại đến một chi nhánh có cùng tên trên repo từ xa.

upstream sẽ đẩy nhánh hiện tại lên nhánh ngược dòng.

Nhánh ngược dòng là một nhánh đã được xác định rõ ràng hoặc ngầm hiểu là nhánh ngược dòng từ nhánh hiện tại của bạn. Điều đó có nghĩa là push và pull theo mặc định sẽ đồng bộ với nhánh này. Nhánh ngược dòng có thể nằm trong cùng một repo với chính nhánh hiện tại. Bạn có thể làm những việc thú vị như thiết lập nhánh chính cục bộ của mình ngược dòng từ nhánh đối tượng địa lý (chủ đề) địa phương của bạn và đẩy và kéo giữa chúng.

Thiết lập ngược dòng ngầm định được thực hiện thông qua branch.autosetupmergegiá trị cấu hình. Bạn có thể tìm thấy tài liệu trong git configtrang trợ giúp. Thiết lập ngược dòng rõ ràng được thực hiện với -utùy chọn git branchlệnh. Xem trang trợ giúp để biết chi tiết.


Tôi không nghĩ rằng branch.autoSetupMergecó cùng một suy nghĩ như -u/ --set-upstream. Ít nhất, tôi không thấy gì trong tài liệu ngụ ý rằng nó làm cho git push hoạt động như thể nó được gọi -utheo mặc định, đó là điều mà bạn đang nói với tôi. Bạn có thể làm rõ những gì bạn muốn nói?
waldyrious

@waldyrious chắc chắn; khi bạn kiểm tra một nhánh theo dõi từ xa, branch.autoSetupMergecấu hình theo mặc định sẽ tạo một nhánh cục bộ mới và đặt ngược dòng của nó làm nhánh theo dõi từ xa. Hành động ngầm này có thể được thực hiện một cách rõ ràng bằng cách sử dụng các cờ -t( --track) hoặc -u ...( --set-upstream-to=...), thực hiện điều tương tự với các cú pháp hơi khác nhau.
Yawar

1
Tôi hiểu những gì đã xảy ra ở đây - vì câu hỏi này là về git push, tôi (nhầm lẫn) cho rằng bạn đang nói về -utùy chọn git pushthay vì -utùy chọn git branch. Xin lỗi vì sự nhầm lẫn :)
waldyrious
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.