Git là gì? Những lợi ích của việc dùng Git?

git-la-gi-logo

Git là gì mà nổi danh trong giới lập trình, từ fresher măng tơ cho đến developer cứng cựa đều nên biết tới?

Đọc ngay bài phỏng vấn này để tìm hiểu:

  • Git là gì? Lợi ích của việc dùng Git?
  • Những tính năng hay nhất của Git có thể bạn chưa biết.
  • Cách sử dụng Git hiệu quả và các resource tham khảo.

Xem ngay việc làm Developer chất trên ITviec

Bài viết được thực hiện với sự đóng góp của:

  • Anh Jonathan Khor, với 13 năm kinh nghiệm lập trình. Jonathan từng trải qua nhiều vị trí bao gồm cả Software Engineer và Analyst Programmer. Hiện anh là Development Team Leader tại MedHealth.
  • Anh Vũ Thành Nhân, hiện đang làm tại bộ phận R&D của Vietnix.
  • Anh Vương Đức Hiền, Developer tại ITviec.
git-la-gi

Từ trái qua: Jonathan Khor, Vương Đức Hiền, Vũ Thành Nhân

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). Nhờ Git, việc quản lý code và làm việc nhóm của developer trở nên đơn giản, thuận tiện hơn.

Để tìm hiểu thêm về Git là gì thì bạn có thể vào trang chủ của Git tại đây.

Việc làm Developer TPHCM

Việc làm Developer Hà Nội

Sự giống/khác nhau giữa các hệ thống quản lý phiên bản khác và Git là gì?

1. Giống:

Git là một hệ thống quản lý phiên bản (viết tắt: VCS), Git cũng hỗ trợ:

  • Quản lý code và lịch sử thay đổi.

Ví dụ, bạn chỉnh sửa code và “trót dại” làm ra một đống bug? Bạn muốn quay trở lại trạng thái trước khi “nghịch ngợm”?

Nếu không dùng VCS, bạn sẽ phải sao chép lại file trước khi chỉnh sửa, đồng thời phải thường xuyên cập nhật tên thư mục và tên file.

  • Làm việc nhóm.

Ví dụ, các thành viên trong nhóm muốn trao đổi code với nhau. Nếu không dùng VCS, họ sẽ phải: 1) chép từng module, đoạn code vào usb rồi đưa cho nhau. 2) hoặc gửi các đoạn code nhỏ qua ứng dụng chat, mail…

Những cách trên đều rất thủ công, tốn resources và tiềm ẩn nhiều rủi ro. Các VCS (bao gồm Git) ra đời để khắc phục điều này.

2. Khác:

Git tiếp cận theo hướng phân tán (distributed approach) trong khi các VCS khác tiếp cận theo hướng tập trung (centralized).

Điểm khác biệt lớn nhất của Git là gì? Đó là khả năng tách nhánh (branch). Nhờ vậy, Git hỗ trợ rất tốt cho teamwork, vì những việc như phân chia task, tổng hợp code trở nên dễ dàng hơn nhiều. (Bạn có thể dùng từ khóa “git flow” để tìm hiểu thêm).

Ví dụ, cùng một lúc, chúng ta thường có một team làm tính năng mới, một vài team khác nâng cấp các tính năng hiện có, và một người fix bug.

Nếu không dùng Git, khả năng cao là mọi người sẽ làm việc giẫm chân nhau, những task sắp hoàn thành sẽ bị trì hoãn. Ngoài ra, tất cả mọi task lớn nhỏ sẽ buộc phải hoàn thành hết trước khi deploy, bởi vì chỉ cần 1 task vẫn đang dang dở, cả phần mềm có thể bị sập.

git-la-gi

3 lợi ích lớn nhất của việc dùng Git là gì?

1. Sắp xếp công việc tốt hơn. Nghĩa là, bạn có thể tập trung giải quyết từng task mà không phải bận tâm lo lắng cho những task liên quan.

2. Linh hoạt hơn khi phải làm cùng lúc nhiều task, bởi vì bạn có thể cấu trúc công việc dễ dàng hơn.

3. Tự tin hơn khi thử nghiệm những ý tưởng mới, vì bạn có thể tách biệt việc thử nghiệm với dự án chính. Điều này giúp nâng cao chất lượng code cũng như tính sáng tạo.

