Tracks
Git là một công cụ thiết yếu trong bộ công cụ của nhà phát triển hiện đại, nổi tiếng với khả năng quản lý phiên bản mạnh mẽ. Được Linus Torvalds tạo ra vào năm 2005 để hỗ trợ phát triển nhân Linux, Git từ đó đã trở thành xương sống của vô số dự án phần mềm trên toàn thế giới. Hiệu quả và tính linh hoạt trong việc quản lý các phiên bản dự án, cùng với hỗ trợ hợp tác vững chắc, khiến Git không thể thiếu cho các nhóm ở mọi quy mô.
Bài viết này nhằm chuẩn bị cho bạn các buổi phỏng vấn kỹ thuật bằng cách bao quát 20 câu hỏi phỏng vấn Git hàng đầu, từ mức cơ bản đến nâng cao. Dù bạn mới bắt đầu với Git hay muốn đào sâu hiểu biết, những câu hỏi và đáp án này sẽ giúp bạn thể hiện năng lực và vượt qua phỏng vấn.
Câu Hỏi Phỏng Vấn Git Cơ Bản
Nếu bạn còn khá mới với Git, nhiều câu hỏi phỏng vấn cơ bản sẽ xoay quanh các khái niệm và cách dùng dành cho người bắt đầu. Nếu cần ôn lại, hãy xem khóa học Introduction to Git của DataCamp.
1. Git repository là gì?
Một Git repository lưu trữ các tệp của dự án và lịch sử chỉnh sửa, đồng thời hỗ trợ quản lý phiên bản bằng cách theo dõi các thay đổi theo thời gian. Nó có thể nằm cục bộ trong một thư mục trên thiết bị của bạn hoặc trên nền tảng trực tuyến như GitHub. Nhờ đó người dùng có thể cộng tác, quay lại các phiên bản trước và quản lý phát triển dự án hiệu quả bằng các lệnh như commit, push và pull.
2. Git hoạt động như thế nào?
Git hoạt động bằng cách ghi lại các thay đổi đối với tệp và thư mục trong một dự án, chụp lại các "ảnh chụp" (snapshot) về trạng thái thay đổi của nó. Người dùng có thể theo dõi chỉnh sửa, tạo nhánh để phát triển song song, hợp nhất nhánh, và quay về trạng thái trước đó khi cần. Git cũng thúc đẩy hợp tác và đảm bảo quản lý phiên bản hiệu quả trong các nỗ lực phát triển phần mềm.
3. git add là gì?
Lệnh git add được dùng trong Git để đưa các thay đổi vào vùng chờ (staging) cho lần commit tiếp theo. Nó chuẩn bị các chỉnh sửa, bổ sung hoặc xóa đối với tệp trong thư mục làm việc, đánh dấu chúng sẽ được đưa vào snapshot của commit sắp tới. Lưu ý lệnh này không thực hiện commit mà chỉ chuẩn bị cho việc staging.
4. git push là gì?
Lệnh git push được dùng để tải nội dung từ repository cục bộ lên repository từ xa. Nó chuyển các thay đổi đã commit từ repository cục bộ lên một repository từ xa, thường trên máy chủ như GitHub hoặc GitLab. Lệnh này cho phép cộng tác bằng cách giúp người dùng chia sẻ thay đổi của họ với những người khác trong cùng dự án.
Bạn có thể tìm hiểu thêm về Git push và pull trong hướng dẫn riêng của chúng tôi.
5. git status là gì?
Lệnh git status hiển thị trạng thái hiện tại của repository trong Git. Nó cung cấp thông tin về những tệp nào đã bị sửa đổi, tệp nào đang ở trạng thái chờ commit, và tệp nào chưa được theo dõi. Lệnh này giúp người dùng theo dõi tiến độ công việc và xác định các thay đổi cần commit hoặc cần đưa vào staging.
6. Commit trong Git là gì?
Một commit đại diện cho một snapshot của các thay đổi đã thực hiện lên tệp trong repository tại một thời điểm cụ thể. Khi bạn commit thay đổi trong Git, bạn đang lưu lại trạng thái hiện tại của các tệp và có thể kèm theo thông điệp mô tả giải thích các thay đổi (điều này được khuyến nghị).
Mỗi commit tạo ra một định danh duy nhất, cho phép bạn theo dõi lịch sử thay đổi trong repository. Commit đóng vai trò then chốt trong quản lý phiên bản, vì chúng cho phép quay về trạng thái trước đó của dự án, xem lại lịch sử thay đổi, và cộng tác với người khác bằng cách chia sẻ cập nhật.

