Git — Bắt đầu với những khái niệm

Ngày xửa ngày xưa, khi mới đặt chân vào con đường lập trình, tôi có cơ hội được tham gia vào một dự án khá lớn, với nhiều lập trình viên khác. Mỗi người được giao nhiệm vụ code các chức năng khác nhau, sau khi code xong sẽ copy các file liên quan vào trong USB để mang tới chỗ teamleader “ghép code”. Nếu có bug thì fix và sau đó lại copy file vào USB để ghép lại, công việc này cứ lặp đi lặp lại cho tới khi chức năng hoàn tất.

Sau một thời gian làm việc, chúng tôi nhận ra rằng cách ghép code này tiêu tốn khá nhiều thời gian và có thể xảy ra nhiều rủi ro. Chẳng hạn như trong trường hợp muốn recover lại file nào đó thì phải bật local history của chiếc máy tính đã được dùng để code, thậm chí là không thể recover được file khi mà có quá nhiều người cùng sửa file đó.

Cả nhóm quyết định chuyển sang dùng Git để quản lý source code và chúng tôi không còn phải sử dụng USB để ghép code nữa. Tất nhiên, không dừng lại ở đó, Git còn đem lại nhiều lợi ích tuyệt vời hơn nữa, chúng ta sẽ cùng nhau khám phá ngay sau đây.

Git là gì?

Git là một hệ thống quản lý phiên bản phân tán (Distributed Version Control System), vốn được phát triển nhằm quản lý mã nguồn của Linux.

Ngoài việc lưu trữ và ghép (merge) các phần phát triển của Dev lại với nhau, git còn cho phép bạn có thể nhìn thấy những thay đổi, sự khác biệt giữa các version của một file.

Bên cạnh đó, khi hai lập trình viên cùng chỉnh sửa một file và xảy ra xung đột (conflict) thì Git sẽ đưa ra cảnh báo để lập trình viên biết và khắc phục sự cố, điều đó giúp tránh việc bị mất code mà không hiểu vì sao.

Những khái niệm

Repository

Repository là nơi lưu trữ những thông tin liên quan đến sự thay đổi của source code (bao gồm cả file và thư mục) trong quá trình phát triển. Nó được đặt trong thư mục .git nằm tại thư mục gốc của project.

Repository được chia thành hai loại là Local Repository và Remote Repository

  • Remote Repository được đặt trên một server nào đó, nhằm mục đích chia sẻ cho các thành viên sử dụng chung. Các dịch vụ như Github, Bitbucket… chính là nơi chứa các repository này.
  • Local Repository là repository nằm trên máy tính của Dev, dành cho một người sử dụng.

Trong một Project thông thường sẽ có một Remote Repository và nhiều Local Repository. Lúc này Remote Repository có vai trò như một kho trung gian, giúp đồng bộ source code giữa các Local Reposition của Dev, thông qua hành động Push và Pull.

Commit và Staging Area

Commit là hành động ghi lại những thay đổi của source code so với lần commit trước, tạo ra một snapshot (version) mới của project. Các commit được nối tiếp nhau theo thứ tự thời gian.

Trong quá trình code chúng ta sẽ có nhiều file bị thay đổi, nhưng có thể bạn sẽ không muốn commit tất cả các file đó lên Repository. Vì thế, trước khi commit, bạn cần chỉ định xem file nào sẽ được commit lên bằng lệnh git add. Lệnh này sẽ đưa các file được chỉ định vào một khu vực chuẩn bị, được gọi là Staging Area. Chỉ có những file nằm trong Staging Area mới được commit.

Một điều bắt buộc nữa bạn phải thực hiện trước khi commit đó là nhập commit message. Vì message đó sẽ trở thành thông tin quan trọng khi bản thân xem lại lịch sử sau đó hay trường hợp tìm kiếm nội dung thay đổi mà người khác commit, nên hãy chú ý để viết giải thích sao cho dễ dàng hiểu được nội dung thay đổi. Viết giải thích theo hình thức tiêu chuẩn trên Git như sau:

  • Dòng thứ 1: Tóm tắt nội dung thay đổi trong commit
  • Dòng thứ 2: Dòng trống
  • Dòng thứ 3 trở đi: Chi tiết những thay đổi