Nhìn chung, hiện nay Git được coi là tiêu chuẩn bất thành văn trong ngành. Nếu chưa biết về Git, bạn nên dành thời gian để bắt đầu tìm hiểu ngay. Vì, sớm hay muộn, bạn cũng sẽ thuộc về một team phải dựa dẫm vào nó.

Git đã “vượt mặt” các VCS khác trong lĩnh vực quản lý phiên bản?

Đức Hiền: Dĩ nhiên rồi. Ngay cả Microsoft cũng đã bắt đầu dùng Git để host Windows source code. Đặc biệt, Git được “sinh sau đẻ muộn” hơn nhiều, cho nên tốc độ phát triển nhanh chóng của nó lại càng đáng kinh ngạc.

Tôi nghĩ, nguyên do phần lớn là vì Git miễn phí, và vì tiếp cận theo hướng phân tán. Nghĩa là, mọi người đều có thể bắt đầu sử dụng những chức năng cơ bản của Git mà không cần bất kì cơ sở hạ tầng server nào.

Thành Nhân: Cá nhân tôi nghĩ rằng, ở thời điểm hiện tại thì Git ưu việt hơn hẳn so với các hệ thống quản lý phiên bản tập trung như SVN.

Ví dụ, Git cho phép chúng ta làm việc offline trong một khoảng thời gian. Bạn chỉ cần internet cho nhu cầu hợp tác nhóm, hoặc lưu lịch sử commit code lên remote repos. Ngược lại, với SVN, mỗi khi sử dụng đều cần có kết nối đến máy chủ SVN.

Một ví dụ khác. Khi tách nhánh, Git chỉ sử dụng 41 bytes cho một nhánh mới, giúp tiết kiệm không gian lưu trữ mà vẫn đảm bảo tốt nhu cầu công việc. Còn SVN, theo tôi biết, sẽ copy toàn bộ source code thành một bản mới khi tách nhánh. (Không biết SVN hiện giờ đã cải thiện điểm này chưa?)

Jonathan:

Tôi không biết nhiều về các VCS khác, nhưng nếu so sánh với SVN và TFS, thì rõ ràng là Git hơn hẳn.

Sự khác biệt cốt lõi trong cách quản lý storage và các nhánh của Git khiến cho việc merging cũng hoàn toàn khác.

Bên cạnh đó, cũng nhờ cách Git lưu trữ thông tin mà bạn có thể thực hiện vô vàn những điều thú vị để viết lại lịch sử commit.

remote-workflow-cua-git

Git hỗ trợ rất tốt cho làm việc nhóm

Việc làm Senior Developer TPHCM

Việc làm Senior Developer Hà Nội

So với VCS khác, việc tiếp cận theo hướng phân tán của Git có trở ngại gì?

Thành Nhân: Trong điều kiện không thể kết nối thường xuyên đến remote repos, thì việc một thành viên push code mới có thể gây phức tạp cho người merge code và review.

Tuy nhiên, đây chỉ là lý thuyết. Với trải nghiệm của tôi thì tình huống này rất hiếm gặp.

Đức Hiền: Còn tôi cảm thấy một vài IDEs, ví dụ như Eclipse, được thiết kế để hoạt động với hệ thống CVS cũ kĩ, nhưng lại gắn cách dùng của Git lên. Vì vậy, việc tích hợp không được thực sự thuận tiện như những tính năng khác của Git.

(CVS – Concurrrent Versions System, hệ thống quản lý các phiên bản phần mềm mã nguồn mở từ những năm 1980).

Nhưng tôi tin rằng sẽ sớm có cách để khắc phục vấn đề này.

Jonathan: Cá nhân tôi không thấy việc tiếp cận theo hướng phân tán của Git có trở ngại gì. Tuy nhiên, nếu cần nêu nhược điểm của Git, thì theo tôi đó là user interface (UI).

Là một người dùng lâu năm, tôi thấy UI của Git không đủ tốt và không cung cấp đủ những tính năng nâng cao mà tôi cần.

  • Chẳng hạn, giao diện để rebase một nhánh rất sơ sài.

