Câu Lệnh Và Quy Trình Làm Việc Hiệu Quả Với Git
Khi lập trình, sẽ có lúc bạn lỡ tay xoá một đoạn code vì nghĩ rằng đoạn code đó không phù hợp nữa, nhưng sau đó lại phát hiện là đoạn code đó bạn vẫn cần dùng. Bạn nghĩ mình có thể nhớ lại chính xác những gì mình đã viết không? Thật sự là rất rất khó. Nhưng nếu bạn có dùng phần mềm quản lý phiên bản mã nguồn thì mọi việc sẽ trở nên đơn giản hơn rất nhiều vì phần mềm quản lý phiên bản mã nguồn sẽ cho phép bạn dễ dàng quay lại một phiên bản trước của tập tin đó.
Việc lập trình cũng giống như các ngành nghề sản xuất khác, bạn tạo ra sản phẩm và đưa đến tay người dùng đồng thời cũng phải không ngừng cải tiến sản phẩm của mình sao cho phù hợp với nhu cầu thị trường, yêu cầu của khách hàng. Để mọi việc dễ dàng hơn chúng ta thực sự cần đến một công cụ để quản lý sản phẩm của mình. Như các sản phẩm hàng hoá khác ta có thể dùng các phần mềm quản lý kho, quản lý dây chuyền sản phẩm, v.v. Đối với phần mềm, chúng ta có các công cụ quản lý phiên bản source code có thể kể đến như Git, SVN, Subversion, Mecurial, ... Mỗi công cụ có những đặc điểm và ưu thế riêng, trong số các công cụ này git là công cụ quản lý source code phổ biến nhất.
Qua bài viết này, mình muốn giúp các bạn:
- Có cái nhìn tổng quát về công cụ quản lý source code nói chung và git nói riêng.
- Hiểu được cơ bản cách git hoạt động và nên áp dụng như thế nào cho project của mình.
- Làm quen với một số câu lênh cơ bản của Git
- Hiểu được git workflow và cách làm việc với branch trong Git trong các dự án thực tế.
Git - Công cụ quản lý source code
Thực ra đã có rất nhiều công cụ được sinh ra để đáp ứng cho việc quản lý source code như trên, do những tính năng ưu việt của git mà nó ngày càng phổ biến và được sử dụng rộng rãi, chiếm ưu thế so với các công cụ khác.
Bạn có thể theo dõi chi tiết trong bài viết Git là gì và sử dụng như thế nào
Dùng Git trong những trường hợp nào ?
Về việc tại sao lại dùng git thì có lẽ thực tế đã chứng mình và trả lời cho câu hỏi này rồi, git đáp ứng giải quyết cho các vấn đề nhức nhối về quản lý source code một thời và nó có hàng loạt các tính năng hữu ích giúp cho việc phát triển source code được nhanh và hiệu quả hơn rất nhiều.
- Git như là một cỗ máy thời gian giúp chúng ta có thể quay lại và xem code của mình ở một thời điểm trước, miễn là trước đó bạn có lưu lại trạng thái đó.
- Git theo dõi một cách hoàn hảo việc bạn thêm mới các file, thay đổi hay xoá đi file (cụ thể trong từng dòng code và từng ký tự :)))
- Đối với làm việc nhóm, phân chia module và phát triển các tính năng riêng biệt thì git đáp ứng một cách tuyệt vời tính năng chia tách, gộp các branch lại với nhau.
- Với git chúng ta có thể truy vết được từng dòng code là do thành viên nào trong team viết và viết vào thời gian nào giúp ích rất nhiều cho quá trình review code hoặc khi gặp bug, gặp lỗi ở những câu lệnh của module đó.
- Và còn rất nhiều các tính năng bá đạo khác!.
Vậy thì khi nào cần dùng git, việc đó tuỳ vào bạn.
Công cụ nào cũng vậy, chỉ nên sử dụng khi bạn biết nó đáp ứng được yêu cầu và có thực sự cần thiết không cho dự án của mình. Tuy nhiên, nếu là một lập trình viên thì khi nào mà bạn chẳng tạo ra code nên việc sử dụng git theo mình nghĩ đó là một điều tất yếu.
Có ý kiến cho rằng nếu chỉ làm việc một mình thì git cũng chẳng cần thiết lắm, git sinh là để các team quản lý source code. Mình thì nghĩ ngược lại, git sinh ra là để quản lý source code nói chung chứ không phải quản lý code của do bao nhiêu người viết ra. Nếu bạn làm việc một mình và một ngày nào đó lỡ nghịch dại làm cho code của mình chạy ra một số dòng error đỏ chót, có lẽ sẽ bạn sẽ ước gì mình trước đã bất chấp tất cả để dùng git, nhưng đến lúc đấy thì đã quá muộn, :)) . Vậy thì còn ngần ngại gì mà không học git ngay hôm nay, nó thực sự giúp ích rất nhiều cho năng suất công việc của bạn, Life is more easier with Git!.
Git local repository và Git remote repository
Có một khái niệm với Git mà bạn cần nắm được để có thể hiểu và làm việc với nó dễ dàng hơn khi mình giới thiệu các câu lệnh của Git. Đó là biết được repository là gì?
Repository là nơi lưu trữ code và chính xác là tất cả các phiên bản source code của bạn, nó lưu lại tất cả mọi thứ bao gồm những thay đổi của source code từ khi nó được khởi tạo ở project cho đến thời điểm hiện tại. Chính vì thế mà khi có repository bạn có thể xem lại tất cả phiên bản của source code đó ở mốc thời gian mà bạn muốn. Nếu repository được lưu trên máy tính của bạn, nó được gọi là local repository còn nếu nó được lưu trên các server chuyên cung cấp dịch vụ về git nó được gọi là remote repository. Hiện nay, có một số Git Server phổ biến và có rất nhiều tính năng hữu ích có thể kể đến như GitHub, GitLab, Bitbucket,...
Local repository và remote repository có thể được đồng bộ với nhau thông qua các câu lệnh của git mà chúng ta sẽ tìm hiểu dưới đây.
Làm thế nào để bắt đầu với Git?
Tất nhiên với một cái máy tính trắng tinh thì bạn chẳng thể làm gì với git, trước tiên chúng ta cần tải về phiên bản mới nhất của git tại trang chủ của nó. Mình khuyên bạn tránh việc cài đặt phần mềm từ các nguồn khác không đáng tin cậy vì có thể dẫn đến các vấn để bảo mật. Khi cài đặt một phần mềm nào đó, bạn luôn luôn nên truy cập vào trang chủ để tải về cài đặt nó, đồng thời điều này bạn cũng giúp mình được hỗ trợ tốt nhất trong các tình huống có lỗi.git --version