Mỗi commit được tạo sẽ có một mã SHA-1 checksum duy nhất, được sinh ra từ nội dung commit và dùng để định danh. Thông thường khi làm việc với commit, chúng ta sử dụng một đoạn mã ngắn hơn (khoảng 7 kí tự) được trích ra một cách tự động từ mã checksum trên. Ví dụ: 828192f

Branch

Branch là một tính năng nổi bật của Git và cũng là khái niệm khá ảo diệu mà không thể định nghĩa trong một vài dòng.

Bạn hãy tưởng tượng về một project khi chưa sử dụng branch. Project lúc này sẽ có nhiều member thực hiện nhiều công việc khác nhau một cách song song như: phát triển một chức năng mới, fix bug cho một chức năng đã có, chỉnh sửa lại CSS cho cả dự án… Các commit sẽ chồng chéo lên nhau như thế này

Tuy nhiên đây vẫn chưa phải là điều tồi tệ nhất, điều gì xảy ra nếu member đảm nhận nhiệm vụ chỉnh sửa CSS commit một phiên bản lỗi làm nát toàn bộ giao diện của dự án?

Về phương diện người quản lý và review source, không thể kiểm soát được commit lỗi này khi mà member đó đã commit lên Remote Repository chung. Cùng với đó, các member khác cũng sẽ chịu ảnh hưởng khi đồng bộ commit lỗi này từ Remote Repository về Local Repository của mình.

Ngay lúc này đây, chúng ta sẽ cần sự giúp đỡ từ Branch. Nó được các lập trình viên trong nước gọi với cái tên thân mật là “Nhánh”. Có thể nói mỗi Branch là một không gian làm việc riêng, các thay đổi trên Branch này không ảnh hưởng đến Branch khác, ngay cả khi bạn commit nó lên Remote Repository.

Mặc định khi tạo Repository thì chúng ta đã sở hữu một Branch là master. Thông thường, các Branch (nhánh con) khác sẽ được tách ra từ Branch master này.

Các Branch đã được tách ra cũng có thể dễ dàng ghép lại (merge) vào một Branch khác.

Như vậy là member làm nhiệm vụ chỉnh sửa CSS đã có một không gian riêng để quậy phá mà không ảnh hưởng tới những người khác. Member này sẽ tạo ra hàng loạt những commit trên Branch của mình cho đến khi công việc kết thúc. Khi đó, người quản lý sẽ review code xem nó đã chuẩn chưa, nếu chuẩn thì tiến hành merge Branch này vào Branch master, để các thành viên khác có thể lấy về sử dụng.

File Status và Ignore

Bất cứ file nào trong project của bạn đều sẽ có một trong hai trạng thái: Tracked hoặc Untracked.

Tracked File là những file đã có mặt trong snapshot (version) tương ứng với lần commit gần nhất. Chúng có thể là những file chưa được thay đổi gì, đã được chỉnh sửa hoặc đã được cho vào Staging Area.

Untracked File thường là những file mới được tạo hoặc được thêm vào project, những file này sẽ không được đụng đến cho tới khi bạn chuyển trạng thái của nó thành Tracked bằng cách đưa nó vào Staging Area thông qua lệnh git add.

Đôi lúc, trong project sẽ có một số file hoặc thư mục mà bạn không muốn commit lên Repository. Chẳng hạn như những file config chứa thông tin nhạy cảm, hoặc các thư mục lib, vendor có dung lượng rất lớn. Bạn có thể bảo Git tẩy chay các file và thư mục này bằng cách thêm chúng vào file .gitignore.

HEAD

Trong git có một từ khóa rất hay được sử dụng, đó là HEAD. Nó thực chất là một con trỏ, tham chiếu đến commit cuối cùng của branch hiện tại. Thay vì phải tìm và nhập mã của commit như thế này 828192f, bạn chỉ cần sử dụng từ khóa HEAD.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.