Tham khảo Git Cheat Sheet của DataCamp để hỗ trợ ôn phỏng vấn
7. Branching trong Git là gì?
Branching (tách nhánh) là việc rẽ khỏi dòng phát triển chính (thường gọi là nhánh "master") để làm việc trên tính năng mới, sửa lỗi hoặc thử nghiệm mà không ảnh hưởng đến mã nguồn chính. Nó cho phép nhiều dòng phát triển song song cùng tồn tại trong cùng một repository.
Mỗi nhánh đại diện cho một dòng phát triển riêng với bộ commit của chính nó, cho phép các nhà phát triển làm việc đồng thời trên các tính năng hoặc bản sửa khác nhau. Branching tạo thuận lợi cho hợp tác, thử nghiệm và tổ chức trong dự án, vì các thay đổi ở một nhánh có thể được hợp nhất lại vào mã nguồn chính sau khi hoàn tất và kiểm thử.
8. Conflict trong Git là gì?
Xung đột (conflict) phát sinh khi có các thay đổi mâu thuẫn được thực hiện lên cùng một phần của tệp hoặc giữa các tệp bởi những người đóng góp khác nhau, thường trong quá trình merge hoặc rebase. Git không thể tự động giải quyết các thay đổi mâu thuẫn này và cần người dùng can thiệp thủ công để hòa giải khác biệt.
Do đó, để giải quyết xung đột, cần xem xét và chỉnh sửa các tệp bị xung đột theo phương án dung hòa phù hợp nhất trước khi commit phiên bản đã được xử lý.
9. Merge trong Git là gì?
Merge là thao tác nền tảng trong Git giúp cộng tác và tích hợp các thay đổi giữa những nhánh khác nhau trong một dự án. Cụ thể, merge là quá trình kết hợp các thay đổi từ các nhánh khác nhau vào một nhánh duy nhất, thường là nhánh chính (ví dụ: master hoặc main).
Một lần merge sẽ tích hợp các thay đổi của một nhánh vào nhánh khác, tạo ra một commit mới kết hợp lịch sử của cả hai nhánh. Bạn có thể tìm hiểu thêm về cách xử lý xung đột khi merge trong Git qua hướng dẫn riêng của chúng tôi.
Câu Hỏi Phỏng Vấn Git Trung Cấp
10. Remote trong Git là gì?
Remote là một repository được lưu trữ trên máy chủ hoặc máy tính khác để phục vụ cộng tác và chia sẻ mã với người khác. Nó hoạt động như một vị trí tập trung nơi các nhà phát triển có thể đẩy (push) thay đổi cục bộ và kéo (pull) các thay đổi do người khác thực hiện.
Remote thường được thiết lập trên các nền tảng như GitHub, GitLab hoặc Bitbucket, cho phép phát triển phân tán và hỗ trợ làm việc nhóm bằng cách cung cấp một nơi chung để lưu trữ và đồng bộ mã dự án giữa nhiều cộng tác viên.
11. Sự khác nhau giữa git fetch và git pull là gì?
Sự khác nhau chính giữa git fetch và git pull nằm ở việc chúng làm gì và cách chúng cập nhật repository cục bộ.
Lệnh git fetch lấy các thay đổi từ repository từ xa về repository cục bộ. Nó cập nhật các nhánh theo dõi từ xa (ví dụ, origin/master) trong repository cục bộ để phản ánh trạng thái của repository từ xa, nhưng không cập nhật thư mục làm việc hay hợp nhất bất kỳ thay đổi nào vào nhánh hiện tại. Điều này có nghĩa sau khi fetch, bạn có thể xem xét các thay đổi trên repository từ xa mà không ảnh hưởng đến công việc cục bộ.
Lệnh git pull cũng lấy các thay đổi từ repository từ xa, nhưng tiến thêm một bước bằng cách fetch và đồng thời merge chúng vào nhánh hiện tại trong một bước. Về bản chất, nó thực hiện git fetch rồi đến git merge để đưa các thay đổi từ repository từ xa vào nhánh hiện tại.
12. Làm thế nào để revert một commit đã được push và công khai?
Có thể dùng lệnh git revert <commit-hash> để hoàn tác (revert) một commit đã được push và công khai.
Quy trình từng bước như sau:
1. Xác định commit bạn muốn hoàn tác bằng cách tìm commit hash của nó. Có thể dùng lệnh git log để xem lịch sử commit và tìm commit hash cần revert.
2. Khi đã có commit hash, dùng lệnh git revert kèm commit hash để tạo một commit mới đảo ngược các thay đổi được giới thiệu bởi commit đã chỉ định. Ví dụ:
git revert <commit-hash>
3. Git sẽ mở trình soạn thảo văn bản để tạo thông điệp commit cho lần revert. Bạn có thể chỉnh sửa nếu cần, sau đó lưu và đóng trình soạn thảo.
4. Sau khi lưu thông điệp, Git sẽ tạo một commit mới thực chất hoàn tác các thay đổi được giới thiệu bởi commit đã chỉ định. Commit mới này sẽ được thêm vào lịch sử, qua đó hoàn tác các thay đổi của commit gốc.
5. Cuối cùng, đẩy (push) commit mới lên repository từ xa để công khai việc revert bằng lệnh sau:
git push origin <branch-name>
Sử dụng git revert sẽ tạo một commit mới để đảo ngược các thay đổi do commit gốc đưa vào, tức là hoàn tác mà không làm thay đổi lịch sử commit. Cách này an toàn hơn git reset hoặc git amend, vốn có thể thay đổi lịch sử commit và gây vấn đề cho cộng tác viên đã kéo (pull) các thay đổi.
13. git reset làm gì?
Lệnh git reset đặt lại HEAD hiện tại về một trạng thái được chỉ định. Điều này có nghĩa nó có thể dùng để hoàn tác thay đổi, bỏ staging của tệp, hoặc di chuyển con trỏ HEAD đến một commit khác. Lưu ý có ba chế độ chính của git reset:
--soft: Đặt lại con trỏ HEAD về một commit cụ thể, giữ nguyên các thay đổi ở trạng thái staging. Tệp vẫn ở trạng thái đã chỉnh sửa trong thư mục làm việc, cho phép bạn commit lại.
--mixed: Đặt lại con trỏ HEAD về một commit cụ thể, bỏ staging các thay đổi. Tệp vẫn đã chỉnh sửa trong thư mục làm việc, nhưng các thay đổi không còn ở trạng thái chờ commit.
--hard: Đặt lại con trỏ HEAD về một commit cụ thể, loại bỏ tất cả thay đổi trong thư mục làm việc và vùng staging. Hãy thận trọng, vì nó xóa vĩnh viễn các thay đổi chưa commit.
14. git stash là gì?
git stash là lệnh Git tạm thời lưu trữ các thay đổi trong thư mục làm việc chưa sẵn sàng để commit. Nó cho phép nhà phát triển lưu lại các chỉnh sửa mà không cần commit vào repository.
Stash hữu ích khi bạn chuyển nhánh nhưng không muốn commit hoặc mất các thay đổi. Sau đó, bạn có thể áp dụng (apply) các thay đổi đã stash vào thư mục làm việc hoặc pop chúng khỏi ngăn xếp stash để tiếp tục làm việc.
15. git reflog là gì?
git reflog là lệnh Git dùng để xem reference log, ghi nhận các thay đổi của con trỏ HEAD và lịch sử các commit đã được checkout trong repository. Nó cung cấp danh sách theo trình tự thời gian các hành động gần đây trong repository, bao gồm commit, checkout, merge và reset.
Reflog hữu ích để khôi phục các commit hoặc nhánh đã mất và hiểu trình tự các thao tác đã thực hiện trong repository.
16. Làm thế nào để một nhánh Git hiện có theo dõi một nhánh từ xa?
Để khiến một nhánh Git hiện có theo dõi (track) một nhánh từ xa, bạn có thể dùng lệnh git branch với tùy chọn --set-upstream-to hoặc -u, theo sau là tên nhánh từ xa.
Cú pháp như sau:
git branch --set-upstream-to=<remote-name>/<branch-name>
hoặc
git branch -u <remote-name>/<branch-name>
Câu Hỏi Phỏng Vấn Git Nâng Cao
17. Bạn quản lý nhiều cấu hình cho các dự án khác nhau trong Git như thế nào?
Để xử lý nhiều cấu hình, sử dụng lệnh git config cùng với các cờ --global, --system hoặc --local để điều chỉnh thiết lập ở các cấp độ khác nhau. Ngoài ra, dùng includeIf trong cấu hình Git để đưa vào các thiết lập cụ thể dựa trên đường dẫn của repository.
18. Bạn xử lý tệp lớn với Git như thế nào?
Xử lý tệp lớn trong Git có thể thách thức do ảnh hưởng đến kích thước repository và hiệu năng. Hãy dùng Git LFS để lưu trữ tệp lớn bên ngoài repository Git trong khi giữ các con trỏ nhẹ (pointer) trong repository. Cách này giảm kích thước repository và cải thiện hiệu năng. Git LFS hỗ trợ nhiều nhà cung cấp lưu trữ và tích hợp mượt mà với quy trình làm việc của Git.
19. Mục đích của git submodule là gì và cập nhật nó như thế nào?
Lệnh git submodule quản lý các phụ thuộc bên ngoài trong một repository Git. Nó cho phép bạn đưa các repository bên ngoài làm submodule trong repository chính. Điều này hữu ích khi bạn muốn tích hợp mã từ nguồn bên ngoài trong khi vẫn tách biệt với mã nguồn chính của dự án.
Để cập nhật một submodule trong Git, bạn có thể làm theo các bước sau:
- Đi đến thư mục của submodule bên trong repository chính.
- Dùng
git fetchđể lấy các thay đổi mới nhất từ repository từ xa của submodule. - Nếu muốn cập nhật tới commit mới nhất trên nhánh mà submodule đang theo dõi, bạn có thể dùng
git pull. - Hoặc, nếu muốn cập nhật tới một commit hoặc nhánh cụ thể, dùng
git checkoutkèm theo hash commit hoặc tên nhánh mong muốn. - Sau khi cập nhật submodule tới trạng thái mong muốn, bạn cần commit các thay đổi vào repository chính để phản ánh trạng thái submodule đã cập nhật.
20. Ý nghĩa của git push --force-with-lease so với git push --force là gì?
git push --force-with-lease là cách tiếp cận thận trọng hơn khi force-push thay đổi lên repository từ xa so với git push --force vì nó ngăn việc vô tình ghi đè các thay đổi do người khác thực hiện trên repository từ xa.
Khi bạn dùng git push --force, bạn ép đẩy thay đổi lên repository từ xa bất kể người khác có cập nhật nó kể từ lần fetch cuối của bạn hay không. Điều này có thể dẫn đến việc vô tình làm mất công sức của nhà phát triển khác.
Ngược lại, git push --force-with-lease an toàn hơn. Nó kiểm tra xem nhánh từ xa mà bạn đang push có được người khác cập nhật kể từ lần fetch cuối của bạn hay chưa. Nếu nhánh từ xa đã được cập nhật, thao tác push sẽ bị từ chối, ngăn bạn vô tình ghi đè thay đổi của người khác.
Chuẩn Bị Cho Phỏng Vấn Kỹ Thuật
Trình bày kiến thức và kinh nghiệm Git trong phỏng vấn là rất quan trọng để thể hiện năng lực của bạn về quản lý phiên bản và cộng tác trong các nhóm phát triển phần mềm.
Hãy xem một số mẹo bạn nên làm theo khi chuẩn bị cho phỏng vấn kỹ thuật để truyền đạt hiệu quả kỹ năng Git của mình:
Nắm vững các nền tảng của Git
Đảm bảo bạn hiểu vững các nền tảng của Git, bao gồm repository, branching, merging, commit và các lệnh cơ bản như pull, push, clone và commit. Kiến thức nền tảng này sẽ là cơ sở cho phần trao đổi trong phỏng vấn. Ngoài ra, việc nắm chắc các nguyên lý thiết yếu như quản lý phiên bản, phân biệt sự khác nhau giữa Git và các hệ thống quản lý phiên bản (VCS) khác, cũng như hiểu tầm quan trọng của chúng trong phát triển phần mềm sẽ rất hữu ích.
Cuối cùng, hãy làm quen với các phương pháp Git khác nhau như Git Flow, GitHub Flow và GitLab Flow. Đánh giá ưu và nhược điểm của từng cách tiếp cận và xác định tình huống mà chúng phát huy hiệu quả nhất.
Hướng dẫn đầy đủ về Git của DataCamp là điểm khởi đầu tốt để làm quen với các nền tảng.
Trải nghiệm thực hành
Bạn càng dùng Git nhiều, kiến thức càng được củng cố. Luyện tập thường xuyên giúp bạn quen thuộc hơn với nhiều lệnh và quy trình. Hãy cố gắng đưa Git vào quy trình làm việc hàng ngày để tăng trải nghiệm. Đừng quên thử tạo nhánh, hợp nhất nhánh và xử lý xung đột.
Nếu bạn chưa biết nên làm dự án gì để có trải nghiệm thực hành với Git, tham gia các dự án mã nguồn mở qua các nền tảng như GitHub là cách tuyệt vời để tiếp cận trực tiếp các công cụ và quy trình hợp tác theo tiêu chuẩn ngành.
Tìm hiểu các vấn đề thường gặp và cách khắc phục
Bạn chắc chắn sẽ gặp vấn đề khi dùng Git. Một số vấn đề phổ biến gồm xung đột khi merge, trạng thái detached HEAD, hoàn tác thay đổi, và khôi phục commit đã mất. Chẩn đoán vấn đề trong Git giúp nâng cao kỹ năng khắc phục sự cố và hiểu sâu hơn về cơ chế bên dưới của Git.
Bằng cách chủ động xử lý sự cố và phân tích thông báo lỗi, bạn sẽ hiểu thêm về cách Git hoạt động bên trong và thành thạo trong việc xác định, giải quyết vấn đề hiệu quả. Cách tiếp cận chủ động này giảm thiểu rủi ro và xây dựng sự tự tin cũng như chuyên môn trong quản lý quy trình quản lý phiên bản.
Luyện phỏng vấn thử
Thông qua các buổi phỏng vấn thử, ứng viên có thể nhận diện điểm yếu trong kiến thức Git và kỹ năng giao tiếp, từ đó tập trung chuẩn bị hiệu quả hơn.
Ngoài ra, phỏng vấn thử mang lại cơ hội quý giá để rèn luyện khả năng giải quyết vấn đề bằng cách xử lý các kịch bản và bài tập liên quan đến Git sát thực tế. Việc thực hành này giúp ứng viên tự tin hơn với kỹ năng Git và cải thiện khả năng diễn đạt rõ ràng trong buổi phỏng vấn.
Kết Luận
Git là hệ thống quản lý phiên bản mạnh mẽ, được sử dụng rộng rãi trong phát triển phần mềm để quản lý thay đổi mã, cộng tác với người khác và duy trì lịch sử dự án. Hiểu biết về Git là điều thiết yếu trong phỏng vấn kỹ thuật vì nó thể hiện sự thành thạo các công cụ và quy trình làm việc quan trọng của nhà phát triển, cho thấy kỹ năng hợp tác và khả năng quản lý mã hiệu quả trong môi trường làm việc nhóm.
Bên cạnh đó, hiểu rõ các khái niệm và lệnh Git cho phép áp dụng thực hành quản lý phiên bản hiệu quả, đảm bảo tính toàn vẹn của mã, tính liên tục của dự án và quy trình phát triển tinh gọn. Do vậy, kiến thức về Git là vô giá đối với những kỹ sư và lập trình viên phần mềm đang chuẩn bị cho phỏng vấn kỹ thuật và theo đuổi sự nghiệp thành công.
Để học thêm, hãy xem các tài nguyên sau:
