2011-07-01 34 views
151

Tôi đã lưu trữ một số thay đổi cục bộ trước khi thực hiện hợp nhất phức tạp, đã hợp nhất, sau đó quên mất cam kết trước khi chạy git stash pop. Pop đã tạo ra một số vấn đề (các cuộc gọi phương thức xấu trong một codebase lớn) đang chứng minh khó theo dõi. Tôi chạy git stash show, vì vậy ít nhất tôi biết tệp nào đã bị thay đổi. Nếu không có gì khác, tôi đoán đây là một bài học để cam kết nhiều hơn nữa.Hoàn tác ngẫu nhiên git stash pop

Câu hỏi của tôi: có thể hoàn tác cửa sổ bật xuống mà không hoàn tác quá trình hợp nhất không?

+2

Bạn không được phép được phép sử dụng 'git stash pop' mà không cam kết trước tiên. Bạn đã làm gì để đạt được điều đó? –

+0

Không chắc chắn phải trung thực (hôm nay là ngày hôm qua). Việc hợp nhất không tự cam kết vì có xung đột. Tôi bằng cách nào đó có thể chạy cửa sổ bật lên sau đó. – nren

+0

Tôi đã làm điều này chỉ biết sử dụng git phiên bản 1.7.9.msysgit.0. Tôi đã có các tập tin chưa được chỉnh sửa và cửa sổ bật lên vừa sáp nhập mọi thứ. – PandaWood

Trả lời

58

Hãy thử sử dụng How to recover a dropped stash in Git? để tìm dấu gạch ngang bạn đã xuất hiện. Tôi nghĩ luôn luôn có hai cam kết cho một stash, vì nó bảo tồn chỉ mục và bản sao làm việc (vì vậy thường thì chỉ mục cam kết sẽ trống). Sau đó, git show để xem sự khác biệt và sử dụng patch -R để không áp dụng chúng.

+6

Chà đã hoạt động. Tôi đã có thể tìm thấy các cam kết stash với 'git fsck --no-reflog | awk '/ dangling commit/{print $ 3}' '(từ liên kết), và tôi chỉ tự tìm ra vấn đề từ sự khác biệt đó. Cảm ơn! – nren

+0

fsck xuất ra một danh sách lớn. Nó tẻ nhạt để git hiển thị mỗi SHA1 ra khỏi đó. Làm thế nào để bạn làm điều này ? – meson10

+3

@ meson10: Thật không may stashes được lưu giữ trong một reflog, đó sẽ là cách rõ ràng (nếu họ là một chi nhánh thực) để xem lịch sử của stopped stashes. Ngoài ra hãy để tôi đề nghị rằng một yêu cầu downvote + để được trợ giúp không phải là chiến lược tốt nhất. –

28

Từ git stash --help

Recovering stashes that were cleared/dropped erroneously 
    If you mistakenly drop or clear stashes, they cannot be recovered through the normal safety mechanisms. However, you can try the 
    following incantation to get a list of stashes that are still in your repository, but not reachable any more: 

     git fsck --unreachable | 
     grep commit | cut -d\ -f3 | 
     xargs git log --merges --no-walk --grep=WIP 

này đã giúp tôi tốt hơn so với câu trả lời chấp nhận với cùng một kịch bản.

+8

Lưu ý rằng rất nhiều giải pháp liên quan đến việc tìm kiếm "WIP" dựa trên các thông báo stash mặc định. Nếu bạn cung cấp cho stashes của bạn thông điệp rõ ràng họ có thể không chứa WIP. –

+0

cảm ơn. Tôi đã thêm tùy chọn --oneline vào lệnh nhật ký để cải thiện khả năng đọc. – basslo

0

Nếu hợp nhất của bạn đã không phải là quá phức tạp tùy chọn khác sẽ được:

  1. Move tất cả những thay đổi bao gồm việc hợp nhất sẽ chuyển trở về stash sử dụng "git stash"
  2. Run việc hợp nhất một lần nữa và cam kết thay đổi của bạn (không có thay đổi từ dấu gạch chéo bị bỏ)
  3. Chạy "cửa sổ bật lên git" nên bỏ qua tất cả thay đổi từ lần hợp nhất trước đó của bạn vì các tệp bây giờ giống hệt nhau.

Sau đó, bạn chỉ còn lại những thay đổi từ dấu gạch chéo bạn đã bỏ quá sớm.

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