Git - Sự khác biệt giữa Push.default và phù hợp với ăn gì


285

Tôi đã sử dụng git được một thời gian rồi, nhưng tôi chưa bao giờ phải tự thiết lập một repo từ xa mới và tôi đã tò mò khi làm như vậy. Tôi đã đọc hướng dẫn và tôi bối rối về cách làm cho "git đẩy" hoạt động.

Nếu tôi chỉ đơn giản sử dụng git pushnó yêu cầu tôi tìm một nhánh mặc định (?) Để trỏ đến? Sự khác biệt giữa hai tùy chọn mà nó cung cấp cho tôi là gì?

git config --global push.default matching
git config --global push.default simple

Kết hợp chỉ đẩy bất kỳ chi nhánh nào tôi có trên repo địa phương của tôi và nếu chúng không khớp tôi phải tự bảo nó để đẩy bất kỳ chi nhánh địa phương mới nào tôi có, đúng không? Đây là thực hành tốt nhất để sử dụng hay đơn giản là tốt nhất?



1
Bây giờ, nếu chỉ pull.defaultcó sẵn để cập nhật tất cả các chi nhánh đó tại địa phương
Nogurenn

Câu trả lời:


367

git push có thể đẩy tất cả các nhánh hoặc một nhánh phụ thuộc vào cấu hình này:

Đẩy tất cả các chi nhánh

git config --global push.default matching

Nó sẽ đẩy tất cả các nhánh đến nhánh từ xa và sẽ hợp nhất chúng. Nếu bạn không muốn đẩy tất cả các chi nhánh, bạn chỉ có thể đẩy chi nhánh hiện tại.

Chỉ đẩy chi nhánh hiện tại

git config --global push.default simple

Vì vậy, theo tôi, tốt hơn là sử dụng tùy chọn này và đẩy nhánh mã của bạn theo nhánh. Tốt hơn là đẩy các nhánh bằng tay và cá nhân.


16
Tôi thích push.default currentcâu trả lời từ @UpAndAdam. Không biết về nó.
alanjds 17/1/2015

4
Lưu ý rằng đó simplekhông còn là một lựa chọn. Trong 1.7.8.4(và trước đó?) Nó dẫn đến một lỗi khi bạn cố gắng đẩy. nhưng currentvẫn có sẵn
Sixty4bit

@ sixty4bit: Tôi đang sử dụng phiên bản git 1.7.1. Tôi đang sử dụng tracking-> đẩy nhánh hiện tại lên nhánh ngược dòng của nó.
kevinarpe

@ sixty4bit Không, nó được đưa vào Phiên bản Git sau này mà tôi không biết trong đó nhưng (1.7) cũ như địa ngục, ngay cả trong năm 2016. Tôi không khuyên bạn nên sử dụng Phiên bản cũ như vậy.
Schmoudi

Bị hạ bệ. Xin lỗi, nhưng mô tả của trang được liên kết simplekhông có ý nghĩa, mâu thuẫn với câu trả lời này và không chính xác - điều này làm cho câu trả lời này trở nên khó hiểu. Trang được liên kết cho biết simple"sẽ đẩy từng nhánh một. Chủ yếu được kết nối với nhánh hiện tại." Điều đó có nghĩa là nó sẽ đẩy các nhánh theo tuần tự trái ngược với song song? "Hầu hết kết nối" có nghĩa là gì? Sau đó, phần mô tả simpletiếp tục trích dẫn phần mô tả matching, cái mà người ta nghĩ có nghĩa là phần mô tả matchingcũng được áp dụng cho simple. Nhưng rõ ràng điều đó không đúng.
tvanc

91

Từ tài liệu GIT: Git Docs

Dưới đây cung cấp thông tin đầy đủ. Nói tóm lại, simplesẽ chỉ đẩy current working branchvà thậm chí sau đó chỉ khi nó cũng có cùng tên trên điều khiển từ xa. Đây là một cài đặt rất tốt cho người mới bắt đầu và sẽ trở thành mặc định trongGIT 2.0

Trong khi đó matchingsẽ đẩy tất cả các chi nhánh địa phương có cùng tên trên điều khiển từ xa. (Không liên quan đến chi nhánh làm việc hiện tại của bạn). Điều này có nghĩa là có khả năng nhiều nhánh khác nhau sẽ được đẩy, bao gồm cả những nhánh mà bạn thậm chí không muốn chia sẻ.

Trong cách sử dụng cá nhân của tôi, tôi thường sử dụng một tùy chọn khác: currentđẩy nhánh làm việc hiện tại, (vì tôi luôn phân nhánh cho bất kỳ thay đổi nào). Nhưng đối với người mới bắt đầu, tôi đề nghịsimple

push.default
Xác định hành động git đẩy sẽ thực hiện nếu không có refspec được đưa ra rõ ràng. Các giá trị khác nhau rất phù hợp cho quy trình công việc cụ thể; ví dụ, trong một luồng công việc hoàn toàn trung tâm (nghĩa là nguồn tìm nạp bằng với đích đẩy), ngược dòng có thể là những gì bạn muốn. Các giá trị có thể là:

không có gì - không đẩy bất cứ điều gì (lỗi ra) trừ khi một refspec được đưa ra rõ ràng. Điều này chủ yếu có nghĩa là cho những người muốn tránh sai lầm bằng cách luôn luôn rõ ràng.

hiện tại - đẩy chi nhánh hiện tại để cập nhật một chi nhánh có cùng tên ở đầu nhận. Hoạt động trong cả hai quy trình làm việc trung tâm và không trung tâm.