Có vẻ như chúng chỉ hợp với nhu cầu sử dụng cơ bản. Bên cạnh đó, khi xảy ra lỗi thì không phải lúc nào chúng cũng được xử lý tốt.

  • Thêm nữa, Git cũng nên cải thiện việc hiển thị những thay đổi trên files hay change sets.

Hầu hết UI hiển thị chúng theo hàng ngang, với phiên bản cũ ở trên và phiên bản mới ở dưới. Lẽ ra họ nên đổi thành hiển thị theo hàng dọc thì sẽ dễ theo dõi hơn. Chưa hết, một số UI cho phép sử dụng chương trình bên ngoài như Beyond Compare để xem sự thay đổi, nhưng một số UI khác thì không.

  • Thậm chí, những thứ đơn giản như mở file đang xem trong IDE cũng chưa thực sự tốt.

Không phải UI nào cũng cho phép tôi làm điều này chỉ với phím tắt hay double click. Trong khi, tôi phải review code hàng ngày, và tính năng này cực kì quan trọng vì sẽ giúp tôi chuyển đến ngay file đang xem.

Tóm lại, nếu cần cải thiện điều gì thì tôi nghĩ Git nên tập trung vào phần UI.

Tính năng hay nhất song lại ít được dùng/biết đến nhất của Git là gì?

Đức Hiền: Có lẽ là Git Hooks. Có những đoạn script ở phía client hoặc server có thể được kích hoạt tự động khi bạn chạy một lệnh git.

Ví dụ, bạn có thể cho server chạy tự động mọi unit tests trước khi chấp nhận merge vào nhánh master.

Dĩ nhiên, nó sẽ không viết dùm unit tests “ngon lành cành đào” cho bạn, nhưng tôi nghĩ nó sẽ tạo động lực tốt hơn. Bởi vì test kĩ sẽ giúp đảm bảo rằng các tính năng bạn đang xây dựng không bị phá hỏng bởi những commit khác.

githooks-la-gi

Githooks là một tính năng thú vị của Git.

3 sai lầm phổ biến nhất khi dùng Git là gì?

Jonathan:

  • Không tìm hiểu các nguyên tắc cốt lõi của Git.

Giải pháp: hãy tìm hiểu Git là gì và giá trị của nó trước! Cuốn Pro Git đọc có thể hơi oải, nhưng tôi đã học được rất nhiều từ nó. Bạn có cần đọc cuốn sách này để biết cách dùng Git? Không. Nhưng nếu muốn sử dụng Git hiệu quả, bạn nên đọc kĩ.

  • Nghĩ và dùng Git theo cách dùng các VCS trước đây.

Ví dụ như các nhánh. Với Git, nhánh chỉ là các con trỏ đến các commit, còn với SVN thì chúng là bản copy của toàn bộ thư mục. Giải pháp: hãy tìm hiểu Git kĩ hơn!

  • Chưa hiểu về Git đã vội dùng.

Không có gì tệ hơn cảnh đang vắt giò lên cổ chạy deadline, mà vẫn còn phải quằn quại học cách dùng Git. Tốt hơn hết, bạn nên dành thời gian để tìm hiểu Git trước, rồi thử dùng với một vài dự án thử nghiệm, để tránh làm ảnh hưởng đến công việc chính.

Nếu là newbie, thì 3 điều cơ bản bạn cần tìm hiểu/ghi nhớ trước tiên: 1) Git là một đồ thị có hướng và không có vòng lặp. 2) Commit có tính bất biến. 3) Các nhánh chỉ là con trỏ. Mọi điều còn lại đều bắt nguồn từ đây.

Thành Nhân:

  • Không phân biệt được local repo, remote repo, vẫn áp dụng tư tưởng của SVN khi dùng Git.
  • Commit vô tội vạ khi chưa biết các biện pháp dọn lại commit tree, gây rối commit log.

Cách phòng ngừa tốt nhất là xem kỹ tài liệu về phần này, đồng thời test thử trên các dự án demo. Riêng phần commit log, trong team nên có thống nhất trước, hoặc nên nhờ người có kinh nghiệm hướng dẫn.

Đức Hiền:

  • Làm mọi thứ trên nhánh master.

Dù chỉ làm việc một mình, bạn vẫn nên “branch early, branch often” để 1) tránh hình thành thói quen xấu 2) tận dụng được tính năng xịn nhất của một VCS.

  • Check in những files không thực sự liên quan vào một VCS.

