Rebasing là một quy trình để áp dụng lại các commit trên một nhánh nào đó. Nó được sử dụng để áp dụng một chuỗi các commit từ các nhánh khác nhau thành một commit cuối cùng. Nó là một thay thế của lệnh hợp nhất git. Nó là một quá trình hợp nhất tuyến tính.
Trong Git, thuật ngữ rebase được gọi là quá trình di chuyển hoặc kết hợp một chuỗi các commit thành một commit cơ sở mới. Rebasing rất có lợi và nó hình dung quá trình trong môi trường của quy trình làm việc phân nhánh tính năng.
Bạn nên xem lại nhánh của mình trước khi hợp nhất nó.
Nói chung, nó là một sự thay thế của lệnh hợp nhất. Hợp nhất luôn là một bản ghi thay đổi về phía trước. So sánh, rebase là một công cụ viết lại lịch sử hấp dẫn bằng git. Nó hợp nhất các commit khác nhau từng cái một.
Giả sử bạn đã thực hiện ba lần commit trong nhánh chính và ba lần trong nhánh test có tên nhánh khác của bạn. Nếu bạn hợp nhất điều này, thì nó sẽ hợp nhất tất cả các commit trong một thời gian. Nhưng nếu bạn rebase lại nó, thì nó sẽ được hợp nhất theo cách tuyến tính. Hãy xem xét hình ảnh dưới đây:
Hình ảnh trên mô tả cách hoạt động của git rebase. Ba commit của nhánh chính được hợp nhất tuyến tính với các commit của nhánh kiểm tra.
Hợp nhất là cách đơn giản nhất để tích hợp các nhánh. Nó thực hiện hợp nhất ba chiều giữa hai commit nhánh mới nhất.
Nội dung chính
1. Làm thế nào để Rebase
Khi bạn thực hiện một số commit trên một nhánh tính năng (nhánh thử nghiệm) và một số trong nhánh chính. Bạn có thể rebase lại bất kỳ nhánh nào trong số này. Sử dụng lệnh git log để theo dõi các thay đổi (lịch sử commit). Kiểm tra nhánh mong muốn mà bạn muốn rebase lại. Bây giờ thực hiện lệnh rebase như sau:
Cú pháp:
git rebase < tên nhánh >
Nếu có một số xung đột trong nhánh, hãy giải quyết chúng và thực hiện các lệnh dưới đây để tiếp tục thay đổi:
git status
Nó được sử dụng để kiểm tra trạng thái,
git rebase --continue
Lệnh trên được sử dụng để tiếp tục với các thay đổi bạn đã thực hiện. Nếu bạn muốn bỏ qua thay đổi, bạn có thể bỏ qua như sau:
git rebase --skip
Khi hoàn thành việc phục hồi. Đẩy kho lưu trữ về nguồn gốc(origin). Hãy xem xét ví dụ dưới đây để hiểu lệnh git merge.
Giả sử rằng bạn có một nhánh nói test2 mà bạn đang làm việc. Bây giờ bạn đang ở trên nhánh test2 và đã thực hiện một số thay đổi trong file newfile5.txt của dự án .
Thêm file này vào kho lưu trữ:
git add newfile5.txt
Bây giờ, commit các thay đổi. Sử dụng lệnh dưới đây:
git commit -m "new commit for test2 branch."
Đầu ra sẽ giống như sau:
Chuyển nhánh thành master:
git checkout master
Đầu ra:
Bây giờ bạn đang ở trên nhánh chính. Newfile.txt cho biết tôi đã thêm các thay đổi vào file của mình . Lệnh dưới đây được sử dụng để thêm file vào kho lưu trữ.
git add newfile.txt
Bây giờ commit file cho các thay đổi:
git commit -m "new commit made on the master branch."
Đầu ra:
Để kiểm tra lịch sử nhật ký, hãy thực hiện lệnh dưới đây.
git log --oneline
Đầu ra:
Như chúng ta có thể thấy trong lịch sử nhật ký, có một commit mới trong nhánh chính. Nếu tôi muốn rebase lại nhánh test2 của mình, tôi phải làm gì? Xem kịch bản nhánh rebase bên dưới:
2. Nhánh Rebase
Nếu chúng ta có nhiều commit từ các nhánh khác nhau và muốn hợp nhất nó thành một. Để làm như vậy, chúng ta có hai lựa chọn hoặc có thể hợp nhất hoặc rebase lại nó. Nó thì tốt để rebase lại nhánh của bạn.
Từ ví dụ trên, chúng ta đã commit với nhánh chính và muốn rebase lại nó trên nhánh test2. Hãy xem các lệnh dưới đây:
git checkout test2
Lệnh này sẽ chuyển bạn trên nhánh test2 từ nhánh chính.
Đầu ra:
Switched to branch ‘test2.’
Bây giờ bạn đang ở trên nhánh test2. Do đó, bạn có thể rebase lại nhánh test2 với nhánh chính. Xem lệnh dưới đây:
git rebase master
Lệnh này sẽ rebase lại nhánh test2 và sẽ hiển thị là Đang áp dụng: commit mới trên nhánh test2 . Hãy xem xét đầu ra dưới đây:
Đầu ra:
3. Git Interactive Rebase
Git tạo điều kiện với Interactive Rebase; nó là một công cụ mạnh cho phép thực hiện nhiều thao tác khác nhau như chỉnh sửa, viết lại, sắp xếp lại, v.v. trên các commit hiện có. Interactive Rebase chỉ có thể được vận hành trên nhánh hiện đã checkout. Do đó, hãy đặt nhánh HEAD tại local của bạn ở thanh bên.
Git tương tác rebase có thể được gọi bằng lệnh rebase, chỉ cần nhập -i cùng với lệnh rebase. Ở đây ‘ i ‘ là viết tắt của tương tác. Cú pháp của lệnh này được đưa ra dưới đây:
Cú pháp:
git rebase -i
Nó sẽ liệt kê tất cả các tùy chọn tương tác có sẵn.
Đầu ra:
Sau đầu ra nhất định, nó sẽ mở một trình soạn thảo với các tùy chọn có sẵn. Hãy xem xét đầu ra dưới đây:
Đầu ra:
Khi chúng ta thực hiện lệnh rebase tương tác, nó sẽ mở trình soạn thảo văn bản mặc định của bạn với đầu ra ở trên.
Các tùy chọn nó chứa được liệt kê bên dưới:
- Chọn(Pick)
- Ghi lại(Reword)
- Biên tập(Edit)
- Sự đè(Squash)
- Sửa chữa(Fixup)
- Exec(Exec)
- Phá vỡ(Break)
- Rơi vãi(Drop)
- Nhãn(Label)
- Cài lại(Reset)
- Hợp nhất(Merge)
Các tùy chọn trên thực hiện các tác vụ cụ thể của chúng với git-rebase. Hãy hiểu ngắn gọn từng tùy chọn này.
Chọn (-p):
Pick có nghĩa là commit được bao gồm. Thứ tự của các commit phụ thuộc vào thứ tự của các lệnh chọn trong quá trình rebase. Nếu bạn không muốn thêm commit, bạn phải xóa toàn bộ dòng.
Ghi lại (-r):
Khẩu lệnh khá giống với lệnh pick. Tùy chọn từ khóa đã tạm dừng quá trình rebase và tạo cơ hội thay đổi thông báo commit. Nó không ảnh hưởng đến bất kỳ thay đổi nào được thực hiện bởi commit.
Chỉnh sửa (-e):
Tùy chọn chỉnh sửa cho phép sửa đổi commit. Các phương tiện sửa đổi, commit có thể được thêm vào hoặc thay đổi hoàn toàn. Chúng ta cũng có thể thực hiện các commit bổ sung trước khi lệnh rebase tiếp tục. Nó cho phép chúng ta chia một commit lớn thành một commit nhỏ hơn; hơn nữa, chúng ta có thể xóa các thay đổi sai được thực hiện trong một commit.
Ghi đè (-s):
Tùy chọn Ghi đè cho phép bạn kết hợp hai hoặc nhiều commit thành một commit duy nhất. Nó cũng cho phép chúng ta viết một thông báo commit mới để mô tả các thay đổi.
Sửa lỗi (-f):
Nó khá giống với lệnh Ghi đè(Squash). Nó đã loại bỏ thông điệp của commit được hợp nhất. Thông báo commit cũ hơn được sử dụng để mô tả cả hai thay đổi.
Exec (-x):
Tùy chọn thực thi cho phép bạn chạy các lệnh shell tùy ý đối với một commit.
Ngắt (-b):
Quyền chọn break dừng rebase tại vị trí vừa phải. Nó sẽ tiếp tục phục hồi sau đó với lệnh ‘ git rebase –continue ‘.
Thả (-d):
Tùy chọn thả được sử dụng để xóa commit.
Nhãn (-l):
Tùy chọn nhãn được sử dụng để đánh dấu vị trí đầu hiện tại bằng tên.
Đặt lại (-t):
Tùy chọn đặt lại được sử dụng để đặt lại với nhãn nào đó.
Git Merge so với Rebase
Đó là một câu hỏi khó hiểu phổ biến nhất đối với người dùng git rằng khi nào thì sử dụng lệnh merge và khi nào thì sử dụng rebase. Cả hai lệnh đều tương tự nhau và cả hai đều được sử dụng để hợp nhất các commit được thực hiện bởi các nhánh khác nhau của kho lưu trữ.
Việc khôi phục không được khuyến khích trong nhánh rebase vì quá trình khôi phục sẽ tạo ra các kho lưu trữ không nhất quán. Đối với các cá nhân, việc phục hồi có thể hữu ích hơn việc hợp nhất. Nếu bạn muốn xem toàn bộ lịch sử, bạn nên sử dụng hợp nhất. Hợp nhất theo dõi toàn bộ lịch sử của các commit, trong khi rebase viết lại lịch sử mới.
Lệnh Git rebase được cho là một sự thay thế của hợp nhất. Tuy nhiên, chúng có một số điểm khác biệt chính:
Git Merge | Git Rebase |
Hợp nhất tạo ra một commit cuối cùng khi hợp nhất. | Git rebase không tạo bất kỳ commit nào khi phục hồi. |
Nó kết hợp tất cả các commit thành một commit duy nhất. | Nó tạo ra một lộ trình commit tuyến tính. |
Nó tạo ra một lịch sử đồ họa có thể hơi phức tạp để hiểu. | Nó tạo ra một lịch sử tuyến tính có thể dễ dàng hiểu được. |
Nó là an toàn để hợp nhất hai nhánh. | Git “rebase” xử lý các hoạt động nghiêm trọng. |
Việc hợp nhất có thể được thực hiện trên cả nhánh công cộng và tư nhân. | Đó là một lựa chọn sai lầm khi sử dụng phục hồi trên các nhánh công cộng. |
Hợp nhất tích hợp nội dung của nhánh tính năng với nhánh chính. Vì vậy, nhánh chính được thay đổi và lịch sử nhánh tính năng vẫn nhất quán. | Việc khôi phục chi nhánh chính có thể ảnh hưởng đến chi nhánh tính năng. |
Hợp nhất và bảo tồn lịch sử. | Rebasing viết lại lịch sử. |
Git merge trình bày tất cả các xung đột cùng một lúc. | Git rebase lần lượt trình bày các xung đột. |
Cài ứng dụng cafedev để dễ dàng cập nhật tin và học lập trình mọi lúc mọi nơi tại đây.
Tài liệu từ cafedev:
- Full series tự học Git từ cơ bản tới nâng cao tại đây nha.
- Ebook về Git tại đây.
- Các nguồn kiến thức MIỄN PHÍ VÔ GIÁ từ cafedev tại đây
Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:
Chào thân ái và quyết thắng!