2012-02-28 36 views
54

Tôi đã làm điều gì đó rất ngu ngốc. Tôi đã thực hiện cam kết sử dụng git commit (chỉnh sửa tệp + tệp mới) (C). Sau đó, tôi đã sửa đổi cam kết cuối cùng. Sau đó, tôi đã xóa tất cả các tệp đệ quy (!) Bằng cách sử dụng git rm -r Sau đó, tôi đã thực hiện một cam kết git khác (C).Hoàn tác xóa trong GIT

 
A-B-C 
    ↑ 
    master 

Có cách nào để phục hồi các tệp nhưng giữ các thay đổi tôi có trong lần cam kết đầu tiên của mình không? (C) Tôi không muốn quay lại (B). Tôi đã thử git reset --soft head ^, do đó trạng thái git liệt kê các tệp tôi đã xóa, sau đó tôi đã thực hiện git checkout, nhưng vẫn không có may mắn. Tôi thậm chí không biết nếu nó có thể.

+0

để bạn muốn các tệp cam kết của mình trở lại? – uday

+1

Không, tôi muốn vẫn ở trên C nhưng không có tệp nào bị xóa, chỉ các chỉnh sửa và tệp của tôi mới thêm. Tôi không có các tập tin trong cây làm việc của tôi bây giờ, chúng sẽ bị xóa. – Nately

Trả lời

158

Tự làm ơn và không làm git checkout <hash> như câu trả lời khác gợi ý và gặp nhiều vấn đề hơn.

NẾU bạn đã xóa tập tin từ thư mục làm việc của bạn và không cam kết những thay đổi nào, làm:

git checkout -f 

LƯU Ý: commit những file không bị giam trước khi thực hiện lệnh này, nếu không bạn sẽ mất tất cả chúng

Các tệp đã xóa phải được trả lại.

Nếu không và nếu bạn có thể tìm thấy cam kết mà bạn muốn (C, v.v. - câu hỏi của bạn không rõ ràng) từ git reflog, chỉ cần thực hiện git reset --hard <hash from reflog> và bạn sẽ hoàn tất.

+3

+1 Bạn có thể thêm liên kết vào câu hỏi đầu bị tách rời (như http://stackoverflow.com/questions/3965676/why-did-git-detach-my-head/3965714#3965714) để minh họa sự cố với git checkout SHA1 câu trả lời. ORIG_HEAd có giúp ích trong trường hợp này không? (http://stackoverflow.com/questions/964876/head-and-orig-head-in-git/964927#964927) – VonC

+1

Ok, vì vậy câu trả lời này thực sự tốt hơn. reset --hard to để lại cho tôi trên nhánh chính của tôi, và tôi không bị bỏ lại trong trạng thái 'tách rời HEAD'. Câu trả lời của Sasha cũng tốt trong trường hợp lấy dữ liệu bị mất của tôi. – Nately

+2

Cảm ơn bạn đã tiết kiệm ass của tôi ngay bây giờ. – Seth

5

Nếu tôi hiểu chính xác bạn viết lại cam kết C. Vì vậy, cam kết ban đầu, chúng ta hãy gọi nó C1 là không thể truy cập từ đồ thị cam kết của bạn, nhưng nó vẫn còn đó (git giữ tất cả các cam kết trong một thời gian). Sử dụng git reflog để nhận số băm cam kết và git checkout <hash> hoặc một lệnh thích hợp khác để đến trạng thái cũ C1.

+0

Chúa ơi! Cảm ơn bạn rất nhiều! Cam kết đã có. Bạn đã lưu tôi ba tuần làm việc (kể từ lần commit cuối cùng)). CẢM ƠN BẠN! – Nately

+0

Một câu hỏi nữa. Bây giờ nó nói tôi đang ở trong trạng thái 'tách rời'. Làm cách nào để trở lại chi nhánh 'chủ nhân' của tôi? – Nately

+0

Bạn được chào đón. Tuy nhiên, tôi không hiểu phiếu bầu xuống. Một git reset --hard có khả năng nguy hiểm hơn nhiều. Nó không rõ ràng nếu các poster đã sửa đổi cam kết ban đầu C với những thay đổi ông muốn giữ. – Sascha