nói lịch sử của bạn là
$ git lola
* 6473d7f (master) Update
| * 9bcfa7e (HEAD, topic) Munge a, b, and c
| * 99af942 Munge b and c
| * 8383e2c Munge a and b
|/
* d1363f4 Baseline
Lưu ý: lola
là bí danh không chuẩn nhưng hữu ích.
Các cam kết đã sửa đổi ba tệp khác nhau.
$ git log --decorate=short --pretty=oneline --name-status topic
9bcfa7e946a92c226ad50ce430a9e4ae55b32490 (HEAD, topic)
M a
M b
M c
99af942dbb922effcad8a72e96bec9ee9afcc437 Munge b and c
M b
M c
8383e2c8d6092550fec13d3c888c037b3a68af15 Munge a and b
M a
M b
d1363f4fba67d94999b269b51bdb50a8a68ba27a Baseline
A a
A b
A c
Những thay đổi nộp b
là những người bạn muốn giữ lại, và bạn muốn loại bỏ tất cả những thay đổi để a
và c
. Một cách để thực hiện điều này là với git filter-branch
.
$ git checkout -b tmp topic
Switched to a new branch 'tmp'
$ git merge-base topic master
d1363f4fba67d94999b269b51bdb50a8a68ba27a
$ git filter-branch --tree-filter 'git checkout d1363f -- a c' master..tmp
Rewrite 8383e2c8d6092550fec13d3c888c037b3a68af15 (1/3)
Rewrite 99af942dbb922effcad8a72e96bec9ee9afcc437 (2/3)
Rewrite 9bcfa7e946a92c226ad50ce430a9e4ae55b32490 (3/3)
Ref 'refs/heads/tmp' was rewritten
Bộ lọc cây ở trên để kiểm tra các cam kết trong phạm vi được đặt tên và khôi phục các file a
và c
đến nội dung tại căn cứ “ merge, ” có nghĩa là, các cam kết mà tại đó topic
nhánh xa master
.
Hiện tại tmp
có tất cả topic
’ s thay đổi thành b
nhưng không có thay đổi đối với bất kỳ tệp nào khác.
$ git log --decorate --pretty=oneline --name-status tmp
9ee7e2bd2f380cc338b0264686bcd6f071eb1087 (HEAD, tmp) Munge a, b, and c
M b
226c22f150af1ddc1f9adc19f97fc4f220851ada Munge b and c
M b
45e706f7b22c37ee2025ee0d04c651135e7b31cd Munge a and b
M b
d1363f4fba67d94999b269b51bdb50a8a68ba27a Baseline
A a
A b
A c
Như một biện pháp an toàn, git filter-branch
lưu trữ bản sao lưu gốc của bạn. Khi bạn ’ lại hài lòng với những thay đổi của bạn và muốn xóa các bản sao lưu tmp
, chạy
$ git update-ref -d refs/original/refs/heads/tmp
1 xuất sắc trả lời.Sử dụng bộ lọc-chi nhánh là một công cụ tuyệt vời như vậy một khi bạn quấn đầu của bạn xung quanh nó. – ralphtheninja
Rất nhiều thứ tuyệt vời ở đây tôi vẫn đang tiêu hóa. 'nhật ký - tên-trạng thái' thật tuyệt. –
Buh. Tôi làm theo tất cả các bước của câu trả lời tuyệt vời này, và mọi thứ đã đi bơi cho đến cuối nhánh lọc. "CẢNH BÁO: Ref 'refs/heads/tmp' không thay đổi". Kiểm tra lịch sử, các sửa đổi tập tin vẫn còn đó, và không ai trong số các id cam kết đã thay đổi (theo như tôi có thể nói), mặc dù git báo cáo "viết lại" tất cả. Hmm. –