sự khác biệt giữa ngã ba và chi nhánh trên github


127

Nếu tôi rẽ nhánh một dự án được lưu trữ trên github. Tôi có ngã ba tất cả các chi nhánh? Làm thế nào để tôi biết nhánh của mình dựa trên nhánh nào? Nói cách khác, nhánh nào sẽ được tải xuống PC của tôi?


1
Giải thích bằng tiếng Anh đơn giản: Một nhánh giống như một ngã ba từ ngã ba cha mẹ. Một ngã ba giống như một nhánh thiếu nhánh cha.
Ken Kin

Câu trả lời:


41

Tất cả các chi nhánh trên GitHub sẽ được sao chép trong một ngã ba. (Rõ ràng, điều này không bao gồm các chi nhánh không bao giờ được đẩy lên GitHub ngay từ đầu.)

Nhưng một ngã ba là một hoạt động GitHub-to-GitHub; không có gì được sao chép vào PC của bạn. Nó không hoàn toàn giống như một bản sao Git . Nếu bạn muốn hỏi những gì đã sao chép khi tôi sao chép một dự án? Thì, hãy xem hướng dẫn git-clone(1).


153

Nghĩ theo cách này:

Repo [sective] tương ứng với công việc hợp tác của nhóm trên một hoặc nhiều chi nhánh. Tất cả những người đóng góp có bản sao riêng của nó.

Mỗi ngã ba của repo chính tương ứng với công việc của người đóng góp. Một ngã ba thực sự là một cấu trúc Github (không phải Git) để lưu trữ một bản sao của repo trong tài khoản người dùng của bạn. Là một bản sao, nó sẽ chứa tất cả các nhánh trong repo chính tại thời điểm bạn thực hiện ngã ba.

Mỗi chi nhánh trong ngã ba và / hoặc trong repo chính có thể tương ứng với một số loại, tùy thuộc vào cách bạn muốn làm việc. Mỗi chi nhánh có thể đề cập đến một phiên bản của dự án nhưng cũng có thể tương ứng với các kênh phát triển khác nhau, như hotfix hoặc công việc thử nghiệm.

Các yêu cầu kéo (trong hệ sinh thái GitHub) tương ứng với nhiệm vụ. Mỗi lần tôi muốn đóng góp một nhiệm vụ hoàn thành bị cô lập vào repo chính, tôi tạo một yêu cầu kéo tương ứng với các cam kết được thực hiện trong nhiệm vụ đó. Những cam kết này được kéo từ ngã ba của tôi hoặc chi nhánh của tôi đến repo chính .

Một cam kết là một tập hợp các thay đổi cho mã. Đây là một trong những điều thú vị nhất về Git. Bạn không chuyển tập tin, bạn chuyển nhật ký thay đổi.


4
thích cách bạn giải thích tất cả các bit có liên quan như ánh xạ yêu cầu kéo tới fork / nhánh. "Bạn không chuyển tập tin, bạn chuyển nhật ký thay đổi" ... tôi đã biết điều đó nhưng cụm từ này là hoàn hảo!
khắc nghiệt

2
plus-one để làm rõ rằng fork là một github, không phải git. Cảm ơn!
emery.noel

10

Fork là một bản sao ở phía GitHub (nó nhân bản mọi thứ).
Khi bạn nhân bản một repo, bạn sẽ nhận được tất cả lịch sử của repo đã nói, với tất cả các chi nhánh của nó.

Mặc dù về lý thuyết bạn có thể thay đổi nhánh mặc định của repo từ xa , một bản sao từ repo GitHub chủ yếu tìm kiếm nhánh chính. Có nghĩa là để thay đổi nhánh "mặc định" mà bản sao GitHub sẽ nhận được, bạn cần đổi tên nhánh chính.


Vì vậy, khi tôi sao chép repo fork (tải nó xuống PC một cách hiệu quả), các chi nhánh có trên PC của tôi không? Nhưng trong một nhánh, các tập tin bổ sung đã được thêm vào. Vậy PC của tôi có những tập tin đó hay không?
Jonathan.

1
@Jonathan: PC của bạn sẽ nhận được tất cả các chi nhánh với tất cả các tệp. Nhưng thư mục làm việc của bạn (không gian nơi bạn kiểm tra một trong những nhánh đó) thực sự sẽ là không gian duy nhất mà bạn sẽ thấy các tệp đó.
VonC

Vậy các tệp khác thực sự sẽ được lưu trữ trong thư mục .git?
Jonathan.

@Jonathan: dưới dạng các đối tượng lỏng lẻo hoặc đóng gói, xem book.git-scm.com/7_how_git_stores_objects.html (các đối tượng là một blob ("tệp" của bạn), cây, cam kết hoặc thẻ: book.git-scm.com/ 1_the_git_object_model.html )
VonC

