2012-12-07 35 views
12

Tôi đang gặp khó khăn trong việc nắm bắt cách tôi có thể sử dụng rebase/revert để thực hiện việc này.Xóa tất cả các cam kết trong một chi nhánh sau khi cam kết nhất định

Tôi đang làm việc trên chi nhánh master và sau một cam kết nhất định phần mềm của tôi ngừng hoạt động. Tôi không muốn mất những thay đổi được thực hiện vào thời điểm đó và tôi đã bị áp lực về thời gian để đạt được mốc quan trọng vì vậy tôi đã quay lại một số cam kết với git checkout và tạo một chi nhánh mới có tên là working và bắt đầu đẩy tất cả thay đổi của tôi ở đó. Sau đó tôi nhận ra rằng những thay đổi này (được thực hiện trên chi nhánh master) là không cần thiết. Bây giờ tôi muốn quay trở lại chi nhánh chính của tôi và xóa tất cả các cam kết sau khi cam kết tôi đã sử dụng để tạo chi nhánh working của mình và sau đó hợp nhất chi nhánh working của mình với chi nhánh master.

Tôi đã tạo một hình ảnh với trình chỉnh sửa ảnh trực tuyến để thử và giải thích những gì tôi đang cố gắng làm. Tôi hy vọng nó giúp:

screen shot of bitbucket

Tôi muốn giữ lại tất cả mọi thứ sau 5cb967f. thoát khỏi tất cả mọi thứ giữa 5cb967f và a0c1de2 (không bao gồm những)

+0

Các cam kết không cần thiết trên bản gốc đã được xuất bản chưa hoặc chúng chỉ có trong kho lưu trữ riêng của bạn? –

+0

chúng được xuất bản. Tôi không ngại viết lại lịch sử. Cam kết mới nhất trong nhánh 'working' của tôi là những gì tôi cần từ bây giờ. Tôi sẽ không "thanh toán" vào cam kết trước 5cb967f – Xecure

+0

Bạn có phải là người duy nhất làm việc trên điều này hoặc có người khác có khả năng đã kéo các cam kết mà bạn muốn xóa không? – R0MANARMY

Trả lời

11

Bạn có hai lựa chọn:

lịch sử Rewrite (phá hoại)

Bạn có thể sử dụng git-rebase để viết lại lịch sử, ommiting những cam kết. Bạn có thể chạy một rebase tương tác. Từ mô tả của bạn, tôi không chắc chắn chính xác những gì bạn có trong masterworking, nhưng tôi giả sử tất cả lịch sử (mong muốn và không mong muốn) đều có mặt ở đó.

git checkout master 
    git rebase -i a0c1de2 

Tại thời điểm này, $EDITOR bạn sẽ bật lên với một danh sách các cam kết từ a0c1de2 đến HEAD của master. Bạn có thể xóa các dòng tương ứng với c460070..a3cb10e để xóa các dòng đó khỏi lịch sử.

Lịch sử của bạn sẽ được viết lại cục bộ. Nếu bạn cố gắng đẩy thay đổi này, nó sẽ là bản cập nhật không nhanh về phía trước.

Hoàn nguyên, bảo tồn lịch sử (không phá hủy)

NẾU bạn muốn giữ lại lịch sử, bạn có thể trở lại một chuỗi các cam kết:

git checkout master 
git revert c460070..a3cb10e 

này sẽ tạo ra 7 cam kết mới, mỗi hoàn nguyên các thay đổi trong các cam kết không mong muốn này, theo thứ tự.

0

Nội dung nào đó về đồ họa lịch sử là không hợp lệ. Going by the ngữ đánh dấu văn bản trong nó, những gì bạn muốn chỉ đơn giản là

$ git branch -f master working 

bởi vì không có bất kỳ hậu working -base cam kết trên tổng thể mà bạn muốn giữ.

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