Tips

Git, Bài 1: Giới thiệu về Git

git_logo

Là dân coder đơn thân, hoặc chỉ có mỗi bạn được phân công thi công một project nào đó, thì bạn ít nghĩ tới việc quản lí các phiên bản khác nhau của nó (một project). Bạn chỉ trải qua các bước (1) Khởi tạo project ⟶ (2) Viết code ⟶ (3) Thấy dòng nào chưa tốt thì xóa hoặc sửa và thêm các tính năng mới ⟶ (4) Thay các methods cũ bằng các methods mới gọn hơn, ổn định hơn, chạy ngon hơn. Và như vậy, ngày mới lại tới, tháng cũ qua đi, đón Tết nghỉ lễ, thì bạn vẫn xoay quanh (3) và (4). Và vì do chỉ có mỗi bạn “đứng” với cái project đó, và bạn chỉ muốn lưu nó ở mỗi cái máy tính của bạn, nên bạn không quan tâm lắm tới việc tạo phiên bản khác nhau của phần raw code. Bạn cứ vậy thay code và lưu thôi.

Nhưng nếu bạn đang ở trong một đội và đội trưởng phân công mỗi người thực hiện một tính năng cụ thể, để rồi cuối cùng ghép lại sẽ được một project hoàn chỉnh, thì việc tồn tại nhiều phiên bản biến thể của project là một “tất yếu khách quan”. Hơn nữa, trình trạng code của người này ảnh hưởng tới phần của người khác là điều không thể tránh khỏi. Ở đây tôi không nói tới phần hậu cảnh và phần ứng dụng vì điều đó là quá hiển nhiên, mà ngay cả trong nội bộ của phân đội lo hậu cảnh – tức bề chìm của tảng băng – và nội bộ những người làm phần nổi của tảng băng đó – chính là phần ứng dụng – cũng dễ diễn ra tình trạng “choảng nhau”. Chẳng hạn người lo phần local db nội bộ trên app nói là sẽ thiết kế CSDL dạng bảng có 4 cột là STT, TEN, NGAY_SINHGIOI_TINH, bên UI đồng ý và tiến hành dựng UI để lấy dữ liệu tương ứng. Nhưng tự dưng tên chịu trách nhiệm về db lại thêm một cột DIA_CHI vào giữa NGAY_SINHGIOI_TINH thì mọi thiết kế của bên UI sẽ bị đảo lộn tới tung chảo. Thôi thì cái tên lo db kia bào biện “Thôi tôi Ctrl Z là được rồi chứ gì” nhưng hỡi ôi, lỡ save luôn rồi thì Ctrl Z sao mà được chứ!

Vì vậy, một công cụ hữu hiệu để quản lí source code ra đời, và sự ra đời của nó, theo thế giới quan duy vật biện chứng và phương pháp luận biện chứng duy vật, là một tất yếu khách quan. Nó được sinh ra để giảm thiểu sự căng thẳng giữa hai bên phía trên nhằm tránh trận ẩu đả tay chân có thể diễn ra mà kết quả là người đội trưởng là người bị thiệt nhất, vì bao nhiêu tức giận của giám đốc sẽ được đổ lên đội trưởng mà.

Và vui lòng đừng đánh đồng Git và GitHub. Git là một công cụ còn GitHub chỉ là một nơi chứa dữ liệu (tức là host). Và việc dùng Git không yêu cầu bạn phải dùng GitHub vì giữa chúng chỉ là mối quan hệ “quen biết” chứ không phải “bà con thân thuộc”, và bạn có thể dùng Git với bất kì một host nào khác đều được.

1. Git là gì và Git có những cái hay nào?

Git là tên gọi của một Hệ thống quản lý phiên bản phân tán (Distributed Version Control System – DVCS) là một trong những hệ thống quản lý phiên bản phân tán phổ biến nhất hiện nay. DVCS nghĩa là hệ thống giúp mỗi máy tính có thể lưu trữ nhiều phiên bản khác nhau của một mã nguồn được nhân bản (clone) từ một kho chứa mã nguồn (repository), mỗi thay đổi vào mã nguồn trên máy tính sẽ có thể ủy thác (commit) rồi đưa lên máy chủ nơi đặt kho chứa chính. Và một máy tính khác (nếu họ có quyền truy cập) cũng có thể clone lại mã nguồn từ kho chứa hoặc clone lại một tập hợp các thay đổi mới nhất trên máy tính kia. Trong Git, thư mục làm việc trên máy tính gọi là Working Tree. (theo anh Phạm Thạch).

Nếu bạn cảm thấy định nghĩa trên có phần khó hiểu, thì cứ nghĩ Git là một công cụ cho phép bạn vơ sần hóa mã nguồn của project. Nó giúp bạn lưu lại trạng thái (mà bạn cho là) ổn định của mã nguồn dự án, và bạn có thể quay trở lại (revert) về bất cứ version nào mà bạn muốn, thậm chí bạn đang ở phiên bản thứ 100 nhưng nếu muốn xây dựng lại từ phiên bản 20 thì nó sẽ giúp bạn quay lại đúng trạng thái của phiên bản 20, với từng dòng code, từng cái tên instance, từng cái comment mà bạn từng viết ở phiên bản 20 nhưng đã xóa đi ở phiên bản 21 về sau. Miễn là bạn có lưu lại trạng thái của phiên bản thứ 20 đó.

