Đây là những tài liệu (mặc dù không phải tất cả những gì rõ ràng, tôi nghĩ) trong the gitrevisions
documentation:
Một đại tràng, tùy theo sau là một số giai đoạn (0-3) và dấu hai chấm, tiếp theo là một con đường, tên một đối tượng blob trong chỉ mục tại đường dẫn đã cho. Một số giai đoạn bị thiếu (và dấu hai chấm sau nó) đặt tên cho mục nhập giai đoạn 0. Trong quá trình hợp nhất, giai đoạn 1 là tổ tiên chung, giai đoạn 2 là phiên bản của nhánh đích (thường là nhánh hiện tại) và giai đoạn 3 là phiên bản từ nhánh đang được hợp nhất.
Để làm như vậy, bạn cần thêm kiến thức về cách hoạt động của git rebase
và git cherry-pick
.
Lựa chọn anh đào bình thường được xác định rõ: "của chúng tôi" là phiên bản HEAD
, tức là nhánh bạn (và vẫn còn) bật, trong khi "của họ" là cam kết bạn đang tích cực chọn. Khi bạn chọn một cam kết duy nhất, tất cả đều khá rõ ràng: giai đoạn # 1 là tổ tiên chung, giai đoạn # 2 là phiên bản từ đầu nhánh hiện tại của bạn và giai đoạn # 3 là phiên bản bạn đang chọn.
Nếu bạn chọn một loạt các cam kết, điều này vẫn đúng, nó thực sự lặp đi lặp lại. Ví dụ: giả sử bạn chọn ba cam kết. Git chỉ đơn giản là ba một-tại-một-thời gian. Trong lần đầu tiên anh đào chọn, sân khấu số 2 là mũi của nhánh của bạn, và sân khấu số 3 là phiên bản từ lần commit đầu tiên được chọn anh đào. Một khi cam kết kết thúc lựa chọn anh đào, git thực hiện một cam kết mới, tiến lên đầu nhánh của bạn. Sau đó, trong lần chọn thứ hai, sân khấu số 2 là mũi của nhánh bạn, đó là cam kết lần đầu tiên anh đào hái, và sân khấu số 3 là phiên bản từ lần commit thứ hai được chọn. Điều này lặp lại một lần nữa cho cam kết cuối cùng. Mỗi lần, giai đoạn # 3 là phiên bản "của họ".
Rebase, tuy nhiên, hơi phức tạp một chút. Nội bộ, nó bắt đầu bằng cách đưa bạn vào một nhánh mới, ẩn danh (một "HEAD tách rời"). Sau đó, nó chạy git cherry-pick
để chọn từng cam kết từ chi nhánh ban đầu của bạn. Điều này có nghĩa là "chúng ta" là phiên bản HEAD tách rời, trong khi "của chúng" là phiên bản từ nhánh ban đầu của bạn. Cũng giống như lựa chọn anh đào, điều này lặp lại lặp đi lặp lại cho mỗi cam kết được chọn (nghĩa là như vậy trong trường hợp của một rebase tương tác, nơi bạn chỉnh sửa các dòng pick
). Khi quá trình rebase kết thúc, git chỉ đơn giản là xáo trộn nhãn nhánh xung quanh, để nhánh mới ẩn danh mà bạn vừa tạo ra là mã của bạn.
Tóm lại, bạn có thể nghĩ rằng việc rebase là "đảo ngược cài đặt của chúng ta/của họ" —nhưng đây là một cường điệu. Có thể chính xác hơn khi nói rằng giai đoạn 2 là mã melded in mới và giai đoạn 3 là mã cũ của bạn.