Đôi khi chúng ta có một dòng ngược dòng / khởi động lại một nhánh mà chúng ta phụ thuộc vào. Đây có thể là một vấn đề lớn - gây ra xung đột lộn xộn cho chúng ta nếu chúng ta xuôi dòng.
Điều kỳ diệu là git pull --rebase
Một git pull bình thường là, nói một cách lỏng lẻo, một cái gì đó như thế này (chúng ta sẽ sử dụng một nguồn gốc được gọi là từ xa và một nhánh được gọi là foo trong tất cả các ví dụ này):
# assume current checked out branch is "foo"
git fetch origin
git merge origin/foo
Thoạt nhìn, bạn có thể nghĩ rằng một git pull --rebase thực hiện điều này:
git fetch origin
git rebase origin/foo
Nhưng điều đó sẽ không giúp ích gì nếu cuộc nổi loạn ngược dòng liên quan đến bất kỳ sự "đè bẹp" nào (có nghĩa là các bản vá lỗi của các xác nhận đã thay đổi, không chỉ là thứ tự của chúng).
Điều đó có nghĩa là git pull --rebase phải làm nhiều hơn thế một chút. Đây là một lời giải thích về những gì nó làm và làm thế nào.
Giả sử điểm xuất phát của bạn là thế này:
a---b---c---d---e (origin/foo) (also your local "foo")
Thời gian trôi qua, và bạn đã thực hiện một số cam kết trên "foo" của riêng bạn:
a---b---c---d---e---p---q---r (foo)
Trong khi đó, trong một cơn thịnh nộ chống lại xã hội, người duy trì thượng nguồn không chỉ chống lại "foo" của mình, anh ta thậm chí còn sử dụng một hoặc hai quả bí. Chuỗi cam kết của anh ấy bây giờ trông như thế này:
a---b+c---d+e---f (origin/foo)
Một git kéo vào thời điểm này sẽ dẫn đến hỗn loạn. Ngay cả một git lấy; git rebase origin / foo sẽ không cắt nó, bởi vì cam kết "b" và "c" ở một bên và cam kết "b + c" ở bên kia, sẽ xung đột. (Và tương tự với d, e và d + e).
Có gì git pull --rebase
không, trong trường hợp này, đó là:
git fetch origin
git rebase --onto origin/foo e foo
Điều này mang lại cho bạn: