Bạn vừa commit xong mới phát hiện mình đang đứng ở main thay vì branch tính năng? Đây là lỗi rất dễ gặp, nhất là khi vừa pull code, đổi task gấp hoặc mở nhiều terminal cùng lúc. Đừng vội xóa commit hay chạy reset --hard nhé.
Git commit vào nhánh sai thường sửa được khá an toàn nếu bạn biết commit đó đã push chưa và branch sai có ai đang dùng chung không. Trong bài này, mình sẽ hướng dẫn bạn chuyển commit sang branch đúng bằng git switch -c, git cherry-pick, git reset và git revert. Bài này thuộc series xử lý lỗi Git của VietnamTutor, nối tiếp bài pillar Cách xử lý lỗi Git thường gặp.

Tóm tắt nhanh
- Git commit vào nhánh sai cần xử lý khác nhau tùy commit đã push hay chưa.
- Nếu commit chưa push và chỉ nằm trên máy bạn, cách gọn nhất là tạo branch đúng tại commit hiện tại rồi đưa branch sai lùi lại.
- Nếu muốn lấy commit sang branch khác mà không thay đổi ngay branch sai, dùng
git cherry-pick. - Nếu commit đã push lên branch chung, ưu tiên
git reverthoặc trao đổi với team trước khi rewrite history. - Trước mọi thao tác, hãy chạy
git statusvà lưu lại hash commit cần chuyển.
Git commit vào nhánh sai là gì?
Git commit vào nhánh sai là tình huống bạn tạo commit trên một branch không đúng với task, ví dụ commit tính năng mới vào main hoặc commit hotfix vào branch feature. Vấn đề nằm ở vị trí branch pointer, không nhất thiết là nội dung commit đã hỏng.
Trong Git, commit được gắn vào tip của branch hiện tại. Tài liệu git switch mô tả rằng khi bạn chuyển sang một branch, các commit mới sẽ được thêm vào tip của branch đó [1]. Vì vậy nếu bạn đứng sai branch lúc commit, lịch sử branch sẽ đi lệch so với ý định.
Ví dụ dễ gặp:
git branch --show-current # main git add app/Services/InvoiceService.php git commit -m "Thêm logic xuất hóa đơn" # Lỡ commit tính năng vào main thay vì feature/invoice
Tin tốt là nếu commit chưa push, việc sửa thường đơn giản. Nếu đã push lên remote hoặc branch có người khác cùng dùng, bạn cần cẩn thận hơn để không làm lệch lịch sử chung.

Cần kiểm tra gì trước khi sửa?
Trước khi sửa, bạn cần biết branch hiện tại, commit hash, trạng thái working tree và commit đã push lên remote chưa. Bốn thông tin này quyết định bạn nên dùng reset, cherry-pick hay revert.
Chạy các lệnh sau:
git status # Xem repo có đang clean, merge, rebase hoặc còn file chưa commit không git branch --show-current # Xem bạn đang đứng ở branch nào git log --oneline --decorate -5 # Ghi lại hash commit vừa tạo git status -sb # Nếu thấy ahead origin/main 1, commit thường chưa push
Tài liệu git status cho biết lệnh này hiển thị trạng thái working tree và index, gồm file staged, unstaged, untracked và trạng thái branch với upstream [2]. Mình khuyên bạn không thao tác khi working tree còn thay đổi lẫn lộn, vì lúc đó reset hoặc switch có thể làm bạn khó phân biệt phần nào là commit sai, phần nào là code đang sửa dở.
Nếu bạn từng gặp tình huống commit nhầm file cùng lúc, hãy đọc thêm bài Git commit nhầm file. Hai lỗi này khác nhau: một bên sai branch, một bên sai nội dung commit.

