Git commit vào nhánh sai: cách chuyển an toàn

Nội dung

Bài viết hướng dẫn xử lý git commit vào nhánh sai theo từng tình huống: commit chưa push, đã push, nhiều commit liên tiếp hoặc branch có người khác cùng dùng.

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 resetgit 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.

Git commit vào nhánh sai và cách chuyển sang branch đúng
Git commit vào nhánh sai nên được xử lý theo trạng thái đã push hay chưa push.

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 revert hoặc trao đổi với team trước khi rewrite history.
  • Trước mọi thao tác, hãy chạy git status và 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.

Sơ đồ commit nằm trên nhánh sai trong Git
Commit nhầm branch thường là vấn đề vị trí commit trong lịch sử branch.

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.

Checklist kiểm tra trước khi sửa git commit vào nhánh sai
Kiểm tra trước giúp bạn chọn đúng lệnh và tránh sửa sai lần hai.

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!

Quy trình tạo branch đúng rồi reset branch sai trong Git
Với commit chưa push, tạo branch đúng trước rồi mới reset branch sai.

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.

Git cherry-pick chuyển commit từ nhánh sai sang nhánh đúng
Cherry-pick giúp lấy một commit cụ thể sang branch đúng.

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-lease nế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ở.

So sánh revert và force push khi git commit vào nhánh sai đã push
Commit đã push cần xử lý theo mức độ branch đang được chia sẻ.

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-current hoặ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 main hoặc develop.
  • 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ốngLệnh nên dùngLưu ý
Commit chưa push, là commit cuốigit switch -c rồi git reset --hard HEAD~1Tạo branch đúng trước khi reset
Branch đúng đã có sẵngit cherry-pick <hash>Có thể conflict nếu code lệch nhiều
Commit đã push lên branch chunggit revert <hash>Không xóa lịch sử đã chia sẻ
Nhiều commit chưa pushTạo branch đúng rồi reset về commit gốcGhi 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

  1. Git documentation: git-switch
  2. Git documentation: git-status
  3. Git documentation: git-reset
  4. Git documentation: git-cherry-pick
  5. Git documentation: git-revert
  6. 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.

Tú Anh

Cây bút chính tại VietnamTutor

Bài viết cùng chuyên mục

Git reset revert restore: chọn lệnh đúng

Bài viết so sánh git reset, git revert và git restore theo mục đích sử dụng: sửa staging area, khôi phục file, undo commit chưa push

TypeScript cho website doanh nghiệp: API, form và lỗi

TypeScript cho website doanh nghiệp đáng dùng khi bạn cần kiểm soát API contract, form schema, CMS payload và cấu hình môi trường. Bài này giúp

React Server Components performance: khi nào nên dùng?

React Server Components performance không phải phép màu. Bài này giúp bạn biết khi nào RSC giảm JavaScript thật, khi nào làm kiến trúc phức tạp

Git commit nhầm file: bỏ file khỏi commit an toàn

Bài viết hướng dẫn xử lý git commit nhầm file theo từng tình huống: chưa commit, đã commit chưa push, đã push lên remote, hoặc lỡ

Git reflog: khôi phục commit đã mất an toàn

Bài viết hướng dẫn dùng git reflog để khôi phục commit đã mất sau reset, rebase, amend hoặc xóa nhánh. Bạn sẽ biết cách đọc reflog,

Git pull bị conflict: cách sửa không mất code

Bài viết hướng dẫn cách xử lý git pull bị conflict theo từng bước: kiểm tra trạng thái, sửa file xung đột, test lại và hoàn

Next.js production performance: chọn SSR, SSG, ISR hay Edge

Bài viết giúp developer và tech lead chọn cách render phù hợp để tối ưu Next.js production performance mà không làm kiến trúc phức tạp quá

Nâng cấp Laravel 13: Checklist 10 bước cần kiểm tra

Hướng dẫn nâng cấp Laravel 13 chi tiết với checklist 10 bước. Từ kiểm tra PHP 8.3, cập nhật dependencies, đến xử lý lỗi thường gặp

Hardening Laravel production: Checklist bảo mật cần làm

Checklist hardening Laravel production toàn diện. Từ cấu hình server, database, SSL đến security headers, rate limiting và monitoring.

Authentication và authorization trong Laravel: Cách phân biệt

Hướng dẫn chi tiết cách xây dựng hệ thống Authentication (xác thực) và Authorization (phân quyền) trong Laravel với Breeze, Fortify, Sanctum, Policies và Gates.

Bảo mật Laravel: 10 lỗi phổ biến và cách phòng tránh

Hướng dẫn 10 lỗi bảo mật phổ biến nhất trong Laravel và cách phòng tránh hiệu quả. Từ XSS, SQL injection đến authentication vulnerabilities.

Migration PHP Attributes Laravel 13: Hướng Dẫn Chi Tiết

Cách chuyển đổi từ protected properties sang PHP Attributes trong Laravel 13 với hướng dẫn từng bước và code examples chi tiết.