Cấu trúc của kho Git


15

Xin lỗi nếu đây là một bản sao, tôi nhìn.

Chúng tôi đang chuyển đến Git. Trong Subversion, tôi đã quen với việc có các thư mục \ trunk, \ Branch và \ tags.

Với Git, chuyển đổi giữa các chi nhánh sẽ thay thế nội dung của thư mục làm việc, vì vậy tôi có đúng không khi cho rằng cách chúng ta sử dụng để làm việc không áp dụng với Git?

Tôi đoán là tôi có một thư mục repo có thể là một gitignore và readme.txt, sau đó là các thư mục cho các dự án tạo nên repo, và đó là nó.

Câu trả lời:


15

Bạn sẽ có "thân cây", bây giờ được gọi là "chủ", bạn sẽ có "nhánh" bây giờ được gọi là "đầu" và bạn sẽ có "thẻ", vẫn được gọi là "thẻ", nhưng chúng sẽ không phải là thư mục , chúng sẽ là " refs ", gắn nhãn cho các phiên bản sống trong không gian tên riêng biệt bên trong kho lưu trữ.

Subversion và Git có nhiều cách khác nhau để phân nhánh. Mô hình lật đổ cơ bản là có một cây thư mục với dòng thời gian toàn cầu duy nhất và nếu bạn muốn phân nhánh, bạn sao chép một cây con trong thư mục khác.

Mặt khác, Git có một cây thư mục với các phiên bản mà mỗi định nghĩa là cha mẹ của nó, nhưng mỗi phiên bản có thể có nhiều cha mẹ (hợp nhất) và nhiều con (các nhánh). Vì vậy, thay vì có các thư mục cho các chi nhánh, bạn có các phiên bản được tạo độc lập. "Refs" chỉ là tên liên quan đến sửa đổi mới nhất cho "chi nhánh" nhất định.

Sự khác biệt này là cơ bản để kiểm soát phiên bản phân tán. Git (và các hệ thống phân tán khác) không có bất kỳ cơ quan trung ương nào để giữ lịch sử tuyến tính, do đó, các bản sửa đổi có thể được tạo độc lập trên nhiều kho lưu trữ mà không cần biết về nhau và hệ thống phải chứa chúng. Hóa ra việc khái quát hóa làm cho việc phân nhánh và sáp nhập dễ dàng hơn rất nhiều nói chung.

Lưu ý rằng trong Git, bản sửa đổi không nằm trên bất kỳ nhánh nào. Họ chỉ là và chi nhánh chứa chúng. Nhưng một khi chi nhánh được hợp nhất hoặc chứng minh là ngõ cụt, bạn có thể xóa "ref" chỉ vào nó và quên nó hoàn toàn (nếu bạn loại bỏ các thử nghiệm cũ, cuối cùng chúng sẽ được thu gom rác git gc). Điều này giúp bạn tránh bị ngập trong các thí nghiệm cũ không ai nhớ những gì họ đã nói về nữa.


Mát mẻ. Không có thẻ, chi nhánh và thư mục vô nghĩa khác là cần thiết. Đáng yêu.
Luke Puplett

2
@LukePuplett: Phương pháp phân nhánh của Subversion khá độc đáo. Nó đến từ Perforce và tôi tin rằng đó là hệ thống kiểm soát phiên bản khác duy nhất có nó. Thực tế là lật đổ không phân biệt rõ ràng đâu là một nhánh làm phức tạp đáng kể thuật toán hợp nhất. Nó mang lại một số tính linh hoạt, nhưng tính linh hoạt đó không thực sự hỗ trợ bằng cách hợp nhất 3 chiều, dẫn đến rất nhiều trường hợp góc khó hiểu.
Jan Hudec

Ngay cả CVS (tiền thân tinh thần của SVN) cũng không sử dụng phương pháp tiếp cận chi nhánh (và khá lạ) đó là các thư mục. Tôi không nói rằng CVS đã làm chi nhánh tốt, nhưng ít nhất họ có một khái niệm "đúng đắn" thay vì chỉ là một thư mục.
Joachim Sauer

@JoachimSauer: Tôi không chắc CVS ​​là tiền thân tinh thần của Subversion . Họ đặt ra một nhiệm vụ để tạo ra "CVS tốt hơn", nhưng họ chủ yếu lấy các khái niệm từ Perforce.
Jan Hudec

@JanHudec: rất có thể, tôi không biết nhiều về Perforce. Ý tôi là chính xác nhiệm vụ đó: trở thành người kế thừa tốt cho CVS.
Joachim Sauer

3

Chỉ cần nghĩ về Git như một chế độ xem 3D của cùng một dữ liệu mà bạn thấy trong 2D trong SVN - tức là với SVN, bạn phân nhánh gốc của mình và nó xuất hiện dưới dạng bản sao được hiển thị dưới dạng thư mục mới trong cây. Với Git, khi bạn phân nhánh, nó xuất hiện dưới dạng bản sao được hiển thị dưới dạng "lớp" trên cây hiện có của bạn. Một khi bạn nhận ra rằng nó khá dễ dàng để khái niệm sự khác biệt.

Với SVN, bạn vẫn có thể hoạt động giống như Git - chuyển đổi giữa các nhánh sẽ thay thế chế độ xem đơn của cơ sở mã bằng chế độ xem phân nhánh, điều này áp dụng cho dù bạn sử dụng chuyển đổi svn hay kiểm tra git.

Rõ ràng bạn có thể lấy một bản sao của một chi nhánh trong SVN bằng cách kiểm tra chi nhánh đến vị trí thư mục của nó, giống như nhân bản một repo git đến một vị trí khác trên đĩa của bạn.

Áp dụng tương tự cho các thẻ - bạn có thể gắn nhãn sửa đổi git hoặc bạn có thể tạo một nhánh để phát hành. Các thẻ SVN giống như các nhánh, quy ước duy nhất mà chúng được gọi là 'thẻ'. Bạn có thể gắn nhãn (tốt, ghi lại số sửa đổi) của một repo SVN để có một ảnh chụp nhanh của một bản phát hành.

Sự khác biệt giữa git và svn có liên quan nhiều hơn đến cách thức đăng ký và kiểm tra xảy ra, không phải với các nguyên tắc cơ bản của kiểm soát nguồn. Chế độ xem mã có thể khác nhau (bạn sẽ không bao giờ thấy một chế độ xem của cây mã bao gồm các nhánh trong git và bạn có thể phân nhánh một kho lưu trữ một phần trong SVN, nhưng cuối cùng chúng chỉ là những khác biệ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.