Cách hoàn nguyên một thư mục về một cam kết cụ thể bằng cách tạo một bản vá


97

Đây là lịch sử của tôi cho thư mục 'somefolder'

$ git log somefolder

commit 89cd
More changes to somefolder

commit ef47a
Updating somefolder and other stuff

commit e095
Bugs fixed in somefolder

Tôi muốn hoàn nguyên thư mục nào đó về cam kết "Lỗi đã được sửa trong thư mục nào đó".

Vì cam kết thứ hai liên quan đến các thay đổi bên ngoài thư mục nào đó, tôi không muốn hoàn nguyên cam kết này.

Tôi đoán cách an toàn nhất là tạo một khác biệt / bản vá giữa cam kết e095 và 89cd chỉ áp dụng cho một số thư mục, rồi áp dụng bản vá đó. Làm thế nào tôi có thể làm điều đó?

Câu trả lời:


155

Bạn có thể sử dụng git checkout để cập nhật kho lưu trữ của mình lên một trạng thái cụ thể.

git checkout e095 -- somefolder

Đối với câu hỏi của bạn về việc tạo ra sự khác biệt, điều đó cũng sẽ hoạt động. Chỉ cần tạo khác biệt để chuyển từ trạng thái hiện tại của bạn trở lại e095:

git diff 89cd..e095 -- somefolder

30
điều này không loại bỏ tập tin đã được thêm vào trong đó cam kết, sử dụng git reset e095 -- some/folderthay vì
shime

2
Từ git 2.22, bạn có thể sử dụng --no-overlayđể git checkoutcác tệp được theo dõi không nằm trong cam kết mà bạn đang kiểm tra sẽ bị xóa.
Mariusz Pawelski

53

Bạn có thể sử dụng git resetđể đặt lại chỉ mục cũng sẽ bao gồm việc xóa các tệp đã được thêm vào trong các lần cam kết gần đây hơn ( git checkoutbản thân nó không làm điều này):

git reset e095 -- somefolder

Tuy nhiên git reset, không cập nhật bản sao làm việc và --hardtùy chọn không hoạt động với các thư mục. Vì vậy, sau đó sử dụng git checkoutđể tạo bản sao làm việc giống như chỉ mục:

git checkout -- somefolder

và sau đó, nếu bạn cũng muốn xóa bất kỳ tệp nào đã thêm, bạn cũng cần thực hiện:

git clean -fd somefolder

câu trả lời này phù hợp với tôi khi thư mục bao gồm các tệp mới.
Yahoho

2
Câu trả lời này tốt hơn nhiều nếu bạn thực sự muốn có một bản chụp nhanh của kho lưu trữ tại thời điểm đó.
data Princess

Thực sự tốt hơn nhiều!
Alexis Pautrot
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.