Bài viết này tổng hợp ba chủ đề thường gặp khi bạn đã nắm được quy trình Git cơ bản: tạo repository (bằng git init hoặc từ IDE), điểm khác nhau giữa rebase và merge, và cách xử lý đúng khi bí mật vô tình lọt vào lịch sử. Cả ba đều hữu ích khi làm việc với Claude Code: công cụ này thực hiện các thao tác đó bằng lệnh, và bạn cần hiểu chúng làm gì.

Ví dụ và ảnh chụp giao diện sử dụng IDE JetBrains; tên và vị trí thao tác có thể khác trong phiên bản bạn dùng. Hãy dùng một repository riêng để luyện tập. Trong dự án công việc, hãy tuân theo quy tắc về branch, commit và gửi thay đổi của dự án đó.

Tạo repository bằng git init hoặc từ IDE

Nếu dự án đã có trên GitHub, bạn có thể clone nó. Còn nếu bạn có một thư mục mã nguồn trên máy, hãy dùng git init. Lệnh này tạo dữ liệu nội bộ của Git trong thư mục, nhưng không tạo commit đầu tiên. Ví dụ bên dưới giả định README.md và .gitignore đã được tạo và kiểm tra; các tệp cần thiết khác sẽ được thêm riêng.

git init
git status
# sau khi kiểm tra README và các quy tắc ignore
git add README.md .gitignore
git diff --cached
git commit -m "Initial commit"

Để tạo repository cục bộ trong IDE, hãy dùng thao tác tạo Git repository hoặc bật tính năng quản lý phiên bản. Share Project on GitHub là một quy trình riêng: thao tác này cũng tạo repository từ xa và đề nghị push. Trước khi push, hãy kiểm tra các tệp đã chọn, lịch sử và chế độ hiển thị.

Public hay private

Khi tạo repository, bạn chọn chế độ hiển thị:

  • public - mọi người trên Internet đều có thể xem repository và mã nguồn. Phù hợp cho portfolio và open source;
  • private - chỉ bạn và những người được mời mới có quyền truy cập. Đây là lựa chọn mặc định cho mã nguồn công việc và bài tập không thể công khai.

Chế độ hiển thị không cố định mãi: sau này bạn vẫn có thể đổi trong phần cài đặt repository trên GitHub.

Claude Code liên quan thế nào

Claude Code có thể chạy git init và chuẩn bị commit đầu tiên giúp bạn. Nếu GitHub chưa có repository, công cụ có thể tạo một repository thông qua GitHub CLI (gh repo create); lúc đó bạn chọn chế độ public hay private.

rebase và merge khác nhau thế nào

Cả merge lẫn rebase đều giúp đưa công việc từ branch này sang branch khác. Nhưng mỗi lệnh làm theo một cách, vì vậy lịch sử dự án cũng có hình dạng khác nhau.

merge kết hợp các lịch sử. Nếu lịch sử đã rẽ nhánh, Git thường tạo một merge commit có hai commit cha. Nếu branch hiện tại là tổ tiên của branch kia, Git có thể fast-forward mà không tạo commit mới. Sơ đồ bên dưới minh họa trường hợp hai branch đã rẽ nhánh.

Đường phía trên là main, đường phía dưới là feature. Sau khi merge, main trỏ đến M, commit có hai commit cha là E và D.ABEMCD
Đường phía trên là main, đường phía dưới là feature. Sau khi merge, main trỏ đến M, commit có hai commit cha là E và D.

merge giữ lại cả hai nhánh và thêm một merge commit. Nhờ vậy, lịch sử cho thấy rõ đã có một branch feature riêng.

rebase chuyển các commit của bạn lên đỉnh mới nhất của branch đích, như thể bạn bắt đầu công việc từ đó. Lịch sử trở thành một chuỗi thẳng. Đổi lại, rebase viết lại các commit: commit cũ được thay bằng commit mới có hash khác.

Branch main trỏ đến E, còn branch feature sau rebase trỏ đến D2 mới. Sơ đồ không hiển thị lịch sử chung trước B.BEC2D2
Branch main trỏ đến E, còn branch feature sau rebase trỏ đến D2 mới. Sơ đồ không hiển thị lịch sử chung trước B.

Sau rebase, các commit C và D trông như được tạo trên E: lịch sử là một chuỗi thẳng, nhưng giờ đây chúng là các commit mới (C2, D2) với hash khác.

