Version đơn giản:Sử dụng git filter-branch để loại bỏ các cam kết bằng tin nhắn cam kết của họ
Nếu tôi có một chi nhánh "foo-555", với một loạt các cam kết với những thông điệp như:
- foo 555: blah
- foo 123: blah blah
- foo 555: blah blah blah
- foo 321: blahblah
và tôi muốn xóa tất cả các cam kết không bắt đầu bằng "foo 555:", có cách nào để thực hiện điều đó bằng cách sử dụng git filter-branch (hoặc bất kỳ công cụ nào khác cho vấn đề đó) không?
Version gốc (chi tiết):
Trong kho của chúng tôi, chúng tôi có một quy ước, nơi mọi cam kết thông báo bắt đầu với một khuôn mẫu nhất định:
Redmine # 555: SOME_MESSAGE
Chúng tôi cũng làm một chút rebasing để mang lại những thay đổi của chi nhánh phát hành tiềm năng cho một chi nhánh của vấn đề cụ thể. Nói cách khác, tôi có thể có nhánh "foo-555", nhưng trước khi tôi kết hợp nó vào nhánh "pre-release", tôi cần có bất kỳ cam kết nào trước khi phát hành có foo-555 không (vì vậy mà foo- 555 có thể nhanh chóng chuyển tiếp hợp nhất vào trước khi phát hành). Tuy nhiên, vì đôi khi phát hành đôi khi thay đổi, đôi khi chúng tôi sẽ đưa ra các tình huống mà bạn mang theo cam kết từ bản phát hành trước, nhưng sau đó cam kết đó sẽ bị xóa khỏi bản phát hành trước. Thật dễ dàng để xác định các cam kết đến từ bản phát hành trước, vì số từ thông điệp cam kết của họ sẽ không khớp với số chi nhánh; ví dụ: nếu tôi thấy "Redmine # 123: ..." trong chi nhánh foo-555 của mình, tôi biết rằng đó không phải là cam kết từ chi nhánh của tôi.
Vì vậy, bây giờ là câu hỏi: Tôi muốn xóa tất cả các cam kết "không thuộc về" đối với chi nhánh; nói cách khác, bất kỳ cam kết rằng:
- là trong ngành foo-555 của tôi, nhưng không phải trong ngành trước khi phát hành (pre-release..foo-555)
- Có một thông điệp rằng doesn' cam kết t bắt đầu bằng "Redmine # 555"
nhưng tất nhiên "555" sẽ thay đổi từ chi nhánh này sang chi nhánh khác. Có cách nào để sử dụng bộ lọc-chi nhánh (hoặc bất kỳ công cụ khác) để thực hiện điều này? Hiện tại cách duy nhất tôi có thể nhìn thấy để làm điều đó là làm một rebase tương tác ("git rebase -i") và tự xóa tất cả các commit "xấu".
thể bạn không cherry chọn các cam kết mà bạn muốn vào ngành có liên quan? –
Chúng tôi * có thể *, nhưng giả sử tôi có 10 555 commit và 10 commit khác; Tôi sẽ phải thiết lập lại và sau đó làm 10 lựa chọn anh đào (so với một lệnh lọc-chi nhánh ... nếu một điều như vậy là có thể). – machineghost