Hướng dẫn Git Commit: Cách theo dõi và ghi lại thay đổi mã nguồn
Nắm vững những điều cốt lõi của lệnh git commit và nâng cao kỹ năng quản lý phiên bản của bạn. Học các kiến thức cơ bản về staging và commit thay đổi, viết thông điệp hiệu quả và dùng các tùy chọn nâng cao.
Git đã trở thành hệ thống tiêu chuẩn để quản lý thay đổi trong codebase. Một trong những lệnh quan trọng nhất trong Git là git commit, lệnh này ghi lại một ảnh chụp (snapshot) lịch sử dự án của bạn tại một thời điểm cụ thể.
Hiểu cách sử dụng git commit một cách hiệu quả là điều then chốt để duy trì lịch sử dự án sạch và có tổ chức. Viết thông điệp commit có ý nghĩa và tuân theo các thực hành tốt giúp kho lưu trữ của bạn dễ quản lý, dù bạn làm việc một mình hay trong một nhóm lớn.
Hướng dẫn này nhằm giúp bạn biết cách dùng lệnh git commit, viết thông điệp commit rõ ràng và nhiều thông tin, cũng như áp dụng các thực hành tốt để quản lý phiên bản hiệu quả.
Bắt đầu thôi!
Git Commit là gì?
Một trong những khối xây dựng cơ bản nhất của quản lý phiên bản trongGit là lệnh git commit. Một git commit ghi lại ảnh chụp trạng thái hiện tại của các tệp đã stage và lưu chúng vào lịch sử của kho lưu trữ. Nó tạo một mã định danh duy nhất cho các thay đổi và ghi lại siêu dữ liệu quan trọng như tác giả, dấu thời gian và thông điệp commit mô tả — điều này đảm bảo các sửa đổi có thể được theo dõi, hiểu và hoàn nguyên khi cần.
Nhà phát triển cũng có thể thêm thông điệp commit, mô tả ngắn gọn các thay đổi đã thực hiện và cung cấp ngữ cảnh cùng lý do đằng sau cập nhật.
Về cơ bản, commit quan trọng vì cho phép nhà phát triển:
Theo dõi thay đổi: Commit cung cấp bản ghi rõ ràng về các chỉnh sửa đối với codebase theo thời gian.
Hợp tác: Trong môi trường làm việc nhóm, commit giúp các thành viên hiểu thay đổi nào được thực hiện, bởi ai và vì sao.
Quay về trạng thái trước: Nếu phát sinh lỗi hoặc sự cố, commit cho phép đưa dự án trở lại điểm ổn định trước khi thay đổi gây vấn đề được đưa vào.
Duy trì lịch sử sạch: Commit có cấu trúc, thường xuyên và có thông điệp ý nghĩa giúp quản lý dự án lớn và chẩn đoán vấn đề dễ dàng hơn.
> Nếu bạn mới bắt đầu với Git và GitHub, lộ trình GitHub Foundations cung cấp một lộ trình chọn lọc giúp bạn nắm vững những điều cốt lõi của quản lý phiên bản và quy trình cộng tác.
Cú pháp cơ bản của Git Commit
Để dùng Git hiệu quả, bạn cần hiểu cú pháp và cấu trúc cơ bản của commit. Phần này trình bày các thành phần cốt lõi của quy trình commit để đảm bảo thay đổi được ghi nhận và tài liệu hóa đúng cách.
Lệnh cơ bản
Cách đơn giản nhất để tạo một commit là dùng lệnh sau:
Ở đây, cờ -m cho phép bạn thêm một thông điệp commit ngắn mô tả các thay đổi. Đây là nơi bạn cung cấp ngữ cảnh để tham chiếu sau này và phục vụ cộng tác, ví dụ:
git commit -m “Fix bug in user authentication” Được hỗ trợ bởi
Lệnh này thực hiện commit và gắn kèm thông điệp đã cung cấp.
Điều gì diễn ra trong một commit
Đây là những gì diễn ra bên trong khi bạn tạo commit:
Staging thay đổi: Trước khi commit, bạn phải stage các thay đổi bằng lệnh git add. Điều này chuẩn bị các tệp đã chỉnh sửa để đưa vào commit kế tiếp. Bạn có thể stage từng tệp riêng lẻ hoặc tất cả các tệp đã chỉnh sửa.
gitadd file.txt #Stages one filegitadd.#Stages all files in the current directoryĐược hỗ trợ bởi
Thực hiện commit: Khi thay đổi đã được stage, lệnh git commit sẽ chụp ảnh trạng thái của các tệp đã stage và lưu chúng vào kho lưu trữ. Lưu ý snapshot là trạng thái hiện tại của các tệp tại thời điểm đó.
Cập nhật kho lưu trữ: Sau khi commit, Git cập nhật lịch sử dự án để lưu commit bên cạnh tất cả các commit trước đó. Mỗi commit đóng vai trò như một điểm kiểm tra có thể quay lại khi cần.
Viết thông điệp Git Commit hiệu quả
Viết thông điệp commit rõ ràng và có ý nghĩa là điều cần thiết để duy trì lịch sử dự án sạch và dễ hiểu. Một thông điệp commit được viết tốt cũng là công cụ giao tiếp, giúp nhà phát triển và cộng tác viên nhanh chóng nắm bắt mục đích và ngữ cảnh của từng thay đổi.
Tầm quan trọng của thông điệp commit tốt
Thông điệp commit tốt giống như một tấm bản đồ. Chúng cung cấp cái nhìn sâu về lý do đằng sau mỗi thay đổi, điều trở nên vô giá khi xem lại mã sau này hoặc khắc phục sự cố. Thông điệp commit được viết tốt cũng giúp truy vết lỗi, hiểu sự tiến hóa của tính năng và điều hướng qua lịch sử của kho lưu trữ dễ dàng hơn.
Thực hành tốt cho thông điệp commit
Để đảm bảo thông điệp commit hoàn thành mục đích của nó, hãy tuân theo các thực hành sau:
Mô tả đầy đủ: Thông điệp commit cần giải thích đã thay đổi gì và khi phù hợp, vì sao thay đổi được thực hiện. Tránh các thông điệp mơ hồ hoặc chung chung như "fix" hay "update". Hãy hướng đến tính cụ thể. Ví dụ, “Fix login form validation error” hữu ích hơn nhiều so với chỉ “Bug fix.”
Dùng thì hiện tại: Thông điệp commit nên được viết ở thì hiện tại. Điều này tạo cảm giác bạn đang mô tả những gì commit thực hiện tại thời điểm đó. Ví dụ, dùng "Add login validation" thay vì "Added login validation."
Ngắn gọn, dễ hiểu: Thông điệp ngắn gọn dễ đọc hơn. Phần tóm tắt (dòng đầu tiên của thông điệp commit) thường nên dài 50–72 ký tự; nếu cần giải thích thêm, bạn có thể viết mô tả dài hơn ở các dòng tiếp theo. Cách tiếp cận này đảm bảo thông điệp có thể được xem dễ dàng bằng nhiều công cụ và giao diện Git.
Dùng gạch đầu dòng cho thay đổi chi tiết: Nếu commit của bạn bao gồm nhiều thay đổi liên quan, hãy dùng gạch đầu dòng trong phần mô tả mở rộng để liệt kê từng việc đã làm. Điều này giúp cấu trúc rõ ràng và dễ theo dõi.
> Nếu bạn muốn vượt ra ngoài những điều cơ bản về commit, khóa học Intermediate Git sẽ hướng dẫn các khái niệm nâng cao như amend, rebase và quản lý lịch sử commit trong nhóm.
Các tùy chọn Git Commit nâng cao
Cờ -m là một tùy chọn phổ biến trong lệnh git commit và đủ cho nhu cầu hằng ngày. Tuy nhiên, còn có một số tùy chọn nâng cao khác mang lại sự linh hoạt và hiệu quả cao hơn khi quản lý thay đổi. Trong phần này, chúng ta sẽ xem xét các tùy chọn đó.
Commit không cần staging
Trong nhiều trường hợp, tự tay stage tệp bằng git add trước khi commit có thể thấy không cần thiết, đặc biệt khi bạn muốn commit tất cả tệp đã chỉnh sửa. Để tăng tốc, Git cung cấp cờ -a, cờ này stage tất cả tệp đã được theo dõi và commit chúng trong một bước. Nghĩa là mọi thay đổi với các tệp đã theo dõi trước đó sẽ được đưa vào commit mà không cần chạy git add riêng.
Sai sót là chuyện bình thường. Đôi khi bạn cần thay đổi commit vừa tạo. Tùy chọn --amend cho phép bạn chỉnh sửa commit gần nhất thay vì tạo commit mới. Bạn có thể cập nhật thông điệp commit hoặc thêm tệp vào cùng commit đó.
Cách này sẽ thay thế commit trước đó bằng commit đã cập nhật.
Lưu ý chỉ nên amend các commit chưa được chia sẻ với người khác (ví dụ: chưa push lên kho dùng chung) để tránh ghi đè lịch sử mà người khác có thể đang phụ thuộc!
Commit với các thay đổi và tệp từ một commit cụ thể
Đôi khi bạn cần sửa hoặc khắc phục vấn đề trong một commit trước đó mà không đưa vào các thay đổi không liên quan. Git cung cấp tùy chọn --fixup, giúp tạo một commit bổ sung liên kết cụ thể tới commit trước đó. Điều này đặc biệt hữu ích khi bạn cần dọn dẹp lịch sử commit trước khi hợp nhất thay đổi.
Lệnh này sẽ tạo một commit mới nhằm xử lý các vấn đề trong commit được chỉ định.
Sau đó, khi bạn thực hiện interactive rebase, Git có thể tự động squash các commit fixup này vào commit gốc mà chúng tham chiếu.
> Với các quy trình nâng cao như squash commit, bạn có thể làm theo hướng dẫn chi tiết trong hướng dẫn Git Squash Commits.
Quản lý Commit với Git
Khi dự án phát triển và lịch sử commit ngày càng nhiều, quản lý commit trở thành yếu tố then chốt để duy trì kho lưu trữ có tổ chức và dễ điều hướng. Quản lý commit hiệu quả giúp việc gỡ lỗi, cộng tác và giữ lịch sử rõ ràng, dễ hiểu.
Git cung cấp các công cụ mạnh mẽ cho phép bạn xem lịch sử commit và chỉnh sửa hoặc thậm chí hoàn tác thay đổi khi cần. Biết cách quản lý các commit này có thể tiết kiệm đáng kể thời gian khi giải quyết vấn đề hoặc tinh chỉnh lịch sử dự án.
Xem lịch sử commit
Một khía cạnh quan trọng của quản lý commit là hiểu lịch sử của dự án. Lệnh git log cho phép bạn xem chi tiết lịch sử commit. Về ngữ cảnh, nó cung cấp thông tin về thời điểm thay đổi được thực hiện, ai thực hiện và thông điệp kèm theo.
Đôi khi bạn cần quay lại hoặc hoàn tác thay đổi. Một cách an toàn để hoàn tác commit là sửdụng git revert lệnh. Lệnh này tạo một commit mới để đảo ngược các thay đổi được đưa vào bởi commit trước đó mà không làm thay đổi lịch sử commit.
Điều này đặc biệt hữu ích khi bạn đã chia sẻ commit với người khác và muốn giữ nguyên lịch sử.
Lệnh này áp dụng phần thay đổi ngược lại của commit được chỉ định, hiệu quả là hoàn tác chúng đồng thời vẫn giữ lịch sử minh bạch.
Reset một commit
Trong một số trường hợp, bạn có thể muốn đặt lại hoàn toàn kho lưu trữ về trạng thái trước đó, xóa một hoặc nhiều commit. Lệnh git reset cho phép bạn thực hiện điều đó. Tuy nhiên, reset commit sẽ chỉnh sửa lịch sử commit, vì vậy cần thận trọng, đặc biệt nếu thay đổi đã được push lên kho dùng chung.
Git reset có ba chế độ:
Soft reset: Di chuyển con trỏ commit về một commit được chỉ định nhưng giữ nguyên thay đổi trong thư mục làm việc và khu vực staging. Hữu ích khi bạn muốn làm lại commit nhưng vẫn giữ thay đổi.
Mixed reset: Di chuyển con trỏ commit về một commit được chỉ định và giữ thay đổi trong thư mục làm việc, nhưng xóa khu vực staging. Đây là chế độ reset mặc định của Git.
Hard reset: Di chuyển con trỏ commit về một commit được chỉ định và loại bỏ tất cả thay đổi trong cả thư mục làm việc lẫn khu vực staging. Về cơ bản, điều này đưa kho của bạn về trạng thái của commit đã chọn và xóa mọi thay đổi sau đó.
Lệnh git reset rất mạnh, nhưng điều quan trọng là hiểu hệ quả của nó (đặc biệt khi làm việc trong môi trường cộng tác).
Thực hành tốt khi commit trong Git
Quản lý phiên bản hiệu quả không chỉ là biết các lệnh Git — mà còn là tuân thủ các thực hành tốt để duy trì lịch sử dự án sạch, dễ hiểu và hiệu quả. Những thực hành này không chỉ giúp bạn quản lý công việc của mình mà còn khiến việc đóng góp và xem xét thay đổi của cộng tác viên thuận tiện hơn.
Commit thường xuyên, nhưng giữ thay đổi nhỏ gọn
Một quy tắc hay là commit sớm và thường xuyên, nhưng giữ mỗi commit nhỏ và tập trung. Cách tiếp cận này đảm bảo mỗi commit đại diện cho một đơn vị công việc riêng biệt và hợp lý.
Commit thường xuyên giúp chia nhỏ thay đổi lớn thành các phần có thể quản lý, nhờ đó dễ xem xét, kiểm thử và lần theo sự phát triển của dự án. Bằng cách commit các thay đổi nhỏ, độc lập, bạn cũng giảm rủi ro đưa vào lỗi phức tạp. Nếu có sự cố, việc cô lập và sửa lỗi sẽ dễ hơn khi commit có độ hạt mịn.
Chỉ commit các thay đổi liên quan
Mỗi commit nên tập trung vào một tác vụ hoặc vấn đề duy nhất. Trộn lẫn các thay đổi không liên quan trong một commit khiến việc xem xét và hiểu mục đích trở nên khó khăn. Nó cũng làm phức tạp quá trình hoàn tác hoặc cherry-pick các thay đổi cụ thể khi cần.
Ví dụ, nếu bạn đang làm một tính năng nhưng phát hiện một lỗi nhỏ ở nơi khác trong mã, tốt hơn nên xử lý chúng thành hai commit riêng. Điều này cho phép hiểu rõ đã làm gì và vì sao — đồng thời đảm bảo mỗi commit có ý nghĩa và độc lập.
Cộng tác với người khác về lịch sử commit
Khi làm việc nhóm, việc thống nhất với cộng tác viên về cách xử lý và trình bày commit là điều cần thiết. Điều này bao gồm thống nhất định dạng thông điệp commit nhất quán và đảm bảo mọi người tuân theo các thực hành tốt. Git hook, như pre-commit hook, có thể giúp áp dụng các quy tắc như định dạng thông điệp commit hoặc chạy kiểm thử trước khi cho phép commit.
Cộng tác cũng được tăng cường nhờ các công cụ giúp quản lý và xem xét commit, như các nền tảng đánh giá mã như GitHub hoặc GitLab. Lịch sử commit rõ ràng, được tài liệu hóa tốt giúp các thành viên hiểu thay đổi, thảo luận cải tiến và thúc đẩy dự án tiến lên hiệu quả.
Đôi khi việc commit trong Git có thể dẫn đến lỗi hoặc thách thức làm chậm quy trình của bạn. Hiểu cách khắc phục những sự cố thường gặp này là rất quan trọng để duy trì quản lý phiên bản trơn tru và tránh các vấn đề lớn về sau.
Lỗi về thông điệp commit
Một lỗi phổ biến khi commit là quên thêm thông điệp commit hoặc vô tình dùng thông điệp mơ hồ hoặc trống. Thông điệp commit rõ ràng và nhiều thông tin là điều thiết yếu để theo dõi thay đổi và giúp cộng tác viên hiểu lịch sử dự án. Git thường sẽ ngăn bạn commit nếu không có thông điệp, nhưng bạn vẫn có thể bỏ qua chất lượng của thông điệp.
Giải pháp: Luôn kiểm tra kỹ thông điệp commit trước khi nhấn Enter. Nếu bạn vô tình gửi commit với thông điệp trống hoặc không rõ ràng, bạn có thể sửa bằng lệnh git commit --amend để chỉnh thông điệp commit gần nhất.
Xung đột sau khi commit
Xung đột là điều khó tránh khi nhiều người cùng làm việc trên một dự án. Chúng thường phát sinh sau một commit khi bạn gộp nhánh (merge) hoặc rebase. Xung đột xảy ra khi Git không thể tự động hòa giải khác biệt giữa hai commit, buộc bạn phải chọn thủ công các thay đổi cần giữ.
Xung đột thường xảy ra khi hai hoặc nhiều người cùng sửa cùng một phần mã, hoặc khi thực hiện tái cấu trúc lớn. Dù có thể gây ngại ngần, Git cung cấp công cụ để giải quyết xung đột mà không mất dữ liệu.
Giải pháp: Khi xảy ra xung đột, Git sẽ đánh dấu các đoạn xung đột trong tệp và bạn cần sửa thủ công tệp để phản ánh thay đổi mong muốn. Sau khi chỉnh sửa, stage tệp bằng git add, rồi hoàn tất merge hoặc rebase bằng cách commit các thay đổi đã giải quyết. Các công cụ như trình soạn thảo xung đột của Git hoặc công cụ merge bên ngoài cũng giúp bạn xử lý xung đột hiệu quả hơn.
Kết luận
Lệnh git commit là nền tảng của quản lý phiên bản trong Git, cho phép nhà phát triển tạo ảnh chụp công việc của mình để có thể theo dõi, xem xét và quay lại theo thời gian. Commit đóng vai trò như các cột mốc trong lịch sử dự án, làm rõ đã thay đổi gì, vì sao cần thiết và khi nào được triển khai.
Trong hướng dẫn này, chúng ta đã đề cập cú pháp cơ bản và quy trình thực hiện commit, từ việc stage tệp với git add đến hoàn tất commit bằng git commit. Chúng ta đã thảo luận tầm quan trọng của việc viết thông điệp commit rõ ràng, súc tích, tuân theo các thực hành tốt như mô tả đầy đủ, dùng thì hiện tại và giữ ngắn gọn.
Ngoài ra, chúng ta đã khám phá các tùy chọn nâng cao, như commit không cần staging và amend commit, mang lại sự linh hoạt khi quản lý thay đổi. Chúng ta cũng xem cách quản lý commit qua các lệnh như git log, revert và reset.
Sẵn sàng khám phá GitHub sâu hơn? Khóa học GitHub Concepts của chúng tôi đi sâu vào fork, nhánh, issue và các thực hành cộng tác tốt nhất. Nếu bạn đang chuẩn bị cho quy trình làm việc thực tế hoặc phỏng vấn, Bảng gian lận Git đầy đủ là tài liệu tham khảo tuyệt vời để luôn có bên mình!
Câu hỏi thường gặp
Tôi có thể commit mà không có thông điệp (message) trong Git không?⌄
Về mặt kỹ thuật là có, nhưng không khuyến nghị. Nếu bạn chạy git commit mà không có cờ -m, Git sẽ mở trình soạn thảo văn bản mặc định để bạn nhập thông điệp commit tương tác. Nếu bạn lưu và thoát mà không viết gì, Git có thể hủy commit hoặc lưu thông điệp trống tùy cấu hình của bạn. Thông điệp commit rất quan trọng để theo dõi thay đổi — hãy luôn bao gồm một thông điệp!
Sự khác nhau giữa git commit và git push là gì?⌄
git commit lưu thay đổi cục bộ vào kho Git của bạn, trong khi git push gửi những thay đổi đó lên kho từ xa như GitHub hoặc GitLab. Hãy coi commit là các ảnh chụp cục bộ, còn push là cách chia sẻ các ảnh chụp đó với người khác.
Tôi có thể thay đổi một commit sau khi đã push không?⌄
Có, nhưng rủi ro. Bạn có thể sửa hoặc viết lại commit bằng các lệnh như git commit --amend hoặc git rebase, nhưng thay đổi commit đã push có thể gây vấn đề cho cộng tác viên. Nếu buộc phải thay đổi commit sau khi push, bạn có thể cần dùng git push --force, thao tác này ghi đè lịch sử — hãy cực kỳ thận trọng trên các nhánh dùng chung.
Commit đã ký (signed Git commit) là gì?⌄
Commit đã ký (signed commit) sử dụng GPG (GNU Privacy Guard) hoặc SSH để xác minh mật mã danh tính của tác giả commit. Điều này đặc biệt hữu ích trong môi trường nguồn mở hoặc doanh nghiệp, nơi việc xác thực tác giả của thay đổi là quan trọng. Bạn có thể tạo commit đã ký bằng:
git commit -S -m "Your message"
Tôi có thể hoàn tác một commit mà không mất các thay đổi không?⌄
Có! Bạn có thể dùng git reset --soft HEAD~1 để hoàn tác commit gần nhất đồng thời giữ nguyên các thay đổi ở trạng thái đã stage, hoặc git reset --mixed HEAD~1 để giữ chúng trong thư mục làm việc. Điều này hữu ích khi bạn nhận ra mình commit quá sớm hoặc với thông điệp sai.
Làm sao để kiểm tra những tệp nào được đưa vào một commit cụ thể?⌄
Bạn có thể chạy:
git show --name-only <commit-hash>
Lệnh này sẽ hiển thị thông điệp commit, diff và danh sách các tệp đã thay đổi trong commit đó.
Có cách nào để bắt buộc định dạng thông điệp commit trong một dự án không?⌄
Có. Bạn có thể dùng Git hook như commit-msg để áp đặt quy tắc (ví dụ: yêu cầu số ticket JIRA hoặc định dạng cụ thể). Các công cụ như Husky và Commitlint giúp tự động hóa điều này trong môi trường làm việc nhóm.
Git đã trở thành hệ thống tiêu chuẩn để quản lý thay đổi trong codebase. Một trong những lệnh quan trọng nhất trong Git là
git commit, lệnh này ghi lại một ảnh chụp (snapshot) lịch sử dự án của bạn tại một thời điểm cụ thể.Hiểu cách sử dụng
git commitmột cách hiệu quả là điều then chốt để duy trì lịch sử dự án sạch và có tổ chức. Viết thông điệp commit có ý nghĩa và tuân theo các thực hành tốt giúp kho lưu trữ của bạn dễ quản lý, dù bạn làm việc một mình hay trong một nhóm lớn.Hướng dẫn này nhằm giúp bạn biết cách dùng lệnh git commit, viết thông điệp commit rõ ràng và nhiều thông tin, cũng như áp dụng các thực hành tốt để quản lý phiên bản hiệu quả.
Bắt đầu thôi!
Git Commit là gì?
Một trong những khối xây dựng cơ bản nhất của quản lý phiên bản trong Git là lệnh
git commit. Mộtgit commitghi lại ảnh chụp trạng thái hiện tại của các tệp đã stage và lưu chúng vào lịch sử của kho lưu trữ. Nó tạo một mã định danh duy nhất cho các thay đổi và ghi lại siêu dữ liệu quan trọng như tác giả, dấu thời gian và thông điệp commit mô tả — điều này đảm bảo các sửa đổi có thể được theo dõi, hiểu và hoàn nguyên khi cần.Nhà phát triển cũng có thể thêm thông điệp commit, mô tả ngắn gọn các thay đổi đã thực hiện và cung cấp ngữ cảnh cùng lý do đằng sau cập nhật.
Về cơ bản, commit quan trọng vì cho phép nhà phát triển:
> Nếu bạn mới bắt đầu với Git và GitHub, lộ trình GitHub Foundations cung cấp một lộ trình chọn lọc giúp bạn nắm vững những điều cốt lõi của quản lý phiên bản và quy trình cộng tác.
Cú pháp cơ bản của Git Commit
Để dùng Git hiệu quả, bạn cần hiểu cú pháp và cấu trúc cơ bản của commit. Phần này trình bày các thành phần cốt lõi của quy trình commit để đảm bảo thay đổi được ghi nhận và tài liệu hóa đúng cách.
Lệnh cơ bản
Cách đơn giản nhất để tạo một commit là dùng lệnh sau:
Ở đây, cờ
-mcho phép bạn thêm một thông điệp commit ngắn mô tả các thay đổi. Đây là nơi bạn cung cấp ngữ cảnh để tham chiếu sau này và phục vụ cộng tác, ví dụ:Lệnh này thực hiện commit và gắn kèm thông điệp đã cung cấp.
Điều gì diễn ra trong một commit
Đây là những gì diễn ra bên trong khi bạn tạo commit:
git add. Điều này chuẩn bị các tệp đã chỉnh sửa để đưa vào commit kế tiếp. Bạn có thể stage từng tệp riêng lẻ hoặc tất cả các tệp đã chỉnh sửa.Viết thông điệp Git Commit hiệu quả
Viết thông điệp commit rõ ràng và có ý nghĩa là điều cần thiết để duy trì lịch sử dự án sạch và dễ hiểu. Một thông điệp commit được viết tốt cũng là công cụ giao tiếp, giúp nhà phát triển và cộng tác viên nhanh chóng nắm bắt mục đích và ngữ cảnh của từng thay đổi.
Tầm quan trọng của thông điệp commit tốt
Thông điệp commit tốt giống như một tấm bản đồ. Chúng cung cấp cái nhìn sâu về lý do đằng sau mỗi thay đổi, điều trở nên vô giá khi xem lại mã sau này hoặc khắc phục sự cố. Thông điệp commit được viết tốt cũng giúp truy vết lỗi, hiểu sự tiến hóa của tính năng và điều hướng qua lịch sử của kho lưu trữ dễ dàng hơn.
Thực hành tốt cho thông điệp commit
Để đảm bảo thông điệp commit hoàn thành mục đích của nó, hãy tuân theo các thực hành sau:
> Nếu bạn muốn vượt ra ngoài những điều cơ bản về commit, khóa học Intermediate Git sẽ hướng dẫn các khái niệm nâng cao như amend, rebase và quản lý lịch sử commit trong nhóm.
Các tùy chọn Git Commit nâng cao
Cờ
-mlà một tùy chọn phổ biến trong lệnh git commit và đủ cho nhu cầu hằng ngày. Tuy nhiên, còn có một số tùy chọn nâng cao khác mang lại sự linh hoạt và hiệu quả cao hơn khi quản lý thay đổi. Trong phần này, chúng ta sẽ xem xét các tùy chọn đó.Commit không cần staging
Trong nhiều trường hợp, tự tay stage tệp bằng
git addtrước khi commit có thể thấy không cần thiết, đặc biệt khi bạn muốn commit tất cả tệp đã chỉnh sửa. Để tăng tốc, Git cung cấp cờ-a, cờ này stage tất cả tệp đã được theo dõi và commit chúng trong một bước. Nghĩa là mọi thay đổi với các tệp đã theo dõi trước đó sẽ được đưa vào commit mà không cần chạygit addriêng.Cách dùng như sau:
Sửa (amend) một commit
Sai sót là chuyện bình thường. Đôi khi bạn cần thay đổi commit vừa tạo. Tùy chọn
--amendcho phép bạn chỉnh sửa commit gần nhất thay vì tạo commit mới. Bạn có thể cập nhật thông điệp commit hoặc thêm tệp vào cùng commit đó.Ví dụ, để sửa thông điệp của commit vừa rồi:
Hoặc, nếu bạn quên stage một tệp, hãy thêm tệp trước rồi amend commit:
Cách này sẽ thay thế commit trước đó bằng commit đã cập nhật.
Lưu ý chỉ nên amend các commit chưa được chia sẻ với người khác (ví dụ: chưa push lên kho dùng chung) để tránh ghi đè lịch sử mà người khác có thể đang phụ thuộc!
Commit với các thay đổi và tệp từ một commit cụ thể
Đôi khi bạn cần sửa hoặc khắc phục vấn đề trong một commit trước đó mà không đưa vào các thay đổi không liên quan. Git cung cấp tùy chọn
--fixup, giúp tạo một commit bổ sung liên kết cụ thể tới commit trước đó. Điều này đặc biệt hữu ích khi bạn cần dọn dẹp lịch sử commit trước khi hợp nhất thay đổi.Ví dụ, để tạo một fixup cho một commit cụ thể:
Lệnh này sẽ tạo một commit mới nhằm xử lý các vấn đề trong commit được chỉ định.
Sau đó, khi bạn thực hiện interactive rebase, Git có thể tự động squash các commit fixup này vào commit gốc mà chúng tham chiếu.
> Với các quy trình nâng cao như squash commit, bạn có thể làm theo hướng dẫn chi tiết trong hướng dẫn Git Squash Commits.
Quản lý Commit với Git
Khi dự án phát triển và lịch sử commit ngày càng nhiều, quản lý commit trở thành yếu tố then chốt để duy trì kho lưu trữ có tổ chức và dễ điều hướng. Quản lý commit hiệu quả giúp việc gỡ lỗi, cộng tác và giữ lịch sử rõ ràng, dễ hiểu.
Git cung cấp các công cụ mạnh mẽ cho phép bạn xem lịch sử commit và chỉnh sửa hoặc thậm chí hoàn tác thay đổi khi cần. Biết cách quản lý các commit này có thể tiết kiệm đáng kể thời gian khi giải quyết vấn đề hoặc tinh chỉnh lịch sử dự án.
Xem lịch sử commit
Một khía cạnh quan trọng của quản lý commit là hiểu lịch sử của dự án. Lệnh
git logcho phép bạn xem chi tiết lịch sử commit. Về ngữ cảnh, nó cung cấp thông tin về thời điểm thay đổi được thực hiện, ai thực hiện và thông điệp kèm theo.Ví dụ, đây là lệnh
git logcơ bản:Lệnh này hiển thị hash commit, tên tác giả, ngày tháng và thông điệp commit.
Git cũng cho phép bạn tùy chỉnh đầu ra log để đáp ứng nhu cầu cụ thể. Ví dụ, bạn có thể giới hạn số commit hiển thị như sau:
Để kiểm tra các thay đổi trong mỗi commit, dùng cờ
-pđể hiển thị phần diff cho từng commit.Cách dùng như sau:
Hoàn tác hoặc đảo ngược một commit
Đôi khi bạn cần quay lại hoặc hoàn tác thay đổi. Một cách an toàn để hoàn tác commit là sửdụng git revert lệnh. Lệnh này tạo một commit mới để đảo ngược các thay đổi được đưa vào bởi commit trước đó mà không làm thay đổi lịch sử commit.
Điều này đặc biệt hữu ích khi bạn đã chia sẻ commit với người khác và muốn giữ nguyên lịch sử.
Để revert một commit, dùng lệnh sau:
Lệnh này áp dụng phần thay đổi ngược lại của commit được chỉ định, hiệu quả là hoàn tác chúng đồng thời vẫn giữ lịch sử minh bạch.
Reset một commit
Trong một số trường hợp, bạn có thể muốn đặt lại hoàn toàn kho lưu trữ về trạng thái trước đó, xóa một hoặc nhiều commit. Lệnh git reset cho phép bạn thực hiện điều đó. Tuy nhiên, reset commit sẽ chỉnh sửa lịch sử commit, vì vậy cần thận trọng, đặc biệt nếu thay đổi đã được push lên kho dùng chung.
Git reset có ba chế độ:
Lệnh
git resetrất mạnh, nhưng điều quan trọng là hiểu hệ quả của nó (đặc biệt khi làm việc trong môi trường cộng tác).Thực hành tốt khi commit trong Git
Quản lý phiên bản hiệu quả không chỉ là biết các lệnh Git — mà còn là tuân thủ các thực hành tốt để duy trì lịch sử dự án sạch, dễ hiểu và hiệu quả. Những thực hành này không chỉ giúp bạn quản lý công việc của mình mà còn khiến việc đóng góp và xem xét thay đổi của cộng tác viên thuận tiện hơn.
Commit thường xuyên, nhưng giữ thay đổi nhỏ gọn
Một quy tắc hay là commit sớm và thường xuyên, nhưng giữ mỗi commit nhỏ và tập trung. Cách tiếp cận này đảm bảo mỗi commit đại diện cho một đơn vị công việc riêng biệt và hợp lý.
Commit thường xuyên giúp chia nhỏ thay đổi lớn thành các phần có thể quản lý, nhờ đó dễ xem xét, kiểm thử và lần theo sự phát triển của dự án. Bằng cách commit các thay đổi nhỏ, độc lập, bạn cũng giảm rủi ro đưa vào lỗi phức tạp. Nếu có sự cố, việc cô lập và sửa lỗi sẽ dễ hơn khi commit có độ hạt mịn.
Chỉ commit các thay đổi liên quan
Mỗi commit nên tập trung vào một tác vụ hoặc vấn đề duy nhất. Trộn lẫn các thay đổi không liên quan trong một commit khiến việc xem xét và hiểu mục đích trở nên khó khăn. Nó cũng làm phức tạp quá trình hoàn tác hoặc cherry-pick các thay đổi cụ thể khi cần.
Ví dụ, nếu bạn đang làm một tính năng nhưng phát hiện một lỗi nhỏ ở nơi khác trong mã, tốt hơn nên xử lý chúng thành hai commit riêng. Điều này cho phép hiểu rõ đã làm gì và vì sao — đồng thời đảm bảo mỗi commit có ý nghĩa và độc lập.
Cộng tác với người khác về lịch sử commit
Khi làm việc nhóm, việc thống nhất với cộng tác viên về cách xử lý và trình bày commit là điều cần thiết. Điều này bao gồm thống nhất định dạng thông điệp commit nhất quán và đảm bảo mọi người tuân theo các thực hành tốt. Git hook, như pre-commit hook, có thể giúp áp dụng các quy tắc như định dạng thông điệp commit hoặc chạy kiểm thử trước khi cho phép commit.
Cộng tác cũng được tăng cường nhờ các công cụ giúp quản lý và xem xét commit, như các nền tảng đánh giá mã như GitHub hoặc GitLab. Lịch sử commit rõ ràng, được tài liệu hóa tốt giúp các thành viên hiểu thay đổi, thảo luận cải tiến và thúc đẩy dự án tiến lên hiệu quả.
> Muốn dọn dẹp tệp thừa trước khi commit? Tìm hiểu cách dùng
git cleantrong hướng dẫn xóa tệp chưa theo dõi này.Khắc phục sự cố thường gặp với Git Commit
Đôi khi việc commit trong Git có thể dẫn đến lỗi hoặc thách thức làm chậm quy trình của bạn. Hiểu cách khắc phục những sự cố thường gặp này là rất quan trọng để duy trì quản lý phiên bản trơn tru và tránh các vấn đề lớn về sau.
Lỗi về thông điệp commit
Một lỗi phổ biến khi commit là quên thêm thông điệp commit hoặc vô tình dùng thông điệp mơ hồ hoặc trống. Thông điệp commit rõ ràng và nhiều thông tin là điều thiết yếu để theo dõi thay đổi và giúp cộng tác viên hiểu lịch sử dự án. Git thường sẽ ngăn bạn commit nếu không có thông điệp, nhưng bạn vẫn có thể bỏ qua chất lượng của thông điệp.
Giải pháp: Luôn kiểm tra kỹ thông điệp commit trước khi nhấn Enter. Nếu bạn vô tình gửi commit với thông điệp trống hoặc không rõ ràng, bạn có thể sửa bằng lệnh
git commit --amendđể chỉnh thông điệp commit gần nhất.Xung đột sau khi commit
Xung đột là điều khó tránh khi nhiều người cùng làm việc trên một dự án. Chúng thường phát sinh sau một commit khi bạn gộp nhánh (merge) hoặc rebase. Xung đột xảy ra khi Git không thể tự động hòa giải khác biệt giữa hai commit, buộc bạn phải chọn thủ công các thay đổi cần giữ.
Xung đột thường xảy ra khi hai hoặc nhiều người cùng sửa cùng một phần mã, hoặc khi thực hiện tái cấu trúc lớn. Dù có thể gây ngại ngần, Git cung cấp công cụ để giải quyết xung đột mà không mất dữ liệu.
Giải pháp: Khi xảy ra xung đột, Git sẽ đánh dấu các đoạn xung đột trong tệp và bạn cần sửa thủ công tệp để phản ánh thay đổi mong muốn. Sau khi chỉnh sửa, stage tệp bằng
git add, rồi hoàn tấtmergehoặcrebasebằng cách commit các thay đổi đã giải quyết. Các công cụ như trình soạn thảo xung đột của Git hoặc công cụ merge bên ngoài cũng giúp bạn xử lý xung đột hiệu quả hơn.Kết luận
Lệnh
git commitlà nền tảng của quản lý phiên bản trong Git, cho phép nhà phát triển tạo ảnh chụp công việc của mình để có thể theo dõi, xem xét và quay lại theo thời gian. Commit đóng vai trò như các cột mốc trong lịch sử dự án, làm rõ đã thay đổi gì, vì sao cần thiết và khi nào được triển khai.Trong hướng dẫn này, chúng ta đã đề cập cú pháp cơ bản và quy trình thực hiện commit, từ việc stage tệp với
git addđến hoàn tất commit bằnggit commit. Chúng ta đã thảo luận tầm quan trọng của việc viết thông điệp commit rõ ràng, súc tích, tuân theo các thực hành tốt như mô tả đầy đủ, dùng thì hiện tại và giữ ngắn gọn.Ngoài ra, chúng ta đã khám phá các tùy chọn nâng cao, như commit không cần staging và amend commit, mang lại sự linh hoạt khi quản lý thay đổi. Chúng ta cũng xem cách quản lý commit qua các lệnh như
git log, revert và reset.Sẵn sàng khám phá GitHub sâu hơn? Khóa học GitHub Concepts của chúng tôi đi sâu vào fork, nhánh, issue và các thực hành cộng tác tốt nhất. Nếu bạn đang chuẩn bị cho quy trình làm việc thực tế hoặc phỏng vấn, Bảng gian lận Git đầy đủ là tài liệu tham khảo tuyệt vời để luôn có bên mình!