4

Nếu bạn rẽ nhánh một dự án, bạn đang tạo một bản sao của toàn bộ dự án vào tài khoản trung tâm git của bạn. bạn không đối phó với PC của bạn

Để tạo một bản sao trong PC của bạn, bạn phải sao chép nó và kéo tất cả mọi thứ và bạn sẽ có tất cả các chi nhánh & mã của dự án đó


2

Nếu bạn tạo một nhánh của một dự án từ trang web Github, bạn sẽ nhận được tất cả các chi nhánh từ dự án ngược dòng.

Nếu bạn sao chép từ ngã ba mới đúc vào PC cục bộ, bạn sẽ có originđiều khiển từ xa trên PC chỉ vào nhánh chính của ngã ba của bạn trên Github.


Theo trang Help.GitHub Forking một dự án , tạo upstreamchi nhánh là việc bạn phải làm; và họ cho bạn biết làm thế nào để làm như vậy.
JC Salomon

2
Đó là một điều khiển từ xa, không phải là một chi nhánh.
Arrowmaster

1

Điều này có thể được giải thích rất tốt. Bạn có một kho lưu trữ trung tâm tại GitHub. Bất cứ khi nào bạn lấy một bản sao của nó trên máy tính cá nhân của mình để thực hiện một số thay đổi, bản sao cục bộ này của kho lưu trữ chính được gọi là một ngã ba.

Chi nhánh là một cái gì đó khác nhau và được bao gồm trong ngã ba / repo. Trên thực tế, chi nhánh là công việc của bạn ở giai đoạn phát triển khác nhau. Chúng được tạo như và khi được yêu cầu để lưu một tập hợp các chức năng, để cấp quyền truy cập cho những người dùng khác nhau, để chứng minh trang web cho khách hàng, v.v.


1

Tôi muốn chia sẻ một ví dụ thực tế về thời điểm chúng ta sử dụng Chi nhánh và khi chúng ta sử dụng Fork

Chúng tôi có GitLab tại cửa hàng của chúng tôi và đôi khi chúng tôi phải làm việc với các gói từ một dự án Laravel. Chúng tôi thường tạo một nhánh và đẩy các thay đổi đến nhánh mà chúng tôi đã thử nghiệm trong môi trường phát triển VM cục bộ của chúng tôi khi làm việc với dự án Laravel thực tế.

Hãy nói rằng dự án của chúng tôi được đặt tại

https://github.com/yardpenalty/mainproject.git

Chi nhánh sử dụng:

Hãy nói rằng chi nhánh được gọi là It_doesnt_matter

Khi chúng tôi có chi nhánh theo cách chúng tôi muốn sản xuất, sau đó chúng tôi thực hiện lần đẩy cuối cùng đến chi nhánh này và tạo một yêu cầu hợp nhất sau đó đi vào UAT để thử nghiệm. Một khi thử nghiệm đã trải qua QC, các thay đổi được hợp nhất vào sản xuất.

Hợp nhất từ It_doesnt_matter chi nhánh hiện được đẩy vào dự án tổng thể

tại https://github.com/yardpenalty/mainproject.git

Giả sử dự án trọn gói được đặt tại

https://github.com/yardpenalty/mypackage.git

Hãy nhớ rằng sản phẩm chính sử dụng gói này trong sản xuất để chúng tôi không thể thay đổi bằng cách đẩy chúng sang gói này (trong số các lý do khác). Giả sử một nhà phát triển web phải chỉnh sửa gói này để thay đổi sản xuất.

Một nhánh đơn giản sẽ không hoạt động vì chúng ta không thể thấy các thay đổi của mình mà không xuất bản gói, v.v.

Cách sử dụng ngã ba: Bây giờ là khi chúng tôi phải thực hiện một chút mánh khóe với gói của chúng tôi để chúng tôi tạo một bản sao của gói sản xuất thông qua một ngã ba. Các tập tin composer.json có thể được cập nhật để trỏ đến ngã ba hiện nằm ở đường dẫn Người dùng hoặc Nhóm

Vì vậy, chúng tôi sẽ tạo ra một ngã ba trong https://github.com/yardpenalty/mypackage.git

và gọi nó https://github.com/yardpenalty/yards/mypackage.git

Bây giờ chúng tôi có thể cập nhật tệp composer.json để trỏ đến gói này trong "kho" của chúng tôi: [mảng như vậy và chúng tôi sẽ đi!

 {
            "type": "github",
            "url": "https://github.com/yardpenalty/yard/mypackage.git"
 }

]

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.