Tại sao Stit cam kết cần hai cha mẹ?


8

Tại sao Stit cam kết cần hai cha mẹ?

Trong Hướng dẫn về Git của Hacker , tôi thấy mô hình tinh thần này cho các stash:

nhập mô tả hình ảnh ở đây

Hướng dẫn cho tôi biết rằng stash @ {0} cần cả A và B là cha mẹ. Tại sao? Tại sao stash không chỉ vào B, loại bỏ nhu cầu về C? Tôi nghĩ rằng tôi đang thiếu một cái gì đó trong sự hiểu biết Git của tôi.

Câu trả lời:


6

Bởi vì hai thứ được cất giấu: nội dung được lập chỉ mục và nội dung worktree. Cả hai đều có nguồn gốc từ cam kết thanh toán. Khi bật stash, cả hai có thể được khôi phục.


Vì vậy, những thay đổi trong B đã được cam kết nhưng không được đẩy và những thay đổi trong C không được cam kết cũng không được đẩy. Có đúng không?
Patrick Szalapski

Không, nội dung trong B đã được thêm vào hay còn gọi là dàn dựng, nhưng không được cam kết; nội dung trong C là trong worktree của bạn.
jthill

Vẫn không chắc chắn về C, sau đó: nội dung ở đây khác với B là gì?
Patrick Szalapski

Bất cứ điều gì bạn thay đổi nhưng không git add.
jthill

1
Những thay đổi làm việc của bạn (được theo dõi, nhưng không được thêm vào) chắc chắn nên được giữ lại, đó là ý định dập tắt những thay đổi đó phải không? Sau đó, bạn quyết định bật stash hoặc loại bỏ nó, hoặc bỏ nó.
vgoff

2

Nó không phải luôn luôn cần hai cha mẹ, đôi khi nó thực sự cần ba.

Sơ đồ sau minh họa kịch bản đơn giản nhất, với hai cha mẹ:

       .----S
      /    /
-----H----I

Ở đây Hđại diện cho cái đầu hiện tại của bạn, là nhánh chính trong ví dụ của bạn và hai xác nhận con được tạo khi bạn chạy git-stash.

Đầu tiên là I, đại diện cho chỉ số tại thời điểm đâm. Nói cách khác, cam kết này chứa các thay đổi đã được dàn dựng trước khi đâm. Nó có một cha mẹ duy nhất, đó là cam kết mà CHÍNH chỉ ra. Thứ hai ( S) là cam kết stash, chứa các tệp đã được sửa đổi trước khi lưu. Nó có hai cam kết vì những thay đổi của nó có thể nằm trên đầu của những người trong tôi và những người ở H, nghĩa là, chúng có thể ảnh hưởng đến các tệp được dàn dựng hay không.

Kịch bản khác xảy ra khi bạn cung cấp công -utắc cho stashlệnh, thông báo cho Git cũng lưu trữ các tệp không bị theo dõi. Biểu đồ bây giờ trở thành:

       .----S----.
      /    /    /
-----H----I    U

UCam kết mới có tất cả các thay đổi được giới thiệu bởi các tệp không bị theo dõi. Lưu ý rằng cam kết này sẽ có bất kỳ cha mẹ nào vì các tệp đó không tồn tại trong hiện tại HEAD. Các stash cam kết Shiện nay có ba phụ huynh: H, IUvà bây giờ khi áp dụng các stash cam Git cũng sẽ áp dụng những thay đổi được theo dõi.

Bạn có thể thấy những sơ đồ và khác biệt rõ ràng bằng cách chạy một cái gì đó như git log --graph stash@{0}hoặc gitk stash@{0}.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.