Một số câu lệnh cơ bản khi làm việc với git
1. Các câu lệnh để cấu hình git
Các thông tin bạn cấu hình cho git của mình sẽ được lưu global, nghĩa là những thông tin này sẽ được sử dụng cho những câu lệnh git khác sau này.
git config --global user.name "trongtai37"
git config --global user.email [email protected]
Hai câu lệnh này sẽ thiết đặt một số thông tin như username, email, ... của người sử dụng git. Mục đích chính là để nói cho git biết rằng bạn là ai, sau này thực hiện những câu lệnh khác git cứ thế mà dùng những thông tin này để truy vấn. Ngoài ra, còn nhiều thông tin nâng cao khác có thể cấu hình, bạn có thể tham khảo tại đây.
Để có thể khởi tạo git trong project của bạn, git sẽ bắt đầu theo dõi quá trình bạn thêm mới, sửa đổi hoặc xoá các file, ta chỉ cần vào thư mục gốc của project và chạy câu lệnh như sau:
git init
Hoặc nếu bạn chưa có project nào thì bạn có thể tìm một remote repository và clone project của người khác để vọc vạch hoặc sử dụng git trong việc phát triển tiếp mã nguồn đó.
git clone /path/to/repository
Ví dụ sau đây mình có tạo một repository sau đó clone project của mình để sử dụng tại local như sau:

Khi làm việc để phát triển các project thì việc tất yếu phải làm là bạn chỉnh sửa, thêm mới, xoá các file code của mình và nếu project của bạn đã được tích hợp git, thì những thay đổi trong quá trình trên đã được git theo dõi (kỹ càng đến từng ký tự :)) ). Để biết được bạn đã thay đổi những gì chỉ cần dùng câu lệnh sau:
git status

