Tất cả các câu trả lời cho đến nay không giải quyết được mối quan tâm kéo dài:
Có một phương pháp hiệu quả khi có hàng trăm phiên bản sau khi bị xóa?
Các bước tiếp theo, nhưng để tham khảo, hãy giả sử lịch sử sau đây:
[master] -> [hundreds-of-commits-including-merges] -> [C] -> [R] -> [B]
C : cam kết chỉ sau khi cam kết được xóa (sạch)
R : Cam kết được xóa
B : cam kết ngay trước cam kết bị xóa (cơ sở)
Do ràng buộc "hàng trăm sửa đổi", tôi giả sử các điều kiện tiên quyết sau:
- có một số cam kết đáng xấu hổ mà bạn muốn không bao giờ tồn tại
- có các cam kết tiếp theo ZERO thực sự phụ thuộc vào cam kết xấu hổ đó (không có xung đột khi hoàn nguyên)
- bạn không quan tâm rằng bạn sẽ được liệt kê là 'Người ủy thác' trong số hàng trăm cam kết can thiệp ('Tác giả' sẽ được giữ nguyên)
- bạn chưa bao giờ chia sẻ kho lưu trữ
- hoặc bạn thực sự có đủ ảnh hưởng đối với tất cả những người đã từng nhân bản lịch sử với cam kết trong đó để thuyết phục họ sử dụng lịch sử mới của bạn
- và bạn không quan tâm đến việc viết lại lịch sử
Đây là một tập hợp các ràng buộc khá hạn chế, nhưng có một câu trả lời thú vị thực sự hoạt động trong trường hợp góc này.
Dưới đây là các bước:
git branch base B
git branch remove-me R
git branch save
git rebase --preserve-merges --onto base remove-me
Nếu thực sự không có xung đột, thì điều này sẽ tiếp tục mà không bị gián đoạn. Nếu có mâu thuẫn, bạn có thể giải quyết chúng và rebase --continue
hoặc quyết định chỉ sống với sự bối rối vàrebase --abort
.
Bây giờ bạn nên ở trên master
đó không còn cam kết R trong đó. Các save
điểm chi nhánh đến nơi mà bạn đã trước đó, trong trường hợp bạn muốn hòa giải.
Bạn muốn sắp xếp việc chuyển nhượng của người khác sang lịch sử mới như thế nào là tùy thuộc vào bạn. Bạn sẽ cần phải được làm quen với stash
, reset --hard
, và cherry-pick
. Và bạn có thể xóa base
, remove-me
và save
chi nhánh