Commit chưa push: cách chuyển sang branch đúng
Nếu commit chưa push và branch sai chỉ nằm trên máy bạn, cách an toàn là tạo branch đúng tại commit hiện tại, rồi đưa branch sai lùi về commit trước đó. Đây là tình huống dễ xử lý nhất.
Giả sử bạn commit nhầm vào main, nhưng commit đó thật ra thuộc feature/invoice.
Bước 1: Tạo branch đúng tại commit hiện tại
git switch -c feature/invoice # Tạo branch mới từ đúng commit vừa tạo
Theo tài liệu git switch, tùy chọn -c tạo branch mới và chuyển sang branch đó [1]. Lúc này commit nhầm đã nằm trên branch đúng.
Bước 2: Quay lại branch sai
git switch main
Bước 3: Đưa branch sai lùi lại một commit
git reset --hard HEAD~1 # Chỉ dùng khi chắc chắn commit cuối cùng là commit nhầm và chưa push
Tài liệu git reset giải thích rằng reset có thể di chuyển HEAD và tùy chế độ có thể thay đổi index, working tree [3]. Vì vậy --hard chỉ nên dùng khi working tree clean và bạn đã tạo branch đúng ở bước 1.
Kiểm tra lại:
git log --oneline --decorate -5 git switch feature/invoice git log --oneline --decorate -5
Nếu bạn thấy commit nằm trên feature/invoice và không còn trên main, xong rồi đấy!

Dùng cherry-pick khi muốn copy commit sang branch đúng
git cherry-pick phù hợp khi bạn muốn áp dụng một commit cụ thể sang branch đúng mà không cần tạo branch từ vị trí hiện tại. Cách này hữu ích nếu branch đúng đã tồn tại sẵn hoặc bạn cần lấy một commit trong nhiều commit.
Quy trình phổ biến:
git log --oneline -5 # Ví dụ commit nhầm là abc1234 git switch feature/invoice git cherry-pick abc1234 # Áp dụng thay đổi của commit đó vào branch đúng
Tài liệu Git mô tả git cherry-pick là thao tác áp dụng thay đổi từ commit đã có vào HEAD hiện tại [4]. Nói đơn giản: bạn đứng ở branch đúng, rồi lấy nội dung commit nhầm sang.
Sau khi cherry-pick xong, quay lại branch sai và xử lý commit cũ:
git switch main git reset --hard HEAD~1 # Chỉ làm nếu commit nhầm chưa push và là commit cuối cùng
Nếu cherry-pick báo conflict, quy trình resolve gần giống merge conflict: sửa file, chạy git add, rồi git cherry-pick --continue. Nếu chưa muốn xử lý, dùng git cherry-pick --abort. Bạn có thể xem thêm bài Git pull bị conflict để nắm cách đọc conflict markers.

Commit đã push: nên revert hay force push?
Nếu commit nhầm đã push lên remote, bạn cần ưu tiên bảo toàn lịch sử chung; với branch dùng chung, git revert thường an toàn hơn force push. Force push chỉ nên dùng khi bạn hiểu rõ tác động và team đã thống nhất.
Có hai tình huống:
- Branch cá nhân, chưa ai dựa vào: bạn có thể chuyển commit sang branch đúng, reset branch sai, rồi push với
--force-with-leasenếu team cho phép. - Branch chung như main, develop: nên tạo commit revert để đảo ngược thay đổi trên branch sai, sau đó cherry-pick commit sang branch đúng nếu cần.
Ví dụ branch chung:
git switch main git revert abc1234 # Tạo commit mới đảo ngược commit nhầm git switch feature/invoice git cherry-pick abc1234 # Đưa thay đổi sang branch đúng
Tài liệu git revert nêu rằng lệnh này tạo commit mới để đảo ngược thay đổi từ commit đã chọn, thay vì xóa commit khỏi history [5]. Đây là lý do revert hợp với branch đã publish.
Nếu bạn đang định force push lên branch chung, dừng lại một nhịp. Hãy kiểm tra branch protection, hỏi team và xem CI/CD có đang chạy từ branch đó không. Với website production, một force push thiếu kiểm soát có thể làm mất trace debug hoặc phá pull request đang mở.

