2015-12-14 15 views
5

Các git checkout documentation nói:git checkout: ý nghĩa chi tiết của "họ" và "chúng ta"

--ours --theirs Khi kiểm tra ra đường dẫn từ các chỉ số, kiểm tra sân khấu # 2 (số của chúng tôi) hoặC# 3 (của chúng) cho đường dẫn chưa được nhấn.

Ý nghĩa của "giai đoạn # 2" và "giai đoạn # 3" trong khi hợp nhất, rebase và chọn cherry? Có cách nào để truy vấn đề tài "giai đoạn" trước khi chạy lệnh để đảm bảo rằng nó sẽ lấy phiên bản đúng không?

Trả lời

5

Đâ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 rebasegit 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.

3

Các Git documentation for merge (cũng như một vài nơi khác) giải thích rằng một tập tin chỉ mục hồ sơ lên ​​đến ba phiên bản, hoặc giai đoạn:

Đối với đường dẫn mâu thuẫn, các hồ sơ tập tin index lên đến ba phiên bản: giai đoạn 1 lưu trữ phiên bản từ tổ tiên chung, giai đoạn 2 từ HEAD và giai đoạn 3 từ MERGE_HEAD (bạn có thể kiểm tra các giai đoạn với git ls-files -u). Các tệp cây đang hoạt động chứa kết quả của chương trình "hợp nhất"; tức là kết quả hợp nhất 3 chiều với các điểm đánh dấu xung đột quen thuộc < < < === >>>.

Dưới đây là một sơ đồ hiển thị những gì ba giai đoạn đang ở trong một Git merge tiêu biểu:

Common Ancestor -> C1 --- C2   <- MERGE_HEAD (Stage 3) 
(Stage 1)    \ 
         --- C3 --- C4 <- HEAD (Stage 2) 

này giả định rằng các chi nhánh có HEAD được C4 đã được sáp nhập trở lại vào chi nhánh kết thúc bằng C2.

Theo các tiểu bang tài liệu, bạn thực sự có thể xem các giai đoạn bằng cách gõ:

git ls-files -u 
Các vấn đề liên quan