Tôi đang cố gắng để có hai chi nhánh với các tập tin nhị phân trong git - một "phát triển" và một "ổn định". Nhánh phát triển có thể có một số thay đổi của các tệp này trước khi tôi muốn "giải phóng" chúng vào nhánh ổn định (và nhánh ổn định có các tệp đó được đổi tên, trong trường hợp có liên quan).Git hợp nhất squash liên tục
Tôi có thể thực hiện kết hợp bình thường, hoạt động tốt, nhưng giữ lại quá nhiều lịch sử - khi kéo nhánh "ổn định", tất cả các cam kết trung gian từ nhánh "phát triển" cũng được kéo (vì chúng là commit của cha) . Nhưng chúng ta đang nói về các tệp nhị phân không có bất kỳ chiến lược hợp nhất hợp lý nào (ngoại trừ của chúng/của chúng ta), vì vậy lịch sử thực sự của các tệp trên nhánh phát triển là vô dụng. Khi tôi kéo chi nhánh "ổn định", tôi có được điều này:
X-------------------G stable / / a---b---c---d---e---f---g development
Bởi vì G có cha mẹ tại các chi nhánh phát triển, tôi nhận được toàn bộ lịch sử của chi nhánh phát triển (đối tượng dữ liệu cho c, d, e, f và g) trong kho lưu trữ của tôi, mà tôi không quan tâm (X giống như b, với một số đổi tên tệp được áp dụng).
Vì vậy, tôi đã cố gắng git merge --squash
thay đổi từ chi nhánh phát triển đến nhánh ổn định. Việc hợp nhất đầu tiên như vậy và cam kết đi OK, kết quả được như mong đợi (log thay đổi tốt đẹp trong thông điệp cam kết, không liên quan đến các chi nhánh phát triển):
X-------------------G stable / a---b---c---d---e---f---g development
Sau khi tôi kéo nhánh ổn định bị đè nén này, tôi có được điều này trong kho của tôi, đó là những gì tôi muốn:
a---b---X---G
Nhưng việc hợp nhất thứ hai thất bại (vì git không có cách nào để biết có bao nhiêu tôi sáp nhập đã và đã nhầm lẫn).
- Có thể bằng cách nào đó ghi lại quá trình hợp nhất mà không tạo "cam kết hợp nhất" với hai cha mẹ không?
- Hoặc, có thể yêu cầu git chỉ hợp nhất một "phạm vi" nhất định của các sửa đổi, như trong SVN không?
- Hoặc, có thể thực hiện việc hợp nhất thông thường mà không phải tải xuống tất cả các thay đổi từ nhánh khác khi kéo?
- Hoặc tôi có nên cung cấp trình điều khiển hợp nhất tùy chỉnh cho các tệp được đề cập không, chỉ cần đổi tên phiên bản "của chúng thành" của chúng tôi, qua đó giải quyết xung đột? Tôi vẫn sợ rằng
--squash
sẽ luôn cố gắng hợp nhất toàn bộ lịch sử, với cha mẹ chung, chỉ giải quyết được một nửa vấn đề của tôi.
Cập nhật: rebasing
Nếu tôi hiểu rebasing một cách chính xác, tôi sẽ kết thúc với điều này:
X stable / a---b---c---d---e---f---g development
nào được tôi tất cả các dữ liệu Tôi không quan tâm đến (c , d, e, f) và như một phần thưởng, tôi sẽ mất thông tin rằng b là một phiên bản ổn định trong chi nhánh.
Mỗi bản sửa đổi phát triển thêm khoảng 5MB vào kích thước kho lưu trữ (và đóng gói toàn bộ repo thu nhỏ chỉ khoảng 10%), nhánh "ổn định" gần như miễn phí (dữ liệu đã có sẵn). Tôi muốn kéo một bản sửa đổi mới từ nhánh ổn định để kéo chỉ 5MB mới, nhưng thay vì cập nhật từ X thành G tải xuống 25MB, bởi vì tôi bằng cách nào đó không thể nói rằng tôi không quan tâm đến nội dung của c, d , e và f.
Điều này có vẻ tuyệt vời, nhưng tôi không hiểu chính xác lý do tại sao cần tạo một nhánh tạm thời và sau đó đổi tên nó. Có phải vì bạn vẫn bị tách rời sau khi cam kết? –
@ kim-sullivan: "chính xác tại sao": khi bạn thực hiện cam kết trong ví dụ trên, nó di chuyển 'HEAD' nhưng không' ổn định 'để trỏ đến cam kết mới - đầu vẫn bị "tách" và ' stable' vẫn trỏ đến phiên bản trước (X, trong ví dụ ban đầu của bạn). Làm chi nhánh và đổi tên (thanh toán là tùy chọn về mặt kỹ thuật, mặc dù không có nó, bạn sẽ cần phải cung cấp cho các đối số cho 'git branch -M', và bạn vẫn sẽ được tách ra, có khả năng không mong muốn). đến J (theo câu trả lời). – lindes
Ngoài ra: Bạn có thể thấy chạy 'git log --graph --oneline --all --decorate' và' git status' tại mỗi điểm dọc theo chuỗi lệnh này để có thông tin. Và/hoặc xem nội dung của các tệp khác nhau trong .git /, có lẽ với 'grep. .git/HEAD .git/refs/heads/* ' – lindes