ngược dòng - đẩy nhánh hiện tại trở lại nhánh có thay đổi thường được tích hợp vào nhánh hiện tại (được gọi là @ {ngược dòng}). Chế độ này chỉ có ý nghĩa nếu bạn đang đẩy vào cùng một kho lưu trữ mà bạn thường lấy từ (tức là luồng công việc trung tâm).

đơn giản - trong quy trình làm việc tập trung, làm việc như ngược dòng với sự an toàn bổ sung để từ chối đẩy nếu tên của chi nhánh ngược dòng khác với tên địa phương.

Khi đẩy đến một điều khiển khác với điều khiển từ xa mà bạn thường kéo từ đó, hãy làm việc như hiện tại. Đây là lựa chọn an toàn nhất và phù hợp cho người mới bắt đầu.

Chế độ này sẽ trở thành mặc định trong Git 2.0.

khớp - đẩy tất cả các nhánh có cùng tên ở cả hai đầu. Điều này làm cho kho lưu trữ mà bạn đang cố gắng ghi nhớ tập hợp các nhánh sẽ bị đẩy ra (ví dụ: nếu bạn luôn đẩy duy trì và làm chủ ở đó và không có các nhánh khác, kho lưu trữ mà bạn đẩy sẽ có hai nhánh này, và duy trì và làm chủ cục bộ của bạn sẽ được đẩy ở đó).

Để sử dụng chế độ này một cách hiệu quả, bạn phải đảm bảo tất cả các nhánh bạn sẽ đẩy ra đã sẵn sàng để bị đẩy ra trước khi chạy git đẩy, vì toàn bộ điểm của chế độ này là cho phép bạn đẩy tất cả các nhánh trong một lần. Nếu bạn thường hoàn thành công việc chỉ trên một nhánh và đưa ra kết quả, trong khi các nhánh khác chưa hoàn thành, chế độ này không dành cho bạn. Ngoài ra chế độ này không phù hợp để đẩy vào kho lưu trữ trung tâm được chia sẻ, vì những người khác có thể thêm các nhánh mới ở đó hoặc cập nhật mẹo của các nhánh hiện có ngoài tầm kiểm soát của bạn.

Đây hiện là mặc định, nhưng Git 2.0 sẽ thay đổi mặc định thành đơn giản.


có, nhưng tôi giả sử ngay cả với cài đặt push.default rằng nếu bạn thực hiện "$ git push origin master ", nó sẽ chỉ đẩy nhánh hiện tại xuất phát sang nhánh có nguồn gốc cùng tên ... đúng không? bạn nên đề cập rằng cũng có một điều khiển từ xa mặc định
Alexander Mills

1
Tôi không chắc tôi hiểu những gì bạn đang nhận được. Trong BẤT K MOD CHẾ ĐỘ NÀO nếu bạn nói git push origin masternó sẽ làm điều tương tự. Điểm chung của các chế độ và mặc định nói chung là những gì xảy ra khi bạn nói đơn giản git pushvà bạn không nói với nó một điều khiển từ xa hoặc chi nhánh. Cài đặt mặc định nào? ý bạn là cài đặt mặc định của push.default? cài đặt mặc định trong phiên bản git nào ... nếu bạn không nhận được bình luận của bạn là vô cùng mơ hồ.
UpAndAdam

'Push.default Xác định hành động git đẩy sẽ thực hiện nếu không có refspec nào được đưa ra rõ ràng' nếu bạn nói chủ git đẩy gốc bạn đang cung cấp thêm thông tin và nó vẫn có thể không làm những gì bạn mô tả; tùy thuộc vào refspec mà bạn thiết lập .. git-scm.com/book/en/v2/Git-Iternals-The-Refspec
UpAndAdam

2

Ghi chú phát hành Git v2.0

Ghi chú tương thích ngược

Khi git push [$there]không nói phải đẩy cái gì, chúng tôi đã sử dụng ngữ nghĩa "khớp" truyền thống cho đến nay (tất cả các chi nhánh của bạn được gửi đến điều khiển từ xa miễn là đã có các nhánh cùng tên ở đó). Trong Git 2.0, mặc định bây giờ là ngữ nghĩa "đơn giản", đẩy:

  • chỉ nhánh hiện tại đến nhánh có cùng tên và chỉ khi nhánh hiện tại được thiết lập để tích hợp với nhánh từ xa đó, nếu bạn đang đẩy đến cùng một điều khiển từ xa; hoặc là

  • chỉ nhánh hiện tại đến nhánh có cùng tên, nếu bạn đang đẩy đến một điều khiển không phải là nơi bạn thường tìm nạp.

Bạn có thể sử dụng biến cấu hình "push.default" để thay đổi điều này. Nếu bạn là một người hẹn giờ cũ muốn tiếp tục sử dụng ngữ nghĩa "khớp", bạn có thể đặt biến thành "khớp", chẳng hạn. Đọc tài liệu cho các khả năng khác.

Khi git add -ugit add -Ađược chạy bên trong thư mục con mà không chỉ định đường dẫn nào cần thêm trên dòng lệnh, chúng hoạt động trên toàn bộ cây để thống nhất với git commit -acác lệnh khác (các lệnh này chỉ được sử dụng để hoạt động trên thư mục con hiện tại). Nói git add -u .hoặc git add -A .nếu bạn muốn giới hạn hoạt động trong thư mục hiện tại.

git add <path>giống như git add -A <path>bây giờ, do đó git add dir/sẽ thông báo các đường dẫn bạn đã xóa khỏi thư mục và ghi lại việc xóa. Trong các phiên bản cũ hơn của Git, git add <path>được sử dụng để bỏ qua việc xóa. Bạn có thể nói git add --ignore-removal <path>chỉ thêm các đường dẫn được thêm hoặc sửa đổi <path>, nếu bạn thực sự muốn.

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.