Nếu có nhiều commit trên nhánh sai thì làm sao?
Nếu có nhiều commit liên tiếp trên nhánh sai, bạn nên tạo branch đúng tại commit mới nhất, rồi reset branch sai về điểm chung trước chuỗi commit đó. Đừng cherry-pick từng commit nếu toàn bộ chuỗi đều thuộc cùng một task.
Ví dụ bạn có 3 commit nhầm trên main:
git log --oneline --decorate -6 # fff3333 Thêm validate hóa đơn # eee2222 Thêm API xuất hóa đơn # ddd1111 Tạo service hóa đơn # aaa0000 Commit đúng cuối cùng của main
Cách xử lý nếu chưa push:
git switch -c feature/invoice # Branch đúng giữ cả 3 commit git switch main git reset --hard aaa0000 # Đưa main về commit đúng cuối cùng
Nếu đã push chuỗi commit lên remote, hãy cân nhắc revert theo range hoặc revert từng commit theo thứ tự phù hợp. Với lịch sử phức tạp, bạn có thể dùng Git reflog để kiểm tra lại các mốc HEAD trước khi sửa.
Bạn đang đọc bài viết thuộc chuyên mục Lập trình của VietnamTutor — nơi mình chia sẻ các workflow thực chiến để developer xử lý lỗi trong dự án thật, không chỉ học lệnh rời rạc.
Cách tránh commit nhầm branch lần sau
Cách tránh lỗi tốt nhất là hiển thị branch rõ trong terminal, kiểm tra branch trước commit và dùng branch riêng cho từng task. Một vài thói quen nhỏ giúp giảm rất nhiều lỗi lặp lại.
Checklist mình khuyên bạn dùng:
- Trước khi commit, chạy
git branch --show-currenthoặc nhìn prompt terminal. - Dùng tên branch rõ:
feature/invoice-export,hotfix/payment-timeout. - Không làm task mới trực tiếp trên
mainhoặcdevelop. - Commit nhỏ theo từng ý định để nếu nhầm branch thì dễ chuyển.
- Trước khi push, chạy
git log --oneline --decorate -5để kiểm tra commit nằm đúng branch.
Bảng chọn lệnh nhanh:
| Tình huống | Lệnh nên dùng | Lưu ý |
|---|---|---|
| Commit chưa push, là commit cuối | git switch -c rồi git reset --hard HEAD~1 | Tạo branch đúng trước khi reset |
| Branch đúng đã có sẵn | git cherry-pick <hash> | Có thể conflict nếu code lệch nhiều |
| Commit đã push lên branch chung | git revert <hash> | Không xóa lịch sử đã chia sẻ |
| Nhiều commit chưa push | Tạo branch đúng rồi reset về commit gốc | Ghi lại hash trước khi thao tác |
Tóm lại, git commit vào nhánh sai không đáng sợ nếu bạn dừng lại kiểm tra trước. Cách sửa tốt nhất là bảo toàn commit cần giữ, rồi mới làm sạch branch sai. Nếu bạn chưa chắc commit đã push hay chưa, hãy hỏi team hoặc tạo một branch backup trước khi chạy lệnh thay đổi lịch sử nhé.
Nguồn tham khảo
- Git documentation: git-switch
- Git documentation: git-status
- Git documentation: git-reset
- Git documentation: git-cherry-pick
- Git documentation: git-revert
- GitHub Docs: Dealing with non-fast-forward errors
Các câu hỏi thường gặp
Git commit vào nhánh sai có mất code không?
Thường là không mất code nếu bạn chưa chạy lệnh xóa thay đổi. Commit vẫn tồn tại trong repo local; việc cần làm là chuyển commit sang branch đúng rồi xử lý branch sai.
Commit nhầm branch chưa push thì nên dùng lệnh nào?
Bạn có thể dùng git switch -c branch-dung để tạo branch đúng tại commit hiện tại, sau đó quay lại branch sai và dùng git reset --hard HEAD~1 nếu commit nhầm là commit cuối cùng.
Khi nào nên dùng git cherry-pick?
Dùng git cherry-pick khi branch đúng đã tồn tại hoặc bạn chỉ muốn lấy một commit cụ thể từ branch sai sang branch đúng.
Commit nhầm đã push lên main thì có nên reset không?
Nếu main là branch chung, bạn nên tránh reset và force push nếu team chưa thống nhất. Cách an toàn hơn là dùng git revert để tạo commit đảo ngược.
Có nên tạo branch backup trước khi sửa không?
Có. Nếu bạn chưa chắc trạng thái repo, tạo branch backup từ commit hiện tại giúp bạn có đường lui trước khi reset, revert hoặc cherry-pick.
Bạn đã từng commit nhầm branch trong lúc đổi task gấp chưa? Nếu gặp case phức tạp hơn như đã push lên branch chung hoặc có nhiều commit xen kẽ, hãy để lại tình huống cụ thể để mình gợi ý hướng xử lý an toàn hơn.