Trong kết quả trả về của câu lệnh trên git cho bạn biết được những file mình đã thêm(add), sửa (modified) và xoá (deleted).
Và khi bạn chắc chắn với những sự thay đổi của mình với source code, code chạy ngon lành và tạm thời không thấy được bug nào. Bạn muốn lưu lại trang thái của source code này để lỡ một ngày không xa code không chạy được thì mình có thể quay lại trang thái này để code có thể chạy bình thường như trước. Muốn làm được việc này thì chúng ta sử dụng câu lệnh:
git commit -m "Commit message"
Câu lệnh này ghi nhận rằng bạn muốn lưu trạng thái của code hiện tại, và để dễ dàng ghi nhớ hơn ta đính kèm theo một message, sau này tìm lại còn dễ và nhanh chóng hơn. Nhưng trước hết bạn cần cho git biết được rằng cụ thể trạng thái bạn muốn của các file là như thế nào. Có thể bạn thay đổi, xoá nhiều file và git có thể theo dõi việc đấy, khi muốn lưu lại trạng thái của source code thì bạn phải add những thay đổi đó vào một gói hàng, từ đó khi commit thì mọi thứ sẽ được lưu lại bằng một trạng thái của source code, bằng câu lệnh sau:
git add .
Nếu bạn chỉ muốn add một file bất kỳ để sử dụng cho lần commit tiếp theo bạn có thể add theo cú pháp như sau:
git add <path_to_file>
Khi đã lưu được trạng thái của source code, để áp dụng và lưu trang thái này lên remote repository, chúng ta dùng câu lệnh sau:
git push <remote_repository> <branch>
trong đó remote_repository là nơi bạn muốn đẩy code lên và đẩy vào branch nào của remote_repository đó. Khi câu lệnh hoàn thành nếu bạn có quyền push lên branch đó thì source code trên remote_repository sẽ được cập nhật trạng thái mới nhất.
Ví dụ:
git push origin master
Bạn có thể đặt tên cho remote_repository của mình để dễ nhớ hơn và thuận tiên cho việc sử dụng trong các câu lệnh khác bằng cách:
git remote add <name_of_remote_repo> <link_to_repo>
git remote add origin
https://github.com/trongtai37/javascript.git
Khi bạn tạo một repository thì branch master sẽ tự động được tạo và là branch mặc định bạn làm việc hiện tại. Đối với các project cá nhân thì làm việc trên branch này có thể đáp ứng đủ các yêu cầu. Tuy nhiên đối với các dự án công nghệ trong thực tế khi mà có nhiều tính năng và muốn phát triển nhiều tính năng cùng lúc thì rõ ràng một branch master là không đủ. Chúng ta có thể tạo nhiều branch khác và phát triển các tính năng riêng biệt trên từng branch đó cho đến khi hoàn thành cả hai thì có thể gộp chung và branch master.
3. Làm việc với branch trong Git
Với vấn đề đặt ra ở phần 2, git branch ra đời và việc làm việc trên các branch khác nhau của một repository là công việc thường xuyển của những người tham gia vào dự án.
Để tạo một branch mới trong Git, chúng ta sử dụng câu lệnh sau:
git branch <new_branch>
Tạo branch mới và chuyển sang luôn branch ấy để làm việc:
git checkout -b <new_branch>
Chuyển đổi qua lại giữa các branch để làm việc:
git checkout <other_branch>
Để liệt kê xem repository của bạn có những branch nào và hiện tại bạn đang làm việc tại nhánh nào thì hãy dùng câu lệnh sau:
git branch -a
qua câu lệnh này bạn cũng biết được rằng mình đang làm việc trên branch nào, để ý branch hiện tại đang làm việc được đánh dấu * trước nó. Với các Editor thần thánh hiện nay như VS Code, Sublime Text hay Atom, ... sẽ có tích hợp một số tool git có thể thể hiện branch đang làm việc hiện tại lên cho người dùng mà không cần dùng câu lệnh này.
Cơ bản khi làm việc với git branch thì bạn sẽ chuyển qua làm việc ở một branch cụ thể nào đó, còn chuyện bạn sửa thêm mới các file, chỉnh sửa hay xoá mất file thì nó chỉ ảnh hưởng đến một và chỉ một branch đó thôi. Chỉ khi hoàn thành công việc và bạn đi đến quyết định cần merge code của mình vào một branch nào đó (có thể cùng repository hoặc khác repository) thì mọi chuyện nó mới bắt đầu trở nên có vấn đề :))
Ta tạm gọi branch hiện tại đang làm việc là branch A và branch bạn muốn merge vào là branch B. Vậy thì trước khi thực hiện một tính năng mới thì bạn phải có code mới nhất từ branch B (điểm bắt đầu nó phải đầy đủ nhất) bằng câu lệnh pull sau đây:
git pull <server_repository> <branch B>
Ví dụ, bạn đang ở branch A và chạy câu lệnh sau:
git pull origin master
Câu lệnh trên sẽ lấy trạng thái code mới nhất từ branch master của orgin, giả sử bạn đang ở branch develop của local repository và thực hiện câu lệnh này, thì code của bạn sẽ được cập nhật mới nhất sao cho giống như code ở trên branch master của origin.
Để tiến hành merge từ branch A vào branch B, tức là bạn muốn code ở branch B được cập nhật giống hệt như code ở branch A, tính năng của bạn được áp dụng vào branch B, bạn có thể sử dụng câu lệnh push <repository> <branch>, nếu được cấp quyền thì code ở branch B sẽ được cập nhật mới nhất giống như branch A.
Tuy nhiên, điều này chỉ nên áp dụng với các project nhỏ và làm cá nhân. Để merge code từ branch này sang branch khác, theo đúng quy trình, người lập trình cần tạo merge request lên git server. Tức là cần tạo một thông báo (merge request) rằng mình muốn merge branch A vào branch B để có một người xem merge request này, sau khi xem xét kỹ lưỡng các thay đổi và đảm bảo code có thể chạy tốt sau khi được merged thì người có quyền sẽ cập nhật code ở branch B sao cho mới nhất như ở branch A thông qua merge request vừa được tạo.
Sau khi khi được merged code, bạn có thể tận hưởng tính năng mới hoàn thành của mình ngay trên branch B.
Các bạn có thể xem thêm về merge request tại đây. Do phạm vi của bài viết nên mình không có thời gian nói kỹ về phần này.
Quy trình làm việc với git hiệu quả
Để sử dụng git hiệu quả trong các dự án, sẽ có những quy tắc và quy trình làm việc giúp cho quá trình phát triển mã nguồn được đồng bộ, giảm thiểu xảy ra sai sót, xung đột. Các thành viên trong nhóm cần tuân thủ các quy tắc của git working flow như sau:
- Repository của dự án bắt buộc phải có hai nhánh là master và develop. Trong đó nhánh master là nhánh stable chứa code hoàn chỉnh được dùng cho production. Nhánh develop là nhánh có mã nguồn mới nhất về các tính năng được phát triển và đang được deploy lên server để testing.
- Người phát triển phần mềm cần fork repository gốc của dự án về thành một repository của mình, khi phát triển về một tính năng mới hay sửa lỗi, người lập trình cần tạo ra một branch mới từ repository của mình rồi mới thực hiện công việc trên branch đó. Khi hoàn thành công việc thì commit code của mình vào branch sau đó tạo merge request để merge code của mình vào repository gốc của dự án.
- Cần pull code từ repository gốc khi phát triển một tính năng mới để đảm bảo code trên máy mình là code mới nhất từ dự án, tránh xảy ra xung đột (conflict code) sau khi tạo merge request.
- Đối với người có quyền merge code từ các branch khác vào branch develop cần có review kĩ càng, khi xảy ra conflict phải gọi những người tham gia vào việc phát triển tính năng ấy để có thể giải quyết một cách tốt nhất, tránh trường hợp sau khi merge code không chạy được hoặc chạy sai hoàn toàn so với mục đích của người lập trình.
Đến đây cũng gần kết thúc bài viết nhưng mọi thứ chỉ mới là bắt đầu với bạn, sau đây là một số nguồn để bạn có thể tự mình khám phá thêm và vọc vạch với một số tool trên VS Code!
Nơi để học git tốt nhất mình nghĩ là nơi sản sinh ra nó, các bạn có thể vào trang chủ của Git để đọc document của nó với những giải thích chi tiết về từng câu lệnh của nó. Trang web này cũng cung cấp cho bạn nguồn tài liệu bằng sách dưới nhiều định dạng (có cả định dạng .MOBI cho các thế hệ máy đọc sách phổ biến hiện nay). Tuy nhiên ở trang này chỉ có ngôn ngữ tiếng anh và từ ngữ khá hàn lâm nên hơi khó khăn với người mới bắt đầu. Nhưng nếu chịu khó mày mò ở đây mình tin bạn sẽ tự gặt hái cho mình được rất nhiều thứ. Ngoài ra, GitHub cũng cung cấp những tutorial về git, bạn có thể tham khảo tại đây.
- Một số trang web khác khá thú vị để học các git commands
- Một số Extension hay ho để các bạn vọc vạch trên VS Code đồng thời tăng hiệu quả làm việc của mình.
Tổng kết bài viết
Rất mong nhận được các ý kiến phản hồi mang tính chất đóng góp từ phía bạn đọc để bài viết được hoàn thiện hơn!
Nếu được sự ủng hộ của bạn đọc minh dự kiến sẽ viết tiếp phần 2 về những câu lệnh phức tạp hơn và có một demo về quy trình khởi tạo project và cấu hình git để có thể làm việc trong một dự án thực tế! Hẹn sớm gặp lại trong những bài viết tới!