2013-07-15 33 views
8

Nói rằng tôi thay đổi nội dung một tập tinLàm cách nào để bạn hoàn nguyên tệp được dàn dựng với các thay đổi, giữ nguyên các thay đổi khi được tổ chức?

echo "hi" > someVersionedFile.txt 

//Then I staged the file 
git add . 
git status 

<console reads> 
Changes to be committed 
new file: someVersionedFile.txt 

Bây giờ tôi có thay đổi bổ sung cho các tập tin

echo "hi again file" >> someVersionedFile.txt 

//Then I restage the file with these changes 
git add . 
git status 

<console reads> 
Changed but not commited 
modified file: someVersionedFile.txt 

Câu hỏi: làm thế nào để phục hồi các ngoái dàn dựng phiên bản? Điều này có thể thực hiện được vì nó không được cam kết không?

+0

Tôi khá chắc chắn điều này là không thể, nhưng tôi cũng muốn biết nếu nó được! –

+0

Không chắc chắn cách bạn làm điều đó, nhưng nếu bạn cam kết ngay bây giờ, chỉ những thay đổi theo giai đoạn mới được thực hiện. Sau đó, bạn có thể hoàn nguyên tệp đó về cam kết mà bạn vừa thực hiện. – andypaxo

+0

@andypaxo Đó không phải là vấn đề.Cẩn thận hơn, vấn đề là, nếu bạn tạo một tập tin có thay đổi; thực hiện nhiều thay đổi hơn cho nó, sau đó làm thế nào để bạn hoàn nguyên tệp trở lại khi nó được tổ chức - được cung cấp/có thay đổi bổ sung đối với tệp được dàn dựng không? – stackoverflow

Trả lời

5

Bạn có thể làm điều này, nhưng không có lệnh đơn giản nào để thực hiện điều đó cho bạn.

Khi bạn làm git add, tệp đã được thêm vào kho lưu trữ, nhưng hiện tại không có gì trỏ đến nó ngoại trừ chỉ mục. Khi bạn thực hiện một tệp thứ hai git add, tệp (phiên bản mới) mới sẽ được thêm vào kho lưu trữ và liên kết giữa chỉ mục và phiên bản đầu tiên của tệp được thay thế bằng liên kết mới. Nhưng đối tượng đầu tiên vẫn còn đó.

Bạn có thể sử dụng git fsck --dangling để nhận danh sách các đối tượng blob trong kho của mình hiện không được tham chiếu bởi bất kỳ thứ gì, nhưng sau đó bạn sẽ phải xem từng cái một với git show, git cat-file, v.v. tệp bạn muốn. Khi bạn tìm thấy đúng tệp, bạn có thể git show HASH > somefile.txt (và có thể git add somefile.txt).

Tất nhiên, nếu bạn đã thực hiện bất kỳ git prune, git gc, v.v ... kể từ ngày git add thứ hai, có thể đã thực sự xóa tệp gốc khỏi kho lưu trữ của bạn.

Dưới đây là một ví dụ nhanh:

$ git init foo 
Initialized empty Git repository in foo/.git/ 
$ cd foo 
$ echo blah > foo.txt 
$ git add foo.txt 
$ echo blarg > foo.txt 
$ git add foo.txt 
$ git fsck --dangling 
Checking object directories: 100% (256/256), done. 
dangling blob 907b308167f0880fb2a5c0e1614bb0c7620f9dc3 
$ git show 907b308167f0880fb2a5c0e1614bb0c7620f9dc3 
blah 
$ 
4

Bạn không thể thực hiện việc này. Git chỉ có thể hoàn nguyên các tệp trước cam kết, không phải phiên bản được dàn dựng trước đó. Điều này là do tệp sẽ không được nhập vào kho của git cho đến khi bạn thực hiện cam kết. (Bạn có thể đọc thêm về các phương pháp hay nhất khi cam kết tại số Coding Horror)

Có lẽ bạn có thể áp dụng một cách khôn ngoan nút undo? (Nếu bạn đã chỉnh sửa mã trong trình chỉnh sửa, rõ ràng là echo nhập vào tệp không có hoàn tác).

0

Bạn có nghĩa là bạn muốn phục hồi trở lại để phiên bản dàn dựng? Vâng, bạn chắc chắn có thể làm điều đó. Có lẽ là cách đơn giản nhất là chỉ cần cam kết thay đổi tổ chức của bạn, kiểm tra các tập tin từ đó cam kết, và sau đó thiết lập lại chi nhánh của bạn:

git commit -m "Temporary commit" 
git checkout HEAD -- /path/to/file_you_want_to_revert 
git reset HEAD~ 

Chỉnh sửa: Rất tiếc, xin lỗi tôi không chú ý đến phần mà bạn restaged file với những thay đổi mới. Xin lỗi, nhưng các câu trả lời khác là chính xác: điều này là không thể (hoặc ít nhất, không phải là rất dễ dàng). Tôi sẽ để lại câu trả lời này, trong trường hợp người khác có vấn đề tương tự với bạn nhưng chưa ghi đè bộ nhớ cache.

+1

Mặc dù đó là câu trả lời sai, bạn có thể đạt được điều tương tự chỉ bằng 'git checkout/path/to/file_you_want_to_revert' mà không cần đặt tên chi nhánh. – mihi

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