Git là một công cụ mã nguồn mở được sáng lập bởi người tạo ra Linux, đó là Linus Torvalds. Matthew McCullough – một chuyên viên đào tạo tại GitHub, giải thích rằng Git, giống như các hệ thống điều quản lý version khác, nó quản lý và lưu trữ các sửa đổi trong các dự án. Mặc dù chủ yếu được sử dụng để quản lý source code, nhưng Git cũng có thể được sử dụng để quản lý bất kỳ loại tệp nào khác, chẳng hạn như tài liệu Word hay Excel.
Một số công cụ tiền nhiệm của Git, chẳng hạn như CVS và Subversion, có một “kho lưu trữ (repository)” trung tâm của tất cả các file liên quan đến một dự án. McCullough giải thích rằng khi một nhà phát triển thực hiện thay đổi (tạo ra các commits khác nhau), thì những thay đổi (commits) đó được ghi trực tiếp lên repository trung tâm. Nhưng với hệ thống kiểm soát version phân tán như Git, nếu bạn muốn thực hiện thay đổi cho một dự án nào đó, bạn sao chép (clone) toàn bộ repository về local. Bạn thực hiện các thay đổi (tạo ra các commits) trên bản sao local của mình, sau đó bạn có thể “push” đồng loạt các commits đó lên server trung tâm. Điều này sẽ giúp các lập trình viên tạo ra được các commits mà không cần connect với server. Việc connect với server chỉ cần khi “push” có commits lên server mà thôi.
Bản thân mình khi mới dùng Git thì khá bỡ ngỡ (trước đó chỉ dùng Subversion, Microsoft Visual SourceSafe), lúc đầu chỉ làm theo guide một cách máy móc, khi xảy ra conflict thì lúng túng không biết xử lý thế nào và hay bị mất code. Chỉ biết mấy lệnh đơn giản như pull, commit, push chứ không biết merge, rebase, xử lý conflict như thế nào. Sau một thời gian trải nghiệm và thực hành thì bây giờ mới thực sự làm chủ được Git. Sau đây mình sẽ chia sẻ một số vấn đề anh em cần lưu ý và hiểu rõ bản chất khi mới bắt đầu làm việc với Git.
Vấn đề mà những người mới dùng Git hay gặp phải
Những người mới dùng Git thường chỉ biết làm máy móc vài cái lệnh đơn giản như pull, add, commit, push. Họ không hiểu rõ ý nghĩa thực sự của các lệnh đó mà chỉ biết rằng làm như thế thì không gặp rắc rối gì.
Mọi chuyện cứ như thế êm đềm cho đến một ngày tư nhiên họ pull code về và bị conflict, lúc đó mọi chuyện trở nên ngoài tầm kiểm soát, họ bắt đầu hoang mang, hoảng loạn và không biết phải làm gì… bùm, mất cmn hết code. Họ mất một ngày để đau đớn dằn vặt bản thân mà không biết rằng mọi chuyện đã có thể tốt hơn nếu họ có cách tiếp cận và hiểu đúng về Git ngay từ đầu.
Phương pháp tiếp cận
Chúng ta nên có một sơ đồ và cơ chế hoạt động của Git ngay trong đầu mình. Việc đó sẽ giúp chúng ta tưởng tượng và kiểm soát được trạng thái của Git ngay trong não và làm các bước cần thiết một cách chính xác và ít sai sót. Ngay cả khi có điều gì đó xảy ra không mong muốn chúng ta vẫn hoàn toàn có thể đưa nó trở lại quỹ đạo vì mọi chuyện đang nằm trong tầm kiểm soát. Để có được sơ đồ đó chúng ta hãy cùng tìm hiểu các phần bên dưới nhé.
Git là một hệ thống quản lý version phân tán
Hệ thống quản lý version của Git được phân tán ra thành 4 vùng chứa dữ liệu chính (mình tạm gọi là “phân vùng”) như sau →- Môi trường phát triển (thông thường là nằm local trên máy tính của developers), gồm có:
- Working directory
- Staging area
- Local repository
- Máy server dùng để lưu
- Remote repository
Clone một repository
Khi chúng ta clone một repository nào đó từ server về local thì data từ Remote repository sẽ được download về 2 phân vùng là- Working directory
- Local repository
Tạo ra thay đổi trên working directory
Sau khi clone dữ liệu từ Remote repository (kho lưu trữ từ xa) về local thì chúng ta bắt đầu thực hiện các công việc như coding, tạo document, tạo tài liệu test, report,… Những thay đổi mà chúng ta tạo ra trên các files lúc này sẽ nằm trên Working directory, những files này được chia thành 2 loại sau
- Tracked: Là những files đã có trên Remote repository, chúng ta đã thực hiện một số sửa đổi trên các files này.
- Untracked: Là những files được thêm mới, chưa có trên Remote repository.
Đưa những thay đổi ở working directory lên remote repository
Khi các thay đổi ở Working directory đã được kiểm tra OK, chúng phải được add vào vùng Staging area. Khi đã có một tập hợp các thay đổi với một mục đích duy nhất trong khu vực Staging area, thì đó là thời điểm để tạo một commit đi kèm với một message (thông báo về mục đích của commit đó) trong Local repository.
Khi có một hoặc một vài commits trong kho Local repository sẵn sàng để được chia sẻ với các team khác, các đồng nghiệp khác, thì chúng cần phải được đẩy lên Remote repository.
—Như vậy một file ở trong môi trường phát triển (dev environment) thì có thể ở một trong số các trạng thái sau: modified, staged hoặc committed. Sau đây là một số command bạn có thể sử dụng để kiểm tra sự thay đổi
- show thay đổi đang nằm ở Working directory (chưa add vào Staging area): git diff
- show thay đổi đã được add vào Staging area : git diff –staged
- show thay đổi chứa trong một commit nằm trong Local repository : git diff <commit>^
Cập nhật development environdment
Fetching
Khi chạy lệnh “git fetch” thì data liên quan đến thông tin của các commit mới từ Remote repository sẽ chỉ được cập nhật về Local repository.Pulling
Khi chạy lệnh “git pull” thì data từ Remote repository sẽ được cập nhật về 2 vùng- Thông tin về các commit mới sẽ được cập nhật về Local repository: fetch
- Các thay đổi tương ứng với các commits mới sẽ được cập nhật về Working directory: merge
Nếu bạn lịch sử của các commits là một vấn đề mà bạn quan tâm thì bạn nên xem xét sử dụng “git pull –rebase”. Thay vì fetch + merge thì nó bao gồm fetch + rebase. Những commits local (đang nằm trên Local repository nhưng chưa đẩy lên Remote repository) sẽ được tạo và apply lại như thể các commits đó được bạn tạo ra sau khi đã update source mới nhất từ Remote repository về vậy.
Tổng kết
Trên đây là một số các kiến thức cơ bản về Git mà một người mới dùng Git nên biết và hiểu rõ về nó. Nắm chắc các kiến thức này sẽ giúp bạn tiếp cận và sử dụng Git một các mạnh mẽ, an toàn và hiệu quả hơn. Để thực sự pro về Git thì các bạn sẽ cần học thêm một số kỹ thuật khác như branching, stashing, conflict resolving,… Hy vọng các bạn sẽ làm chủ được Git để biến nó thành vũ khĩ mạnh mẽ cho công việc chứ không phải là nỗi ám ảnh làm cản trở công việc.
— Phạm Minh Tuấn (Shun) —