2012-03-17 30 views
11

Tôi có một nhánh lộn xộn với 20 cam kết trở lên và tôi đang chuẩn bị hợp nhất trở lại làm chủ. Tôi đã loại bỏ nó khỏi chủ, và nhìn kỹ hơn, tôi nhận ra rằng có những tập tin được sửa đổi theo những cách hoàn toàn không liên quan đến nhánh này, và chưa sẵn sàng để được cam kết. Những thay đổi đối với các tệp đó không bị giới hạn trong các cam kết cụ thể.Git: cách tốt nhất để xóa tất cả các thay đổi khỏi một tệp nhất định cho một chi nhánh

Vì vậy, về cơ bản, tôi không muốn bất kỳ điều gì liên quan đến các tệp đó sẽ được đưa vào nhánh này nếu có thể. Có cách nào tốt để giải quyết vấn đề này không? Vị trí của tôi quay trở lại # 1 rõ ràng là chỉ sao chép qua bản sao mới nhất của từng tệp đó rồi cam kết. Nhưng sau đó lịch sử vẫn sẽ có những thay đổi, và các vị thần Git sẽ cau mày với tôi.

Vị trí quay lại số 2 là làm tương tự, sau đó làm tròn toàn bộ lịch sử chi nhánh xuống một lần commit.

Bất kỳ cải tiến nào về những điều này?

Trả lời

16

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 để ac. 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 ac đế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
+3

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

+0

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. –

+0

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. –

0

Bạn có thể thực hiện các thay đổi để xóa chức năng dưới dạng cam kết mới, sau đó tạo bản vá từ đó. Làm rebasing bạn/cán nát hoặc bất cứ điều gì bạn cần để chuẩn bị sáp nhập trở lại để làm chủ, sau đó khi bạn muốn thêm chức năng mới trở lại, bạn có thể áp dụng các bản vá trong chế độ ngược với

git apply -R 

Note Tôi đã không bao giờ làm điều này ... nhưng nó sẽ làm việc theo lý thuyết tôi nghĩ. :-)

0

Để kiểm lên một phiên bản cụ thể mà bạn có thể làm git checkout <sha1> <file> nơi sha1 là băm SHA1 độc đáo của phiên bản mà bạn muốn tập tin được trong.

+0

Đúng vậy, đó là về cơ bản dự phòng của tôi vị trí # 1 ... –

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