2016-06-30 14 views
5

Vì giá rẻ của nó, tôi sử dụng commit để giữ ảnh chụp nhanh WIP hàng ngày của mình. Vì vậy, lịch sử cam kết của tôi chứa nhiều cam kết chụp nhanh và một số cam kết chính được trộn lẫn với nhau.Cách thực hành tốt nhất để ghép vào NEXT cam kết trong git rebase -i?

Trước khi đẩy công việc của tôi đến kho lưu trữ từ xa, tôi có thể cảm thấy như làm sạch lịch sử của mình để chỉ chứa các cam kết chính bằng cách ghép ảnh chụp tiếp tục trực tiếp theo các cam kết chính. Thông tin ngày của các cam kết chính là quan trọng đối với tôi bởi vì nó nhớ lại tôi khi nào và những gì tôi đã thay đổi.

Sử dụng các lệnh squash/fixup trong git rebase -i có thể có một số trợ giúp nhưng chúng kết hợp với cam kết PREVIOUS và ngày tác giả của chúng không phải là những gì tôi muốn.

Việc sắp xếp lại các cam kết sau đó đè bẹp thường dẫn đến xung đột không cần thiết, đó cũng là điều tôi muốn tránh.

So. Thực hành tốt nhất để thỏa mãn ước muốn của tôi là gì?

[Cập nhật] 2016/07/03
Lấy cảm hứng từ câu trả lời torek, tôi đã đưa ra một giải pháp: sử dụng git rebase -i như thường lệ, thiết lập các mục tiêu cam kết rằng Tôi muốn cam kết trước đó để meld vào để edit, sau đó thực hiện git reset HEAD~n nơi n là số nhận xét trước đó mà tôi muốn kết hợp. Và cam kết những thay đổi melded với:

% git commit --amend --date "$(grep DATE .git/rebase-merge/author-script | cut -f2 -d '=')"

Sau đó, hoàn thành phần còn lại của công trình của git rebase --continue.

+2

Về cụm từ "ảnh chụp nhanh WIP hàng ngày": Tôi (và nhiều người khác) khuyên bạn nên [Commit sớm] (//blog.codinghorror.com/check-in-early-check-in-often/), [Commit thường xuyên] (// sethrobertson.github.io/GitBestPractices/#commit). Vào những ngày làm việc hiệu quả, tôi thường sẽ có * ít nhất * một tá hoặc hai cam kết. –

+0

Có, tôi đồng ý với những gì trang web nói. Tôi đã làm theo cách tương tự trước khi tôi bắt đầu làm việc cho một nhóm phát triển. –

Trả lời

2

Dưới đây là một cách: sử dụng rebase như bình thường. Đặt bố cục cho cam kết sửa lỗi hoặc bíp thành edit. Khi Git dừng để cho phép bạn chỉnh sửa bản sửa lỗi, hãy sử dụng git reset --soft HEAD^; git commit --amend --reset-author-date, nhưng lưu ý rằng điều này sử dụng ngày "ngay bây giờ". Để kiểm soát nhiều hơn, và lấy ngày từ squash/fixup, lấy ngày tác giả từ cam kết đó và sử dụng --date: có thể bạn sẽ muốn viết một kịch bản shell nhỏ để làm điều đó.

(Sử dụng git log --pretty=format:%ad --no-walk để trích xuất ngày từ cam kết hiện tại, trước bước git reset --soft HEAD^. Bạn có thể lưu văn bản tin nhắn cam kết hoặc thậm chí toàn bộ ID của cam kết: đặt lại mềm để lại cam kết trong kho lưu trữ , nơi nó được bảo vệ bởi cả rebase đang tiến hành và các reflog khác nhau, vì vậy bạn có thể trích xuất bất cứ điều gì bạn muốn từ nó sau này, cũng như trước đây. ở đây.)

Để quay lại nhiều hơn nữa, bạn có thể thực hiện nhiều lần khôi phục hoặc nhiều lần đổ bóng trong bản chỉnh sửa tương tác hoặc git reset --soft xa hơn HEAD^.

(tôi không bao giờ bận tâm với điều này: các tem ngày cụ thể dường như không phải là hữu ích ở đây.)

+0

Cảm ơn bạn đã trả lời. Tôi thấy rằng trong quá trình 'rebase' tương tác, thông tin dữ liệu của tác giả được giữ trong' .git/rebase-merge/author-script'. –

+0

Lưu ý rằng sự hiện diện và tên của '.git/rebase-merge', ít hơn bất kỳ tệp nào trong đó, là chi tiết triển khai: nó không tồn tại trong các phiên bản cũ của Git và có thể có tên khác trong một số hoạt động rebase (đặc biệt là không tương tác rebase sử dụng '.git/rebase-apply' hiện tại). Tất nhiên, nếu bạn luôn luôn làm một rebase tương tác, và nếu phiên bản Git của bạn không có tập tin đó, bạn có lẽ có thể dựa vào nội dung. Tuy nhiên, sẽ không an toàn hơn nếu giả định điều này. – torek

Các vấn đề liên quan