Vậy nên chọn cách nào?

  • merge - khi cần giữ nguyên lịch sử thực tế, đặc biệt với branch dùng chung. Đây là lựa chọn an toàn theo mặc định;
  • rebase - để sắp xếp lại branch riêng trước pull request; lịch sử dạng tuyến tính dễ đọc hơn.
Lưu ý

Khi mới làm quen với rebase, hãy dùng nó trên branch riêng chưa được push. Chỉ viết lại branch mà người khác đang dùng theo quy trình đã thống nhất; nếu không, đồng đội sẽ giữ lịch sử cũ. Nếu chưa chắc hậu quả ra sao, hãy dừng lại và hỏi về quy tắc của dự án.

Lưu ý

Cách kết hợp branch phụ thuộc vào nhiệm vụ và quy tắc dự án. Đừng mặc định rằng agent sẽ chọn đúng: trước khi chạy, hãy yêu cầu agent nêu rõ branch đích, thao tác sẽ thực hiện và ảnh hưởng đến lịch sử.

Xóa bí mật khỏi repository

Xóa tệp trong một commit mới không xóa bí mật khỏi các commit cũ. Nếu mật khẩu hoặc token đã bị lộ cho người khác, trước hết hãy thu hồi hoặc thay nó tại dịch vụ đã cấp. Dọn lịch sử cũng không thể xóa những bản sao đã được tạo.

Lưu ý

Đừng xem việc dọn lịch sử dùng chung như một lần sửa tệp thông thường. Thao tác này thay đổi ID của các commit và cần phối hợp: dừng push các branch cũ, xác định mọi đường dẫn bị ảnh hưởng, kiểm tra kết quả trong một bản sao riêng và thống nhất cách đồng đội cập nhật bản sao của họ.

GitHub hướng dẫn cách dọn lịch sử bằng git-filter-repo. Các lệnh cụ thể tùy thuộc vào việc bạn xóa toàn bộ tệp hay thay thế một dòng chứa bí mật, dòng đó xuất hiện ở đâu và lịch sử đã được đẩy đến đâu. Hãy làm theo hướng dẫn chính thức về xóa dữ liệu nhạy cảm, bao gồm tạo bản sao mới, kiểm tra kết quả, cập nhật các tham chiếu từ xa và phối hợp với đồng đội.

Việc dọn bản sao cục bộ không làm thay đổi server. Force push lịch sử đã viết lại là một thao tác riêng cần được thống nhất trước; đừng chạy một lệnh chung cho mọi branch ở đây. Bạn không kiểm soát được các bản sao trong clone và fork của người khác. Với các liên kết và cache GitHub vẫn cung cấp, hãy xem điều kiện liên hệ Support trong cùng hướng dẫn.

Để giảm nguy cơ gặp lại tình huống này:

  • lưu giá trị bí mật bên ngoài mã nguồn, chẳng hạn trong biến môi trường;
  • thêm các tệp cục bộ như .env vào .gitignore trước khi Git theo dõi chúng;
  • kiểm tra các tệp đã chọn và git diff --cached trước khi commit;
  • nếu repository hỗ trợ secret scanning và push protection, hãy bật chúng như một lớp kiểm tra bổ sung; các tính năng này không phát hiện được mọi bí mật.
Lưu ý

Agent có thể giúp tìm các đường dẫn bị ảnh hưởng và chuẩn bị kế hoạch dọn lịch sử. Đừng gửi bí mật đang hoạt động vào chat để tìm kiếm. Trước tiên hãy thu hồi quyền truy cập, sau đó thống nhất cách xử lý lịch sử.

Claude Code làm việc với Git thế nào

Cả ba chủ đề này đều xuất hiện khi Claude Code làm việc với repository. Bạn cần để ý những điểm sau:

  • công cụ có thể khởi tạo repository (git init) và chuẩn bị commit đầu tiên; bạn tự chọn public hay private khi tạo repository trên GitHub;
  • công cụ đề xuất cách kết hợp branch theo quy tắc dự án; bạn kiểm tra tác động của merge và rebase trước khi chạy;
  • công cụ nhìn thấy các tệp sẽ được đưa vào commit, nhưng bạn vẫn chịu trách nhiệm cuối cùng để bí mật không lọt vào đó.
Lưu ý

Trước khi commit, hãy kiểm tra cả danh sách tệp lẫn nội dung của chúng trong diff. Bí mật có thể nằm trong một tệp mã nguồn bình thường, không chỉ trong .env. Nếu bí mật đã lọt vào lịch sử, hãy thay nó trước rồi mới xem có cần dọn lịch sử hay không.

Bài viết trước: Hoàn tác và khôi phục thay đổi trong Git