Việc này đặc biệt hay xảy ra với các dự án Python, khi mọi người check in các .pyc files của họ. Bạn có thể thiết lập .gitignore để lờ chúng đi. Và cũng nên dùng githooks để dọn dẹp chúng lúc đổi nhánh.

  • Check in những thứ hoàn toàn không nên.

Ví dụ, mọi người rất hay hardcode mấy thứ như mysql passwords. Về khía cạnh bảo mật, lỗi này đúng là kinh dị. Mặt khác, nó cũng có nghĩa là bạn không thể chạy các chương trình tích hợp liên tục (Continuous Intergration – CI) vì tài khoản trong môi trường production (mong là) khác với môi trường test.

Nói chung, nên cẩn thận với những thứ như vậy.

Sai lầm bạn từng phạm phải khi dùng Git là gì?

Jonathan: Khi reset một nhánh, tôi quên commit các thay đổi. Vậy là đổ xuống sông xuống biển mọi thứ đã làm. Cũng nhiều lắm đó :'(

Từ đó trở đi, trước khi reset một nhánh, tôi luôn viết thêm một lệnh để commit các thay đổi trước, rồi mới reset. Bằng cách này, nếu muốn xem lại những thay đổi trước đó, tôi có thể dùng reflog.

Thành Nhân: Khi sử dụng git add -A, tôi đã vô tình add cả database credentials vào commit, và đã push commit đó lên remote repos.

Tôi lập tức phải đổi ngay database credentials mới, cho file credential đó vào gitignore và viết 1 tweet để tự nhắc nhở.

Đức Hiền: Quên không check in code mới. Hậu quả là mấy ngày làm việc thành công cốc, chỉ vì không để ý đến cảnh báo của Git.

Và trong trường hợp này, điều duy nhất có thể làm là rút kinh nghiệm để không lặp lại sai lầm tương tự mà thôi :'(

Bài học đúc rút cho bản thân?

Jonathan: Tìm hiểu kĩ các khái niệm và tính năng nền tảng của Git.

Bằng không, chúng ta sẽ vừa dùng Git vừa phải đoán mò, và không thể biết chắc chuyện gì sẽ xảy ra.

Nhiều khi tôi thấy dev không dám thử/dùng một tính năng gì đó của Git, chỉ vì họ không biết chắc thao tác đó sẽ dẫn đến chuyện gì. 🙁 Trời ơi, dễ ợt, sao không google? Trên mạng thiếu gì tài liệu.

Với cả, nếu muốn chắc ăn thì bạn cứ làm thử thao tác đó trên repo test. Để nếu có trót “chơi dại” thì cũng không gây hậu quả gì nghiêm trọng.

Đức Hiền: Phân nhánh thường xuyên.

Hãy chắc chắn là bạn có một nhánh staging với các tính năng đã được unit test đầy đủ trước khi nhập vào nhánh master.

Resource hướng dẫn sử dụng Git hiệu quả?

  • Pro Git bao quát mọi vấn đề về Git, gồm cả  lý thuyết và ví dụ. Điều tuyệt vời nhất là sách được dịch ra nhiều ngôn ngữ, trong đó có cả tiếng Việt.
  • Atlassian’s Git resources có một số resource rất hữu ích, kèm theo hình minh họa bắt mắt, giúp người dùng nắm bắt các khái niệm dễ dàng hơn.
  • GitHub’s Git tutorial hướng dẫn thực hành từng bước, giúp tìm hiểu Git một cách trực quan.
  • Git cheat sheet tóm lược những nội dung quan trọng nhất. Bạn có thể in ra để dùng.

Xem thêm một số bài viết liên quan:

Bạn bắt đầu tìm hiểu Git là gì và có vô vàn thắc mắc? Bạn là một chuyên gia về Git sẵn sàng chia sẻ kinh nghiệm với cộng đồng? Hoặc, bạn dùng các CVS khác và tin rằng chúng hay hơn Git?

Hãy cùng thảo luận ở phần bình luận phía dưới nhé!

Và tham khảo ngay việc làm Developer chất trên ITviec!

About the Author:

Storyteller

After nearly 10 years working in the online industry, Anh eventually found her strong passion for content marketing and storytelling. Read more...

Comments