Git - Các khái niệm cơ bản

Hệ thống kiểm soát phiên bản

Version Control System (VCS) là một phần mềm giúp các nhà phát triển phần mềm làm việc cùng nhau và duy trì một lịch sử hoàn chỉnh về công việc của họ.

Dưới đây là các chức năng của VCS -

  • Cho phép các nhà phát triển làm việc đồng thời.
  • Không cho phép ghi đè các thay đổi của nhau.
  • Duy trì lịch sử của mọi phiên bản.

Sau đây là các loại VCS -

  • Hệ thống kiểm soát phiên bản tập trung (CVCS).
  • Hệ thống kiểm soát phiên bản phân tán / phi tập trung (DVCS).

Trong chương này, chúng tôi sẽ chỉ tập trung vào hệ thống điều khiển phiên bản phân tán và đặc biệt là trên Git. Git thuộc hệ thống kiểm soát phiên bản phân tán.

Hệ thống kiểm soát phiên bản phân tán

Hệ thống kiểm soát phiên bản tập trung (CVCS) sử dụng máy chủ trung tâm để lưu trữ tất cả các tệp và cho phép cộng tác nhóm. Nhưng nhược điểm chính của CVCS là điểm lỗi duy nhất của nó, tức là lỗi máy chủ trung tâm. Thật không may, nếu máy chủ trung tâm gặp sự cố trong một giờ, thì trong giờ đó, không ai có thể cộng tác cả. Và thậm chí trong trường hợp xấu nhất, nếu đĩa của máy chủ trung tâm bị hỏng và sao lưu thích hợp chưa được thực hiện, thì bạn sẽ mất toàn bộ lịch sử của dự án. Ở đây, hệ thống kiểm soát phiên bản phân tán (DVCS) đã đi vào hình ảnh.

Máy khách DVCS không chỉ kiểm tra ảnh chụp nhanh mới nhất của thư mục mà họ còn phản chiếu đầy đủ kho lưu trữ. Nếu máy chủ gặp sự cố, thì kho lưu trữ từ bất kỳ máy khách nào cũng có thể được sao chép trở lại máy chủ để khôi phục nó. Mỗi lần kiểm tra là một bản sao lưu đầy đủ của kho lưu trữ. Git không dựa vào máy chủ trung tâm và đó là lý do tại sao bạn có thể thực hiện nhiều thao tác khi ngoại tuyến. Bạn có thể cam kết các thay đổi, tạo nhánh, xem nhật ký và thực hiện các thao tác khác khi bạn ngoại tuyến. Bạn chỉ yêu cầu kết nối mạng để xuất bản các thay đổi của mình và thực hiện các thay đổi mới nhất.

Ưu điểm của Git

Nguồn mở và miễn phí

Git được phát hành theo giấy phép nguồn mở của GPL. Nó có sẵn miễn phí trên internet. Bạn có thể sử dụng Git để quản lý các dự án bất động sản mà không phải trả một xu nào. Vì nó là một mã nguồn mở, bạn có thể tải xuống mã nguồn của nó và cũng có thể thực hiện các thay đổi theo yêu cầu của bạn.

Nhanh và nhỏ

Vì hầu hết các hoạt động được thực hiện cục bộ, nó mang lại lợi ích to lớn về tốc độ. Git không dựa vào máy chủ trung tâm; đó là lý do tại sao, không cần phải tương tác với máy chủ từ xa cho mọi hoạt động. Phần cốt lõi của Git được viết bằng C, giúp tránh chi phí thời gian chạy liên quan đến các ngôn ngữ cấp cao khác. Mặc dù Git phản ánh toàn bộ kho lưu trữ, nhưng kích thước của dữ liệu ở phía máy khách là nhỏ. Điều này minh họa hiệu quả của Git trong việc nén và lưu trữ dữ liệu ở phía máy khách.

Sao lưu ngầm

Khả năng mất dữ liệu là rất hiếm khi có nhiều bản sao của nó. Dữ liệu hiện diện trên bất kỳ phía máy khách nào phản ánh kho lưu trữ, do đó nó có thể được sử dụng trong trường hợp xảy ra sự cố hoặc hỏng đĩa.

Bảo vệ

