[Series Làm Chủ Fork Git] Bài 3: Làm Chủ Advanced Git – Kéo Thả Interactive Rebase, Cherry-Pick Và Quay Ngược Thời Gian
Chào các bạn, chào mừng các bạn đã quay trở lại với series làm chủ Fork. Ở Bài 2, chúng ta đã giải quyết gọn gàng những tác vụ daily như Branch, Stash và đối mặt với Conflict một cách bình tĩnh
Hôm nay, ở Bài 3, chúng ta sẽ cùng nhau bước vào thế giới của những "phép thuật" Git nâng cao. Đã bao giờ bạn nhìn vào lịch sử dự án và ước rằng:
- Giá như mình gộp được 5 cái commit "fix bug", "lại fix bug", "fix bug lần cuối" thành 1 commit duy nhất cho sạch lịch sử trước khi tạo Pull Request?
- Giá như mình có thể bốc một commit tính năng cực ngon từ nhánh của đồng nghiệp qua nhánh của mình mà không cần merge cả cái nhánh rối rắm của họ?
Trên Git CLI, những lệnh này (như git rebase -i) đi kèm với một giao diện Vim rất dễ gõ nhầm và gây hoang mang. Nhưng với Fork, mọi thứ chỉ là Kéo và Thả. Hãy cùng mình khám phá nhé
1. Interactive Rebase – "Nặn" Lịch Sử Commit Bằng Kéo Thả
Interactive Rebase là tính năng "ăn tiền" nhất của Fork. Nó cho phép bạn viết lại lịch sử commit của chính mình (chỉ nên làm ở Local branch chưa push lên server nhé) để trông chuyên nghiệp và sạch đẹp hơn.
Tình huống: Bạn có 4 commit liên tiếp:
- feat: add login layout
- fix: fix css login
- typo: fix spelling
- feat: tích hợp API login Bạn muốn gộp commit số 2 và 3 vào commit số 1, đồng thời đổi tên commit số 4 cho chuẩn convention.
Cách làm siêu chuẩn với Fork:
- Tại Commit Graph, xác định commit nằm ngay trước chuỗi commit bạn muốn sửa.
- Chuột phải vào commit đó -> Chọn Interactive Rebase from here...
- Một giao diện trực quan xuất hiện liệt kê danh sách các commit của bạn. Tại đây bạn có thể:
- Squash (Gộp commit): Kéo commit số 2 thả chồng lên commit số 1. Hoặc click chọn commit số 2 và bấm nút Squash phía dưới. Nội dung của commit 2 sẽ bị gộp vào commit 1. Làm tương tự với commit 3.
- Reword (Đổi tên commit): Chọn commit số 4, bấm Reword (hoặc nhấn phím cách) rồi nhập lại Message mới sạch đẹp hơn (ví dụ:
feat(auth): integrate login API). - Drop (Xóa commit): Nếu có một commit nào đó chứa code thừa, bạn chọn nó và bấm Drop để xóa hẳn khỏi lịch sử.
- Reorder (Thay đổi thứ tự): Bạn hoàn toàn có thể kéo một commit lên trước hoặc xuống sau một commit khác một cách dễ dàng.
- Sau khi vừa mắt, nhấn Start Rebase. Fork sẽ tự động chạy toàn bộ các lệnh ngầm cho bạn trong vài giây. Kết quả là một lịch sử commit đẹp không tì vết!
2. Cherry-Pick – "Bốc" Commit Chuẩn Xác
Tình huống: Đồng nghiệp của bạn đang làm ở nhánh feature/payment và họ vô tình fix được một bug bảo mật rất nghiêm trọng ở commit mang mã a1b2c3d. Bạn rất cần cái fix đó cho nhánh feature/cart của mình, nhưng bạn không muốn merge cả nhánh payment vì bên đó còn quá nhiều code dang dở chưa test.
Cherry-pick chính là hành động "hái quả cherry ngon nhất" đó mang về cây của mình. Với Fork:
- Đảm bảo bạn đang checkout ở nhánh của bạn (
feature/cart). - Nhìn vào Sidebar, click vào nhánh của đồng nghiệp (
feature/payment) để xem lịch sử commit của họ (hoặc tìm trực tiếp trên Graph). - Tìm đúng commit fix bug
a1b2c3d. - Chuột phải vào commit đó -> Chọn Cherry-Pick... (hoặc chỉ cần kéo commit đó thả thẳng vào nhánh của bạn ở Sidebar).
- Fork sẽ hỏi bạn có muốn commit ngay lập tức không. Nhấn xác nhận, và thế là đoạn code fix bug đã nằm gọn gàng trong nhánh của bạn mà không kéo theo bất kỳ file "rác" nào khác.
3. Revert Commit – Quay Ngược Thời Gian An Toàn
Khi bạn phát hiện ra một commit đã push lên server cách đây 3 ngày gây lỗi hệ thống, tuyệt đối không được dùng lệnh Reset vì nó sẽ làm mất lịch sử code của người khác và gây conflict nghiêm trọng cho cả team khi pull về.
Giải pháp chuẩn doanh nghiệp là Revert. Lệnh này sẽ tạo ra một commit mới có nội dung hoàn toàn trái ngược với commit lỗi để triệt tiêu nó.
- Cách làm: Bạn chỉ cần tìm đến commit bị lỗi trên Graph -> Chuột phải -> Chọn Revert Commit....
- Fork sẽ tự động sinh ra một commit mới với message mặc định
Revert"tên_commit_lỗi". Bạn chỉ việc nhấn Push lên server. Hệ thống lập tức hoạt động bình thường trở lại, lịch sử Git của team vẫn an toàn và không ai bị ảnh hưởng.
4. Phân Biệt Nhanh: Soft Reset vs Hard Reset
Đôi khi bạn muốn xóa bỏ các commit ở máy local để làm lại từ đầu. Fork cung cấp cho bạn tính năng Reset khi chuột phải vào một commit bất kỳ, nhưng hãy cẩn thận với 2 tùy chọn này:
| Tùy chọn | Hành động của Fork | Khi nào nên dùng? |
|---|---|---|
| Soft Reset | Xóa commit nhưng giữ lại toàn bộ code bạn đã viết vào mục Local Changes. | Khi bạn muốn gom nhiều commit lại để viết lại message mới theo cách thủ công |
| Hard Reset | Xóa sạch sành sanh cả commit lẫn code trong máy, đưa dự án về đúng trạng thái của commit đó. | Khi bạn code thử nghiệm bị fail hoàn toàn và muốn xóa sạch để làm lại từ đầu. (Cẩn thận: Mất code là không cứu được đâu nhé!). |
Tạm kết Bài 3
Đến đây, bạn đã chính thức tốt nghiệp khóa học Git nâng cao với Fork. Khả năng làm chủ Interactive Rebase và Cherry-pick bằng giao diện kéo thả trực quan sẽ giúp bạn tiết kiệm hàng giờ đồng hồ dọn dẹp source code và phối hợp với team mượt mà hơn rất nhiều.
Ở Bài 4 (Bài cuối của series), chúng ta sẽ tối ưu hóa Fork lên mức tối đa: Cách phân quyền quản lý nhiều tài khoản GitHub/GitLab cùng lúc, cấu hình Custom Commands (Phím tắt tự chế), và các mẹo tăng tốc tối đa hiệu suất làm việc.
Đừng quên nhấn Upvote bài viết này trên Viblo và để lại thảo luận nếu bạn có pha "xử lý cồng kềnh" nào với Rebase cần mình trợ giúp nhé!
All rights reserved