Cách giải quyết vấn đề merge và revert trong Git: Cách cherry-pick, tạo diff patch và rebase
Tình huống
Mình đã gặp một tình huống rắc rối với Git. Sau khi thực hiện một merge
cho code của mình, mình phát hiện ra một số lỗi. Để giải quyết, mình đã sử dụng lệnh revert
.
Tuy nhiên, khi mình thực hiện thay đổi trên một nhánh chức năng khác và cố gắng merge
lại, mọi thứ đã không diễn ra như mình mong đợi.
Những thay đổi mà mình đã thực hiện trên nhánh chức năng không được phản ánh đúng. Giờ đây, mình đang cố gắng tìm ra cách giải quyết vấn đề này.
Để giải quyết vấn đề này, mình chia sẻ có một số cách:
Cherry-pick các commit cần thiết
- Dùng
git log
trên nhánh chức năng của bạn để tìm các commit mà bạn muốn áp dụng vàodevelop
. - Check out nhánh
develop
. - Sử dụng lệnh
git cherry-pick [commit-id]
để áp dụng từng commit mà bạn muốn từ nhánh chức năng.
Tạo một diff patch và áp dụng nó
- Trên nhánh chức năng của bạn, tạo một diff của những thay đổi bạn muốn áp dụng:
git diff develop..feature-branch > changes.patch
. - Check out nhánh
develop
. - Áp dụng patch:
git apply < changes.patch
.
Rebase và giải quyết xung đột thủ công nếu cần
- Trên nhánh chức năng của bạn, thực hiện:
git rebase develop
. - Giải quyết bất kỳ xung đột nào mà rebase gây ra.
- Sau khi rebase xong và giải quyết xung đột, bạn có thể thực hiện merge nhánh chức năng vào
develop
.
Tạo một branch mới và cherry-pick hoặc rebase nhánh chức năng của bạn lên nhánh mới này
Điều này giữ cho lịch sử của nhánh develop
không thay đổi và cho phép bạn làm việc trên một "sân chơi" mới mà không lo lắng về các vấn đề có thể phát sinh trên nhánh develop
gốc.
Tùy thuộc vào tình hình cụ thể và bạn muốn giữ lịch sử như thế nào, bạn có thể chọn một trong những phương án trên.