Git sử dụng một hàm băm mật mã phổ biến được gọi là hàm băm an toàn (SHA1), để đặt tên và xác định các đối tượng trong cơ sở dữ liệu của nó. Mọi tệp và cam kết đều được tổng kiểm tra và truy xuất bằng tổng kiểm tra của nó tại thời điểm thanh toán. Nó ngụ ý rằng, không thể thay đổi tệp, ngày tháng và thông báo cam kết và bất kỳ dữ liệu nào khác từ cơ sở dữ liệu Git mà không biết Git.

Không cần phần cứng mạnh mẽ

Trong trường hợp CVCS, máy chủ trung tâm cần đủ mạnh để phục vụ các yêu cầu của toàn đội. Đối với các nhóm nhỏ hơn, đó không phải là một vấn đề, nhưng khi quy mô nhóm tăng lên, các giới hạn phần cứng của máy chủ có thể là một nút cổ chai về hiệu suất. Trong trường hợp DVCS, các nhà phát triển không tương tác với máy chủ trừ khi họ cần đẩy hoặc kéo các thay đổi. Tất cả các công việc nặng nhọc xảy ra ở phía máy khách, vì vậy phần cứng máy chủ có thể rất đơn giản.

Phân nhánh dễ dàng hơn

CVCS sử dụng cơ chế sao chép giá rẻ, Nếu chúng ta tạo một chi nhánh mới, nó sẽ sao chép tất cả các mã sang chi nhánh mới, vì vậy rất mất thời gian và không hiệu quả. Ngoài ra, việc xóa và sáp nhập các chi nhánh trong CVCS cũng phức tạp và mất nhiều thời gian. Nhưng quản lý chi nhánh với Git rất đơn giản. Chỉ mất vài giây để tạo, xóa và hợp nhất các nhánh.

Thuật ngữ DVCS

Kho lưu trữ cục bộ

Mọi công cụ VCS đều cung cấp một nơi làm việc riêng như một bản sao làm việc. Các nhà phát triển thực hiện các thay đổi tại nơi làm việc riêng tư của họ và sau khi cam kết, những thay đổi này sẽ trở thành một phần của kho lưu trữ. Git tiến thêm một bước nữa bằng cách cung cấp cho họ một bản sao riêng của toàn bộ kho lưu trữ. Người dùng có thể thực hiện nhiều thao tác với kho lưu trữ này như thêm tệp, xóa tệp, đổi tên tệp, di chuyển tệp, cam kết thay đổi, v.v.

Thư mục làm việc và khu vực hoặc chỉ mục làm việc

Thư mục làm việc là nơi kiểm tra các tập tin. Trong các CVCS khác, các nhà phát triển thường thực hiện các sửa đổi và cam kết các thay đổi của họ trực tiếp với kho lưu trữ. Nhưng Git sử dụng một chiến lược khác. Git không theo dõi từng tệp được sửa đổi. Bất cứ khi nào bạn thực hiện một thao tác, Git sẽ tìm kiếm các tệp hiện diện trong khu vực dàn dựng. Chỉ những tệp có trong khu vực tổ chức mới được xem xét để cam kết và không phải tất cả các tệp đã sửa đổi.

Hãy để chúng tôi xem quy trình làm việc cơ bản của Git.

Step 1 - Bạn sửa đổi một tệp từ thư mục làm việc.

Step 2 - Bạn thêm các tệp này vào khu vực dàn dựng.

Step 3- Bạn thực hiện thao tác cam kết để di chuyển các tệp khỏi khu vực dàn dựng. Sau thao tác đẩy, nó sẽ lưu trữ các thay đổi vĩnh viễn vào kho lưu trữ Git.

Giả sử bạn đã sửa đổi hai tệp, cụ thể là “sort.c” và “search.c” và bạn muốn có hai cam kết khác nhau cho mỗi thao tác. Bạn có thể thêm một tệp trong khu vực dàn dựng và thực hiện cam kết. Sau lần cam kết đầu tiên, hãy lặp lại quy trình tương tự cho tệp khác.

# First commit
[bash]$ git add sort.c

# adds file to the staging area
[bash]$ git commit –m “Added sort operation”

# Second commit
[bash]$ git add search.c

# adds file to the staging area
[bash]$ git commit –m “Added search operation”

Blobs

Blob là viết tắt của Bcây hoàng yến Large Object. Mỗi phiên bản của một tệp được đại diện bởi các đốm màu. Một blob giữ dữ liệu tệp nhưng không chứa bất kỳ siêu dữ liệu nào về tệp. Nó là một tệp nhị phân và trong cơ sở dữ liệu Git, nó được đặt tên là hàm băm SHA1 của tệp đó. Trong Git, các tệp không được giải quyết bằng tên. Mọi thứ đều được giải quyết bằng nội dung.

