2010-06-17 33 views
18

Có cách nào để xóa tất cả các cam kết trước một cam kết được chỉ định và sử dụng cam kết đó làm ký tự ban đầu không?Xóa cam kết trước cam kết cụ thể

+0

Tôi biết tôi đã xem hướng dẫn ở đâu đó để làm điều gì đó như thế này ... Nó cho thấy cách bạn có thể giữ một repo lịch sử kết thúc tại cam kết X, và sau đó cam kết X lên đến HEAD và tạo một repo mới từ họ, với chú thích trên X về cách truy cập vào kho lưu trữ lịch sử. Tôi không thể tìm thấy nó ngay bây giờ, nhưng có thể. – Daenyth

Trả lời

16

Hãy nói rằng mới lâu đời nhất cam kết của băm là X và chúng ta có thể sử dụng "oldroot" và "newroot" tạm thời:

git checkout -b oldroot X 
TREE=`git write-tree` 
COMMIT=`echo "Killed history" | git commit-tree "$TREE"` 
git checkout -b newroot "$COMMIT" 
git rebase --onto newroot oldroot master 
# repeat for other branches than master that should use the new initial commit 
git checkout master 
git branch -D oldroot 
git branch -D newroot 
git gC# WARNING: if everything's done right, this will actually delete your history from the repo! 

Điều đó sẽ tạo ra một 'newroot' cam kết với nội dung tương tự như 'oldroot' cam kết, nhưng không có cha mẹ. Sau đó, nó sẽ hồi sinh tất cả các nhánh khác trên gốc mới, mà nên có trong lịch sử của tất cả chúng.

CHỈNH SỬA: đã kiểm tra và cố định; hơi muộn, tinh chế một chút

+2

Lưu ý rằng "Lịch sử bị giết" trở thành thông báo cam kết mới cho lần commit đầu tiên. Nếu bạn muốn một cái gì đó khác, như tin nhắn ban đầu ví dụ, chỉ cần ống nó trong đó. –

0

Các giải pháp dễ dàng hơn sẽ, xem xét ban đầu chi nhánh của bạn có cam kết chính và bạn đã làm một cam kết đầu tiên, bây giờ bạn cũng đã một cam kết thứ hai trên đầu trang của đầu tiên. Vì vậy, bạn có một cái gì đó như:

main->first->second 

Bây giờ bạn muốn có thứ hai trên đầu trang của chính chứ không phải trên đầu trang của đầu tiên. Một cái gì đó như:

main->second->first or main->second 

Bạn chỉ có thể làm,

git rebase -i main 

này sẽ cung cấp cho bạn một vỏ tương tác, nơi bạn có thể sắp xếp lại thứ tự của các cam kết hoặc loại bỏ bất kỳ cam kết của sự lựa chọn của bạn.

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