Thỉnh thoảng chúng tôi có một thượng nguồn đã khôi phục/tua lại nhánh mà chúng tôi đang 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 hạ lưu.
Sự 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 tôi sẽ sử dụng một từ xa gọi xuất xứ và một chi nhánh gọi là foo trong tất cả các ví dụ):
# 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 chỉ thực hiện điều này:
git fetch origin
git rebase origin/foo
Nhưng điều đó sẽ không giúp đỡ nếu rebase thượng nguồn liên quan đến bất kỳ "squashin g "(có nghĩa là các bản vá-id của các cam kết đã thay đổi, không chỉ là thứ tự của chúng).
Nghĩa là git pull --rebase phải làm nhiều hơn một chút. Đây là một giải thích về những gì nó làm và làm thế nào.
Hãy nói rằng điểm khởi đầu 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 đầu trang của "foo" của riêng bạn:
a---b---c---d---e---p---q---r (foo)
Trong khi đó, trong một cơn chống lại cơn thịnh nộ xã hội, người duy trì thượng lưu đã không chỉ rebased "foo" của mình, ông thậm chí còn sử dụng một squash hoặc hai. Chuỗi cam kết của anh bây giờ trông giống như sau:
a---b+c---d+e---f (origin/foo)
Việc kéo git 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" trên cái kia, sẽ xung đột. (Và tương tự với d, e, và d + e).
gì git pull --rebase
không, trong trường hợp này, là:
git fetch origin
git rebase --onto origin/foo e foo
này mang đến cho bạn:
Liên quan: [Khi nào tôi nên sử dụng git pull --rebase?] (Http://stackoverflow.com/q/2472254/456814). –
Bản sao có thể có của [git pull VS git fetch git rebase] (http://stackoverflow.com/questions/3357122/git-pull-vs-git-fetch-git-rebase) –
Liên kết hữu ích: https: // www. atlassian.com/git/tutorials/rewriting-history/git-rebase –