Sự khác biệt giữa Forking và Nhân bản trên GitHub là gì?


186

Tôi muốn biết sự khác biệt giữa thực hiện Fork của một dự án và thực hiện clonenó.

Tôi chỉ có thể gửi yêu cầu kéo qua GitHub nếu tôi đã rẽ nhánh một dự án?


2
Có thể trùng lặp các dĩa git thực sự là git nhái?
j08691

2
Đối với những người hạ cánh ở đây đang tìm kiếm một lời giải thích về "ngã ba" với Git (không phải GitHub). Không có lệnh "fork" trên Git. Nó là một khái niệm GitHub (không phải Git). Một sự phân biệt dễ bị lãng quên.
ambassallo

Câu trả lời:


113

Về cơ bản, có. A forkchỉ là một yêu cầu để GitHub sao chép dự án và đăng ký nó dưới tên người dùng của bạn ; GitHub cũng theo dõi mối quan hệ giữa hai kho lưu trữ, vì vậy bạn có thể hình dung các cam kết và kéo giữa hai dự án (và các nhánh khác).

Bạn vẫn có thể yêu cầu mọi người lấy từ kho lưu trữ nhân bản của mình, ngay cả khi bạn không sử dụng fork- nhưng bạn phải tự giải quyết công khai. Hoặc gửi các bản vá cho nhà phát triển (xem git format-patch) mà họ có thể áp dụng cho cây của họ.


4
Dĩa mất rất nhiều công việc để cập nhật hơn so với bản sao. Một bản sao có thể được cập nhật với một đơn giản git pull. Một ngã ba có nhiều lệnh. Và không có gì đáng ngạc nhiên, gần như mọi ngã ba tôi nhìn vào đều lỗi thời. Fork giống như vấn đề kho lưu trữ Maven trên steroid. Thay vì một repo lỗi thời (Maven), có hàng ngàn người trong số họ (Git).
jww

@jww nghe có vẻ tốt nhất khi chỉ gắn bó với bản sao - tại sao lại sử dụng ngã ba?
serup

@serup - lý do là bản sao rẽ nhánh có thể được chỉnh sửa git pullvì vậy vẫn còn một số mối quan hệ tồn tại. Nếu bạn nhân bản toàn bộ bản sao, nó sẽ nằm trên máy cục bộ của bạn và ngắt kết nối với repo gốc.
JonH

134

Khi bạn nói rằng bạn đang Ngã ba một kho lưu trữ, về cơ bản bạn đang tạo một bản sao của kho lưu trữ dưới ID GitHub của bạn. Các điểm chính cần lưu ý ở đây là bất kỳ thay đổi đối với kho gốc sẽ được phản xạ trở lại để bạn chia hai kho (bạn cần phải lấy và rebase). Tuy nhiên, nếu bạn thực hiện bất kỳ thay đổi nào đối với kho lưu trữ rẽ nhánh của mình, bạn sẽ phải tạo một yêu cầu kéo đến kho lưu trữ ban đầu một cách rõ ràng . Nếu yêu cầu kéo của bạn được quản trị viên của kho lưu trữ ban đầu chấp thuận , thì những thay đổi của bạn sẽ được cam kết / hợp nhất với cơ sở mã gốc hiện có . Cho đến lúc đó, những thay đổi của bạn sẽ chỉ được phản ánh trong bản sao bạn đã rẽ nhánh .

Nói ngắn gọn:

Mô hình Fork & Pull cho phép mọi người rẽ nhánh một kho lưu trữ hiện có và đẩy các thay đổi đến ngã ba cá nhân của họ mà không yêu cầu quyền truy cập được cấp cho kho lưu trữ nguồn. Các thay đổi sau đó phải được người bảo trì dự án kéo vào kho lưu trữ nguồn.

Lưu ý rằng sau khi giả mạo, bạn có thể sao chép kho lưu trữ của mình (cái dưới tên của bạn) cục bộ trên máy của bạn. Thay đổi trong đó và đẩy nó vào kho lưu trữ của bạn. Tuy nhiên, để phản ánh các thay đổi của bạn trong kho lưu trữ ban đầu, yêu cầu kéo của bạn phải được chấp thuận.

Cặp đôi thú vị khác -

Là dĩa git thực sự git nhái?

Làm cách nào để cập nhật kho lưu trữ rẽ nhánh GitHub?


24
"Điểm chính cần lưu ý ở đây là mọi thay đổi được thực hiện đối với kho lưu trữ ban đầu sẽ được phản ánh trở lại kho lưu trữ của bạn." Đó là một chút sai lầm tôi nghĩ. AFAIK, những thay đổi được thực hiện cho kho lưu trữ ban đầu sau khi ngã ba không được phản ánh tự động trong ngã ba; bạn phải di chuyển những thay đổi đó bằng tay. Những thay đổi xảy ra trước ngã ba mặc dù được sao chép sang ngã ba mới khi bạn nhấp vào nút ngã ba.
Ajedi32

"Bất kỳ thay đổi nào được thực hiện cho kho lưu trữ ban đầu sẽ được phản ánh trở lại kho lưu trữ của bạn" .. thực sự ?? Không tự động tôi hy vọng
KansaiRobot

Tôi đã làm việc cho dự án của khách hàng và sử dụng mô hình nhân bản và đẩy cho công việc. Một ngày nọ, tôi rẽ nhánh nó và ngay lập tức tôi nhận được một tin nhắn nói rằng cần phải làm gì để hoàn thành repo. Tôi thực sự không hiểu làm thế nào mà được coi là sai?
dùng3075740

những thay đổi được thực hiện cho kho lưu trữ ban đầu sau ngã ba không được phản ánh tự động trong ngã ba, nhưng để làm như vậy, hãy kiểm tra bước 3 của blog này: - help.github.com/articles/fork-a-repo
Suhas Chikkanna

