2012-12-06 32 views
23

Tôi đã đọc những người đàn ông git về lệnh push, nhưng tôi vẫn không hiểu sự khác biệt chính xác giữa hiệnthượng nguồn được thiết lập trong đẩy. mặc địnhgit - đẩy vs hiện tại đẩy ngược dòng (theo dõi)

Tôi muốn nhóm của chúng tôi sẽ chỉ thực hiện đẩy và chỉ những thay đổi về chi nhánh mà họ hiện đang làm việc, sẽ bị đẩy. Như tôi đã hiểu, chi nhánh này là chi nhánh được đánh dấu * (sao) khi tôi làm chi nhánh git.

Cảm ơn bạn đã trợ giúp.

Trả lời

38

Câu hỏi đặt ra là được bạn đẩy, và đến nơi:

  • current:

    • "" chỉ là chi nhánh hiện tại của bạn (không có khác chi nhánh),
    • "đến nơi "là chi nhánh cùng tên (được tạo nếu không tồn tại) trong upstream repo.
  • upstream:

    • "" cũng chỉ là chi nhánh hiện nay,
    • "đến nơi" là để bất cứ điều gì chi nhánh (không nhất thiết phải cùng tên) trên repo ngược dòng has been assigned as an upstream branch cho chi nhánh địa phương bạn đang đẩy.

Như explained here, Git2.0 sẽ bổ sung giới thiệu một mặc định mới cho push.default: simple

simple là như upstream, nhưng thượng nguồn phải có cùng tên với tốt hoặc đẩy sẽ thất bại.


Đẩy chỉ có một chi nhánh (với chế độ "simple", "current" hoặc "upstream ') tránh the scenario nơi mà tất cả các ngành phù hợp được đẩy (chế độ' matching", đó là mặc định trong một thời gian dài) , mặc dù một số chi nhánh của bạn có thể chưa sẵn sàng để được đẩy.

(master)> git push 
... 
To [email protected]:jkubicek/my_proj.git 
    21b430d..dd378ca master -> master 
! [rejected]  release -> release (non-fast-forward) 
error: failed to push some refs to '[email protected]:jkubicek/my_proj.git' 
hint: Updates were rejected because a pushed branch tip is behind its remote 
hint: counterpart. 
hint: If you did not intend to push that branch, you may want to 
hint: specify branches to push or set the 'push.default' configuration 
hint: variable to 'current' or 'upstream' to push only the current branch. 

Sự khác biệt giữa hai (currentupstream) là trong kéo (những gì để kéo từ xa đến chi nhánh của bạn?):

  • đẩy "current" không có nghĩa là chi nhánh hiện tại của bạn Bremote/B có nhánh ngược dòng.
    Tức là: branch.B.merge không được đặt, khi bạn đang đẩy chi nhánh "current".
    Tức là: khi kéo đến B, git sẽ không biết nhánh nào cần kéo.

  • đẩy "upstream" có nghĩa là chi nhánh hiện tại của bạn Bremote/B có nhánh thượng nguồn.
    Tức là: branch.B.merge được đặt khi bạn đang đẩy chi nhánh "upstream".
    Ie: khi kéo để B, git biết những gì chi nhánh để kéo (cũng như trong đó repo từ xa: branch.B.remote)

+0

'push.default' không ảnh hưởng đến' pull'! - Phải nói rằng cấu hình của một nhánh thượng nguồn có ảnh hưởng đến những gì được kéo. Nhưng cả hai thứ (upstream và push.default) là hai thứ khác nhau. –

2

push.default được bao phủ tốt nhất trong man page của git config (man git config).

Để hiểu sự khác biệt giữa “ngược dòng” và “hiện tại” cho push.default, bạn nên biết thuật ngữ thượng nguồn:

Upstream là một con trỏ địa phương từ một chi nhánh địa phương bình thường đến một chi nhánh từ xa theo dõi địa phương. (Vâng, đây là tất cả địa phương.) Ví dụ:

  • chi nhánh blabla đã nguồn gốc/blabla cấu hình như thượng nguồn (rất phổ biến)
  • chi nhánh blablanguồn gốc/foo như thượng nguồn (Chi nhánh có tên địa phương khác nhau; không quá phổ biến)
  • chi nhánh blablaorigin2/foo như thượng nguồn

Lưu ý rằng nguồn gốc/* chi nhánh là địa phương và (lại) được đặt trên mỗi lần tìm nạp gốc. Chúng được gọi là "các nhánh theo dõi từ xa cục bộ". Chúng đại diện cho trạng thái của các nhánh trên “nguồn gốc” từ xa tại thời điểm tìm nạp lần cuối.

Mỗi chi nhánh địa phương (bình thường) có thể có cấu hình ngược dòng, nhưng điều này không nhất thiết phải: cấu hình của mối quan hệ ngược dòng chỉ thuận tiện cho một số lệnh git!

Nếu bạn thực hiện ví dụ git status, git sẽ cho bạn biết "x commit phía sau/phía trước" nếu nó biết thượng nguồn (để git có thể so sánh với nó).

Bình thường ban đầu git checkout blabla thường thiết lập cấu hình ngược dòng cho bạn (nếu xuất xứ/blabla tồn tại, nó được kiểm tra và thiết lập như ngược dòng - nếu không thanh toán không thành công).

git push cũng có thể sử dụng cấu hình ngược dòng của chi nhánh, tức là sao chép các cam kết mới của bạn sang chi nhánh từ xa đại diện cho thượng nguồn. (Đây là push.default = upstream.)

push.default = current phép một git push sao chép các cam kết mới hơn để điều khiển từ xa dưới cùng tên. Nó hoàn toàn bỏ qua cấu hình ngược dòng. - Nếu tên chi nhánh địa phương của bạn luôn giống với tên nhánh ở xa, cả hai cấu hình đều có cùng tác dụng, ngoại trừ git push với push.default = upstream sẽ không thành công, nếu ngược dòng chưa được định cấu hình.

PD: Có, * ở đầu ra của git branch hiển thị nhánh hiện tại.

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