Cây

Cây là một đối tượng, đại diện cho một thư mục. Nó chứa các đốm màu cũng như các thư mục con khác. Cây là một tệp nhị phân lưu trữ các tham chiếu đến các đốm màu và cây cũng được đặt tên làSHA1 băm của đối tượng cây.

Cam kết

Cam kết giữ trạng thái hiện tại của kho lưu trữ. Một cam kết cũng được đặt tên bởiSHA1băm. Bạn có thể coi một đối tượng cam kết là một nút của danh sách liên kết. Mọi đối tượng cam kết đều có một con trỏ đến đối tượng cam kết chính. Từ một cam kết nhất định, bạn có thể xem lại bằng cách nhìn vào con trỏ mẹ để xem lịch sử của cam kết. Nếu một cam kết có nhiều cam kết cha, thì cam kết cụ thể đó đã được tạo bằng cách hợp nhất hai nhánh.

Chi nhánh

Các nhánh được sử dụng để tạo ra một dòng phát triển khác. Theo mặc định, Git có một nhánh chính, giống như nhánh trong Subversion. Thông thường, một nhánh được tạo để hoạt động trên một tính năng mới. Khi tính năng được hoàn thành, nó được hợp nhất trở lại với nhánh chính và chúng tôi xóa nhánh. Mỗi chi nhánh đều được tham chiếu bởi HEAD, nó trỏ đến cam kết mới nhất trong chi nhánh. Bất cứ khi nào bạn thực hiện cam kết, HEAD đều được cập nhật bản cam kết mới nhất.

Thẻ

Thẻ chỉ định một tên có ý nghĩa với một phiên bản cụ thể trong kho lưu trữ. Các thẻ rất giống với các nhánh, nhưng sự khác biệt là các thẻ là bất biến. Nó có nghĩa là, thẻ là một nhánh, không ai có ý định sửa đổi. Khi một thẻ được tạo cho một cam kết cụ thể, ngay cả khi bạn tạo một cam kết mới, nó sẽ không được cập nhật. Thông thường, các nhà phát triển tạo thẻ cho các bản phát hành sản phẩm.

Nhân bản

Hoạt động sao chép tạo ra thể hiện của kho lưu trữ. Hoạt động sao chép không chỉ kiểm tra bản sao đang hoạt động, mà nó còn phản chiếu kho lưu trữ hoàn chỉnh. Người dùng có thể thực hiện nhiều thao tác với kho lưu trữ cục bộ này. Thời gian duy nhất mạng được tham gia là khi các phiên bản kho lưu trữ đang được đồng bộ hóa.

Kéo

Thao tác kéo sao chép các thay đổi từ phiên bản kho lưu trữ từ xa sang phiên bản cục bộ. Thao tác kéo được sử dụng để đồng bộ hóa giữa hai phiên bản kho lưu trữ. Thao tác này giống như thao tác cập nhật trong Subversion.

Đẩy

Hoạt động đẩy sao chép các thay đổi từ phiên bản kho lưu trữ cục bộ sang phiên bản từ xa. Điều này được sử dụng để lưu trữ các thay đổi vĩnh viễn vào kho lưu trữ Git. Điều này giống như hoạt động cam kết trong Subversion.

CÁI ĐẦU

HEAD là một con trỏ, con trỏ luôn trỏ đến cam kết mới nhất trong nhánh. Bất cứ khi nào bạn thực hiện cam kết, HEAD đều được cập nhật bản cam kết mới nhất. Những người đứng đầu các chi nhánh được lưu trữ trong.git/refs/heads/ danh mục.

[CentOS]$ ls -1 .git/refs/heads/
master

[CentOS]$ cat .git/refs/heads/master
570837e7d58fa4bccd86cb575d884502188b0c49

Bản sửa đổi

Bản sửa đổi đại diện cho phiên bản của mã nguồn. Các bản sửa đổi trong Git được thể hiện bằng các cam kết. Những cam kết này được xác định bởiSHA1 hàm băm an toàn.

URL

URL đại diện cho vị trí của kho lưu trữ Git. URL Git được lưu trữ trong tệp cấu hình.

[tom@CentOS tom_repo]$ pwd
/home/tom/tom_repo

[tom@CentOS tom_repo]$ cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = [email protected]:project.git
fetch = +refs/heads/*:refs/remotes/origin/*