Git: Cách thay đổi nhánh cha trong Git

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Đặt con trỏ git parent thành một parent khác với git rebase --onto.

Giả sử vài ngày trước ta đã tạo nhánh mới. Ta đã thực hiện một số commit ở đó, nhưng sau một thời gian, ta nhận thấy rằng ta đã tạo nhánh mới này từ nhánh cha sai. Ta đã tạo nó từ một số nhánh tính năng không phải từ bản gốc. Vậy ta nên làm gì trong tình huống này? Ta cần hợp nhất nhánh hiện tại của mình trước khi hợp nhất nhánh tính năng khác này và ta không muốn thêm các commit không cần thiết vào nhánh chính. Làm thế nào ta có thể xử lý nó?

Vấn đề mà ta đã mô tả ở trên, có thể được giải quyết theo ít nhất hai cách. Cách đầu tiên dễ hiểu, nhưng hơi tốn thời gian. Chúng ta có thể tạo một nhánh mới với nhánh master cha và sử dụng lệnh git cherry-pick để di chuyển từng commit từ nhánh này sang nhánh khác. Giải pháp này ổn, khi bạn không có nhiều lần xác nhận, vì đối với mỗi lần xác nhận, bạn cần thực hiện git cherry-pick. Còn một điều bất tiện nữa. Ở nhiều công ty, có quy trình làm việc về cách chức năng mới sẽ chuyển đến nhánh chính. Các nhóm sử dụng các yêu cầu kéo/hợp nhất để xem xét mã. Trong trường hợp khi bạn cần tạo một nhánh mới, bạn cũng cần tạo yêu cầu kéo/hợp nhất mới. Bạn cần yêu cầu ai đó trong nhóm của mình kiểm tra lại mã của bạn và phê duyệt mã đó. Giải pháp này sẽ phát sinh công việc bổ sung để làm.

Có một giải pháp khác. Chúng ta có thể sử dụng lệnh git rebase --onto. Nó có thể làm chính xác những gì chúng ta cần. Thay thế nhánh cha cũ bằng nhánh cha mới. Trong trường hợp của chúng ta là nhánh master. Khi này nhánh của ta trông giống như sau:

A---B---C---D  master
            \
              E---F---G  feature-branch
                      \
                        H---I---J current-feature-branch (HEAD)

Và đây là những gì chúng ta muốn đạt được:

A---B---C---D  master
            |\
            | E---F---G  feature-branch
            |
             \
              H'---I'---J' current-feature-branch (HEAD)

Để thay thế nhánh cha bằng master, chúng ta cần vào nhánh current-feature-branch và thực hiện:

git rebase --onto master feature-branch

Vậy là xong. Ta có nhánh current-feature-branch dựa trên nhánh master, không giống như trước đây dựa trên feature-branch.

Cuối cùng, ta muốn nói thêm hai điều ở đây. Đầu tiên, nếu bạn muốn chuyển từ cha này sang cha khác thì lệnh sẽ giống như sau:

git rebase --onto new-parent old-parent

Vì vậy, ngay bây giờ bạn có thể điều chỉnh nó cho phù hợp với hoàn cảnh của mình.

Thứ hai, như bạn thấy lược đồ ở trên, sau khi sử dụng thì git rebase --onto thì chúng ta không có chính xác các commit giống như trước đây. Mã giống nhau, nhưng số SHA (ví dụ: bạn biết số nhận dạng cam kết 2d4698b) cho mỗi lần xác nhận là khác nhau. Mọi thứ sẽ ổn thôi, khi bạn làm việc một mình trên nhánh mà bạn muốn thực hiện thủ thuật thì đây là tình huống xảy ra. Trong trường hợp những người khác cũng làm việc trên nhánh này, lệnh này có thể gây ra sự cố. Họ sẽ có các commit khác nhau sau đó bạn có và sau đó là trên kho lưu trữ từ xa. Điều này luôn đòi hỏi những rắc rối. Hãy ghi nhớ điều đó trước khi bạn sử dụng git rebase --onto trong giải pháp này.

« Trước: Git Bash
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!