Đối với 1 và 2, tất cả các bạn cần làm là:
git stash -u #same effect as git reset --hard, but can be undone
này sẽ vứt bỏ bất kỳ thay đổi. Hãy cẩn thận nếu bạn sử dụng reset
. Tìm hiểu về thao tác chỉ mục và các hoán vị của các tùy chọn cứng, mềm và hỗn hợp với thiết lập lại và thanh toán. Cuốn sách progit giải thích điều này một cách chi tiết: http://progit.org/2011/07/11/reset.html
Đối với 3,
git reset --hard HEAD^
nhưng sẽ tốt hơn nếu ra git stash -u
trước đây - chỉ trong trường hợp bạn có những thay đổi đang chờ giải quyết.
Điều này sẽ đặt lại nhánh hiện tại thành phụ huynh của cam kết hiện tại. Tra cứu "cây-ish" trực tuyến.^và ~ N sau khi tham chiếu sẽ cho phép bạn trỏ đến bất kỳ điểm nào có thể truy cập trong lịch sử của tham chiếu đó. Để hiểu lịch sử được theo dõi như thế nào trong git, "Git cho các nhà khoa học máy tính" giải thích về Đồ thị theo chu kỳ tốt: http://eagain.net/articles/git-for-computer-scientists/
Để nhận các tệp riêng lẻ từ trạng thái cam kết hiện tại (tức là, bỏ đi thay đổi), bạn có thể sử dụng thanh toán
git checkout HEAD -- <a list of files>
Nếu bạn đưa ra lệnh đặt lại cuối cùng ở trên do lỗi, bạn không gặp rắc rối. Git theo dõi vị trí của các nhánh được sử dụng để trỏ vào việc reflog.
git reflog
sẽ liệt kê lịch sử của bạn. Bạn có thể thấy trong đầu ra đó cách tham chiếu từng loại, vì vậy:
git reset --hard [email protected]{1}
sẽ đặt lại chi nhánh thành nơi trước đây đã thay đổi 1 lần.
Để thêm, nếu bạn muốn xóa sạch các file bị bỏ qua và các tập tin untracked, bạn có thể lau bằng này:
git clean -xdf
Nguồn
2011-11-03 17:31:01
Hãy cẩn thận; git sẽ không nhắc bạn bằng một hộp thoại đẹp (khó chịu?) để chọn những tệp đã thay đổi nào bạn muốn hoàn tác các thay đổi đang chờ xử lý. :) –
một cách để làm điều đó sẽ là thêm tham số -p sẽ nhắc bạn cho từng thay đổi. Bạn có thể nói 'a' hoặc' d' để làm việc trên toàn bộ tệp thay vì 'y' hoặc' n' cho từng phần riêng lẻ. –