2011-09-14 29 views
7

Giả sử tôi có một thư mục chứa hàng trăm tệp. Tôi sửa đổi một số trong số họ, nhưng sau đó tôi nhận ra những thay đổi của tôi là xấu. Nếu tôi làm:Làm cách nào để tôi chỉ có thể khôi phục các tệp đã sửa đổi trên thanh toán git?

git checkout whole_folder 

Sau đó mọi thứ được kiểm tra lại và tôi phải biên dịch lại mọi thứ. Có cách nào để thực hiện thanh toán chỉ ảnh hưởng đến các tệp đã sửa đổi hoặc tôi có cần chạy riêng lẻ checkout trên mỗi tệp không?

+0

Nếu bạn làm 'git checkout - ' (phiên bản nhẹ an toàn của 'git checkout whole_folder') timestamps vẫn tương tự cho các tệp không bị thay đổi bởi lệnh đó. Điều đó có nghĩa là quá trình xây dựng của bạn vẫn chỉ nên xây dựng lại các tệp mà nó tối thiểu nghĩ rằng nó cần dựa trên mtimes. –

+0

Bạn có chắc chắn rằng git kiểm tra tất cả mọi thứ? IIRC git cố gắng hết sức để chỉ kiểm tra các tệp được sửa đổi và không chạm vào bất kỳ thứ gì khác khi bạn thực hiện git checkout - whole_folder hoặc git reset --hard HEAD. – holygeek

+0

Vì vậy, tôi nên làm 'git checkout - whole_folder'? – Geo

Trả lời

13

Hãy thử điều này:

$ git checkout `git ls-files -m` 

danh sách -m chỉ các tập tin sửa đổi.

+0

Không có giải pháp đa nền tảng có sẵn không? Đôi khi tôi sử dụng Windows từ trình bao tiêu chuẩn 'cmd.exe'. – Geo

2

gì bạn đang làm là đúng, nhưng bạn có thể muốn thêm một disambiguating -- chỉ trong trường hợp bạn có một tên thư mục đó là giống như một tên chi nhánh, ví dụ:

git checkout -- whole_folder 

git sẽ chỉ cập nhật dấu thời gian trên các tệp mà thực sự cần phải thay đổi, vì vậy nếu công cụ xây dựng dựa trên sự phụ thuộc của bạn sử dụng đúng mtimes, số lượng tệp tối thiểu phải được xây dựng lại an toàn. Nếu bạn thấy hành vi khác nhau, đó sẽ là một lỗi.

2

Nhưng

git checkout -- $(git ls-files -m) 

cũng checksout các tập tin đã bị xóa.

Nếu bạn muốn kiểm chỉ các tập tin sửa đổi tác phẩm này với tôi:

git checkout -- $(git status -uno | grep --colour=never '#' | awk '{ print $2 $3 }' | grep --colour=never ^modified: | cut -c10-) 
+0

Cảm ơn @TheFox. Nó gần như hoạt động. Nó phải sửa đổi lệnh một chút để nó hoạt động cho tôi. Đây là dòng tôi đã sử dụng: '' 'git checkout - $ (git status | grep modified: | cut -c14-)' '' – user1029978

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