làm cách nào để chuyển đến một cam kết cụ thể trong lịch sử của phụ repo?
Nếu bạn đã đè bẹp các cam kết, thì không có cách nào, vì squash thua các cam kết khác nhau.
Nếu không, với một cây con không bị đè bẹp, bạn có thể điều hướng đến bất kỳ cam kết nào của cây con với cùng một băm mà nó có trong kho gốc mà từ đó cây con được tạo.
git subtree
(không có bí) thực sự thêm vào kho lưu trữ của bạn tất cả các cam kết có liên quan từ kho lưu trữ bên ngoài dưới dạng cây độc lập trong repo hiện tại của bạn. Khi bạn thực hiện một số git subtree add
, bạn có thể nhận thấy rằng một số cam kết được thêm vào (tất cả các cam kết ban đầu từ repo bên ngoài) và cam kết hợp nhất cuối cùng di chuyển nội dung từ cây con đó đến thư mục đã cho được chỉ định với tùy chọn --prefix
. Tóm lại, nó kiểm tra một chi nhánh từ một kho lưu trữ không liên quan khác và sau đó kết hợp nó vào nhánh hiện tại của bạn bằng cách di chuyển tất cả nội dung đó vào một thư mục con đã cho. Tất cả điều này có nghĩa là lịch sử của repo bên ngoài có sẵn cho bạn, bạn có thể kiểm tra nó giống như vậy, hãy nhớ rằng bằng cách là một cây hoàn toàn khác, thanh toán này có thể sẽ sửa đổi TẤT CẢ nội dung của không gian làm việc của bạn , các dự án lớn có thể kéo dài.
này đưa chúng ta đến thứ hai:
Làm thế nào để anh đào-chọn một cam kết từ một tiểu repo vào repo chính của tôi sử dụng git cây con?
Có vẻ như không có "cherrypicking" hiện tại được hỗ trợ bởi chính mình git subtree
. Nhưng với những tác động của tất cả những điều sau đây có thể được thực hiện.
# move yourself to the subtree commit of your choice
git checkout <subtree-hash>
# fetch commits from the subtree repository, to have available the commit you want
# to cherry pick.
git fetch <path-to-remote>
# cherry pick the hash you want
git cherry-pick <cherry-hash>
# move back to your original branch
git checkout <your-branch>
# subtree merge your cherry pick (using the previous HEAD),
# so that it gets moved to the correct location specified by prefix.
git subtree merge --prefix <subtree-prefix> [email protected]{1}
# Since you probably fetched more commits that you needed from
# the remote, you might want to clean those that where not needed
git gc
Đi vào xem xét rằng sau khi làm điều này nếu bạn cố gắng git subtree pull
thành cây con của bạn một bản cập nhật, và nó bao gồm các cam kết bạn cherry chọn, bạn sẽ kết thúc với một cuộc xung đột vì bạn sẽ có hai sự thay đổi trong cùng một vị trí .
Một tùy chọn đơn giản hơn, nếu bạn có quyền truy cập vào kho lưu trữ subtree gốc, là chọn anh đào tại đó trong chi nhánh và sau đó chỉ cần git subtree pull
nhánh cụ thể đó.
Tôi đã nghiên cứu điều này bằng cách sử dụng 'git phiên bản 1.8.1' đã bao gồm lệnh subtree. – LopSae