Quan trọng hơn hết, nó cho phép bạn nhập/hòa trộn (merge) các phần nhỏ của một project lại thành project hoàn chỉnh. Chẳng hạn như tình huống mở đầu bên trên, người lo phần local db sẽ chỉ tập trung vào phần đó, người lo UI sẽ chỉ nghĩ và làm về mỗi UI mà thôi. Và khi 2 bên đưa ra code ổn định rồi, thì họ sẽ merge 2 phần đó lại và cho chạy thử. Và nếu không có Git, họ sẽ phải “cóp pát” bằng tay bằng chân với tâm lí phập phồng lo sợ là không biết có quên sót cái nào không. Nhưng nếu họ dùng Git, thì với vài dòng lệnh thì việc “khắc nhập” sẽ được tự động hóa và đảm bảo sẽ không có gì bị bỏ sót, trừ khi người viết code yêu cầu Git bỏ qua tập tin nào đó.

Một điểm hay nữa, không thể không nói tới, là Git là một công cụ vô cùng đắc lực, mạnh mẽ cho những open source projects. Những ai từ phía cộng đồng đều có thể thoải mái đem nguyên cả source code của project về, “xào nấu chiên kho nướng hấp” xong, vá các bugs nhỏ lớn xong, lại có thể “lại quả” ngược lên project đó với những dòng code của họ, qua đó cả project sẽ hoàn thiện hơn, và ứng dụng được build ra sẽ an toàn, ổn định và bảo mật hơn.

Mặt khác, nó giúp bạn push source code lên nơi chứa/giữ project dễ dàng hơn, chẳng hạn GitHub. Nó sẽ chỉ push những cái có thay đổi mà thôi. Chẳng hạn cái project có dung lượng “chà bá” lên tới 24GB mà bạn chỉ thay đổi có 10 files và chỉ tăng thêm có 20kB, Git sẽ thực hiện thay đổi với đúng 20kB đó mà thôi, chứ không phải push luôn 24GB kia lên sẹc vơ GitHub đâu. Hãy thử tưởng tượng ngồi chờ 24GB từ Việt Nam sang Mĩ trong bối cảnh cá mập “thiếu khoáng nên phải ăn cáp quang biển” như hiện tại thì… (Tôi sẽ để đây và không nói gì thêm nữa dành chỗ cho suy nghĩ của bạn).

Tuy là dữ dội như vậy, nhưng không gian của Git trên mỗi project không lớn chút nào cả. Khi tổng dung lượng của nguyên cả project có lên tới 24GB như bên trên đi nữa, thì dung lượng của thư mục .git cao lắm cũng chỉ 1GB là cùng, còn tùy thuộc vào số lần commits và số branches được giữ lại. Và nếu cái thư mục .git của các 24GB project kia chỉ vỏn vẹn có 50MB thì bạn cũng không nên quá bất ngờ là “vì sao mà nhỏ như vậy được chứ”.

2. Git cho LTV đơn thân (kể cả những LTV được phân công cả một project):

Không chỉ mang tính cộng đồng, Git còn vô cùng có ích cho những ai “một thân một mình” chịu trách nhiệm thi công “từ gốc tới ngọn” của một project, thể hiện qua việc vơ sần hóa project (tôi dùng chữ versionify không biết có đúng với ý của người Anh/Mỹ không). Như tôi đã nói, bạn đang làm tới phiên bản thứ 100, tự dưng hứng chí lên muốn “thà là bỏ đi hết ta làm lại từ đầu” với xuất phát điểm là phiên bản thứ 20. Và đương nhiên, bộ đôi Ctrl và Z cùng nhau hò hét “Chúng em không có khả năng undo tới đó được đâu” thì nếu không có Git, bạn sẽ không có cách nào khác ngoài việc nhờ… Chúa!

Chưa kể tới việc bạn muốn thử một tính năng mới, cái này đòi hỏi thêm vài chục class nữa và phân tán đều trong các package con, và bạn sẽ cần cân nhắc dùng Git, tạo một branch mới và tiến hành ở đó. Nếu như bạn muốn hủy bỏ hết thì cứ xóa cái branch đó mà thôi. Code gốc vẫn không hề hấn gì. Ngoài ra, không những hiệu quả về việc thêm vào, Git cũng có khả năng đem các file đã vô tình bị bạn “trảm nhầm” trở về, miễn là bạn có lưu lại trạng thái lúc chúng vẫn còn đó.

Chưa hết đâu, nguyên tắc hoạt động của Git là sự quan sát sự thay đổi của các tập tin, và vì vậy không chỉ đối với mã nguồn phần mềm, bạn có thể lợi dụng Git để quản lí sự thay đổi của bất kì một thư mục nào đó. Thư mục nào thì tùy ý bạn, nhạc, ảnh, phim Mĩ, phim Hàn, phim Nhật…, nhưng nói chung là nó vẫn hoạt động với các dữ liệu không phải là source code.

3. Cài đặt Git.

Để cài đặt Git, bạn sẽ chỉ cần ghé thăm trang tải về của họ ở tại địa chỉ https://git-scm.com/downloads. Lưu ý là bạn nên dùng Git dạng dòng lệnh vì nó là công cụ chính thức, dễ dàng sử dụng hơn, và các hướng dẫn của tôi sẽ được trình bày qua Git dòng lệnh. Lưu ý là đối với Debian/Ubuntu, phiên bản mới nhất trên Repo gốc là 2.7 đã quá “cũ mèm”. Vì vậy, bạn phải add cái repo git-core và update apt-get trước khi cài đặt Git. Và nếu đã có nó rồi, thì bạn hãy theo dõi những bài viết tiếp theo của chúng tôi để sử dụng nó cho hiệu quả. Hẹn gặp lại.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.