2009-04-21 26 views
78

Có lệnh nào cho phép bạn hoàn tác một phần các thay đổi đối với tệp (hoặc tệp) trong thư mục làm việc không?Chọn lọc hoàn nguyên hoặc kiểm tra các thay đổi đối với tệp trong Git?

Giả sử bạn đã chỉnh sửa tệp nhiều nhưng bạn nhận ra rằng bạn muốn hoàn tác một số thay đổi về trạng thái đã cam kết, chứ không phải các thay đổi khác.

Tôi đang hình dung một tùy chọn cho git checkout hoạt động rất giống như git add -p, tức là nó đi qua hunk tệp theo hunk và hỏi xem bạn có muốn giữ nó hay không.

Trả lời

74

Bạn có thể sử dụng

git add -p <path> 

đến giai đoạn các khối mà bạn muốn giữ lại trong một tập tin cụ thể, sau đó

git checkout -- <path> 

hủy các thay đổi cây làm việc mà bạn không muốn giữ bằng cách kiểm tra phiên bản của tệp.

Cuối cùng, bạn có thể sử dụng

git reset -- <path> 

để phục hồi các phiên bản dàn dựng của tập tin lên phiên bản cam kết gần đây hầu hết các tập tin để lại cho bạn với những thay đổi của bạn unstaged.

+0

Tôi nghĩ rằng đây là những gì tôi đang tìm kiếm cảm ơn –

+0

Đối với trường hợp sử dụng đơn giản này, mọi hệ thống kiểm soát phiên bản khác chỉ gọi là "hoàn nguyên", tại sao lệnh Git lại tối nghĩa? –

+5

@Jan Lệnh 'revert' của hệ thống kiểm soát phiên bản khác có cho phép bạn chọn thay đổi nào trong tệp được hoàn nguyên không?Thực sự yêu cầu, vì tôi chỉ có kinh nghiệm với CVS và Git. Trong Git, 'git checkout - path/to/file' là một lệnh duy nhất có thể thay đổi tất cả các thay đổi trong tệp đó, nhưng điều này không giống như ở trên. – spacemanaki

8

git checkout $file hoàn nguyên trạng thái của tệp $file thành trạng thái đã cam kết cuối cùng. Tôi nghĩ bạn có thể sử dụng git checkout SHA-1 -- $file để hoàn nguyên tệp về cam kết được xác định bởi SHA-1.

+1

vâng, không chính xác những gì tôi muốn, vì tôi muốn giữ một số thay đổi tôi đã thực hiện trong tệp và hoàn nguyên những thay đổi khác –

1

Bạn cần quay lại bao nhiêu lần commit và chọn? Nếu nó chỉ là một, có thể mất một chi nhánh ngay trước khi nó, kiểm tra các tập tin bạn cam kết và sau đó sử dụng git add -p để thêm nó như thế nào bạn muốn nó. Sau đó, bạn có thể quay lại nơi bạn đang ở và kiểm tra tệp từ nhánh tạm thời của bạn.

đó là:

git checkout -b temp troublesome-commit^ 
git checkout troublesome-commit -- path/to/file 
git add -p path/to/file 
git commit -c troublesome-commit 
git checkout @{-1} 
git checkout temp -- path/to/file 
git commit path/to/file 
git branch -D temp 

lựa chọn thay thế khác bao gồm đi lại và chỉnh sửa các cam kết với git rebase -i (đánh dấu cam kết như edit, sau đó làm một git reset HEAD^ và làm lại các cam kết khi giảm trở lại vào vỏ).

Nếu những thay đổi bạn cần chọn được trải rộng qua một loạt các cam kết, có thể tốt hơn là trích xuất chúng dưới dạng bản vá (hoặc bản vá bao gồm tất cả) và chỉnh sửa bản vá, đưa ra những thay đổi bạn muốn giữ và cho phần còn lại vào git apply --reverse.

+0

Tôi thực sự không muốn hoàn nguyên mọi thứ đã cam kết, tôi muốn hoàn tác các thay đổi Chỉ trong bản sao làm việc của tôi –

99

Với phiên bản git> = 1.7.1 tôi có thể

git checkout -p 

Tôi không chắc chắn khi tính năng này đã được giới thiệu.

+8

Điều đáng nói là bạn cũng có thể thực hiện 'git reset -p' để thay đổi chọn lọc từ vùng/chỉ mục dàn dựng. Tôi cũng không biết trên đỉnh đầu của tôi, trong đó phiên bản Git được giới thiệu. –

+0

Đây là câu trả lời đúng, tại sao nó không được chấp nhận. – wukong

+0

@wukong vì câu trả lời này đã được đăng 2 năm sau câu hỏi. Tại thời điểm này (2009), câu trả lời của Charles là giải pháp tốt nhất – pomeh

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