"Bất kỳ thay đổi nào được thực hiện cho kho lưu trữ ban đầu sẽ được phản ánh trở lại kho lưu trữ của bạn" - bạn có nghĩa là điều này là không thể sau khi chúng tôi sao chép?
biến

26
  • Dự án Forked là trên kho lưu trữ trực tuyến của bạn (repo).
  • Dự án nhân bản là trên máy cục bộ của bạn (tôi thường nhân bản sau khi sửa repo).

Bạn có thể cam kết về repo trực tuyến của bạn (hoặc cam kết với repo cục bộ của bạn và sau đó đẩy sang repo trực tuyến của bạn), sau đó gửi yêu cầu kéo.

Người quản lý dự án có thể chấp nhận nó để có được những thay đổi của bạn trong phiên bản trực tuyến chính của anh ấy.


13

Một bản sao là nơi bạn có sự trùng lặp thích hợp và phân tách giữa hai phiên bản (có thể khác nhau) của một kho lưu trữ. Khi một repo được sửa đổi, nội dung mới phải được sao chép tích cực sang repo khác bằng lệnh đẩy. Và thay đổi trong repo khác lấy.

Khi bạn rẽ nhánh một repo, trên một máy chủ, không cần sao chép nội dung vì cả hai repos sẽ sử dụng cùng một nội dung [đối tượng cố định] từ cùng một máy chủ đó. 'Bí quyết' là trong việc quản lý các quan điểm người dùng khác nhau để mỗi người dùng tin rằng họ có một bản sao cá nhân đầy đủ của repo. Đẩy và tìm nạp giữa các dĩa chỉ đơn giản là cập nhật con trỏ của người dùng.

Ở cấp độ thấp hơn, git làm điều tương tự trong nội bộ. Nếu bạn có ba tệp khác nhau, mỗi tệp chứa Hello World, thì git chỉ đơn giản là 'forks' bản sao duy nhất của blob Hello World và cung cấp nó ở mỗi ba nơi theo yêu cầu.

Khả năng rẽ nhánh trên máy chủ có nghĩa là trung bình dung lượng lưu trữ lớn của Github không lớn bằng trung bình vì mọi người đều chia sẻ một repo cơ bản duy nhất.


5

Tóm lại, Forking có lẽ giống như "nhân bản dưới ID / hồ sơ GitHub của bạn". Một ngã ba là bất cứ lúc nào tốt hơn một bản sao, với một vài ngoại lệ, rõ ràng. Kho lưu trữ rẽ nhánh luôn được theo dõi / so sánh với kho lưu trữ ban đầu không giống như kho lưu trữ nhân bản. Điều đó cho phép bạn theo dõi các thay đổi, bắt đầu các yêu cầu kéo và cũng đồng bộ hóa thủ công các thay đổi được thực hiện trong kho lưu trữ ban đầu với kho lưu trữ của bạn.


5

Trong khi câu trả lời của @ AniketThakur là rất tốt. Không ai trả lời câu hỏi sau đây.

Tôi chỉ có thể gửi yêu cầu kéo qua GitHub nếu tôi đã rẽ nhánh một dự án?

Không. Nếu bạn là người đóng góp cho kho lưu trữ, bạn có thể: Tạo một bản sao cục bộ. Làm một chi nhánh địa phương. Thêm cam kết vào chi nhánh đó. Đẩy nhánh cục bộ trở lại github (tạo nhánh từ xa trong tiến trình). Tạo một yêu cầu kéo yêu cầu cho nhánh đó được sáp nhập vào nhánh chính (hoặc bất kỳ nhánh nào bạn thích).


3

Trong trường hợp bạn đã làm những gì người hỏi gợi ý (quên rẽ nhánh và chỉ nhân bản một repo cục bộ, thực hiện thay đổi và bây giờ cần đưa ra yêu cầu kéo), bạn có thể quay lại theo dõi:

  1. ngã ba repo bạn muốn gửi yêu cầu kéo đến
  2. đẩy những thay đổi cục bộ của bạn đến điều khiển từ xa
  3. yêu cầu kéo

2

Một sự khác biệt tinh tế kỳ lạ khác trên GitHub là những thay đổi về dĩa không được tính vào nhật ký hoạt động của bạn cho đến khi những thay đổi của bạn được kéo vào repo ban đầu. Hơn nữa, để thay đổi một ngã ba thành một bản sao thích hợp, rõ ràng bạn phải liên hệ với bộ phận hỗ trợ của Github.

Từ Tại sao những đóng góp của tôi không hiển thị :

Cam kết được thực hiện trong một ngã ba

Cam kết thực hiện trong một ngã ba sẽ không được tính vào đóng góp của bạn. Để làm cho chúng được tính, bạn phải thực hiện một trong những điều sau đây:

Mở một yêu cầu kéo để các thay đổi của bạn được hợp nhất vào kho lưu trữ mẹ. Để tách ngã ba và biến nó thành một kho lưu trữ độc lập trên GitHub, hãy liên hệ với bộ phận Hỗ trợ của GitHub . Nếu ngã ba có các nhánh riêng, hãy cho bộ phận hỗ trợ biết liệu các nhánh sẽ di chuyển với kho lưu trữ của bạn vào một mạng mới hay vẫn ở trong mạng hiện tại. Để biết thêm thông tin, xem " Giới thiệu về dĩa ."


2

Tóm lại, "fork" tạo một bản sao của dự án được lưu trữ trên tài khoản GitHub của riêng bạn.

"Clone" sử dụng phần mềm git trên máy tính của bạn để tải xuống mã nguồn và toàn bộ lịch sử phiên bản cho máy tính đó

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.