Khôi phục về cam kết git cuối cùng


120

Tôi vừa làm một

git commit -m "blah"

sau đó tôi đã thêm một số tệp, làm cách nào để khôi phục và loại bỏ những gì trong tệp hiện tại của tôi chưa được thêm / cam kết?


15
không, đây không phải là những gì OP đang yêu cầu - rõ ràng là anh ta muốn quay trở lại cam kết cuối cùng, không hoàn tác cam kết cuối cùng. anh ta không nói rằng anh ta đã thêm một số tệp và sau đó cam kết chúng. rõ ràng anh ta muốn cam kết cuối cùng.
Paul

1
Quá khó để tìm câu trả lời cho câu hỏi siêu phổ biến này
Sam

Câu trả lời:


211

Caveat Emptor - Lệnh hủy diệt phía trước.

Giảm nhẹ - git reflog có thể cứu bạn nếu bạn cần.


1) HOÀN TÁC thay đổi tệp cục bộ và GIỮ cam kết cuối cùng của bạn

git reset --hard

2) HOÀN TÁC thay đổi tệp cục bộ và XÓA cam kết cuối cùng của bạn

git reset --hard HEAD^

3) GIỮ các thay đổi tệp cục bộ và XÓA cam kết cuối cùng của bạn

git reset --soft HEAD^

20
Lệnh này sẽ xóa cam kết trước đó của bạn, vì vậy hãy thận trọng khi sử dụng! git reset --hard là an toàn hơn
rudivonstaden

9
WTF là câu trả lời đúng với 36 phiếu bầu. Tôi vừa mất một ngày làm việc cho việc này ... bởi vì tôi đọc câu trả lời không phải bình luận. Đây không phải là câu trả lời chính xác cho câu hỏi!
Chris Nevill

1
OK tất cả không bị mất! Bạn có thể thực hiện git reflog, điều này sẽ cho phép bạn xem các cam kết bạn đã làm trước khi thiết lập lại. Sau đó bạn có thể kiểm những cam kết
Chris Nevill

3
Đối với những gì nó đáng giá, tôi đã giải thích câu hỏi của OP là "làm cách nào để quay lại cam kết và xóa các tệp hiện tại", nhưng nó đã và vẫn còn mơ hồ. Tôi đã có thể hiểu khác nhau nếu OP đã chỉ đơn giản nói: "làm thế nào để loại bỏ các tập tin hiện tại chưa được thêm vào hoặc cam kết"
Joe Hanink

2
Git là phản đề của câu nói của Alan Kays Những điều đơn giản nên đơn giản, những điều phức tạp nên có thể. ... đặc biệt là phần đầu tiên của nó. Tuy nhiên, cảm ơn bạn đã trả lời. Nó đã giúp đỡ.
0xC0000022L

46

Nếu bạn muốn loại bỏ nội dung mới được thêm vào và các tệp đã được sắp xếp (đã được thêm vào chỉ mục) thì bạn sử dụng:

git reset --hard

Nếu bạn cũng muốn xóa cam kết mới nhất của mình (là cam kết có thông báo "blah") thì tốt hơn nên sử dụng:

git reset --hard HEAD^

Để xóa các tệp chưa được theo dõi (vì vậy các tệp mới chưa được thêm vào chỉ mục) và các thư mục, hãy sử dụng:

git clean --force -d

git reset --hard HEAD ^ xóa cam kết mới nhất của tôi vĩnh viễn không? như tôi không thể quay lại nó?
user137717

có vẻ như "git --force sạch -d" thư mục cũng loại bỏ .gitignored
Alexey Timokhin

15

git reset --hard sẽ buộc thư mục làm việc trở lại lần cam kết cuối cùng và xóa các tệp mới / thay đổi.


2
đã làm điều đó, nhưng các tệp vẫn còn ở đó. (các tệp chưa được kiểm tra vẫn ở đó)
Blankman

trong trường hợp này bạn có thể làm một "git stash"
jacktrade

3
ủng hộ vì đây là câu trả lời rõ ràng và rõ ràng duy nhất cho câu hỏi rõ ràng và rõ ràng của OP.
Paul

4

Bạn có thể hoàn nguyên một cam kết bằng cách sử dụng git revert HEAD^để hoàn nguyên về cam kết tiếp theo đến cuối cùng. Bạn cũng có thể chỉ định cam kết hoàn nguyên bằng id thay vì HEAD ^


Điều này không "hoàn nguyên" theo nghĩa bạn đang nói. Điều này tạo ra một cam kết ngược.
Stefan Kendall

4

Nếu bạn chỉ muốn bỏ ghi chú lần cam kết cuối cùng, hãy sử dụng cái này:

git reset HEAD~

làm việc như một cái duyên đối với tôi.


2
đây là câu trả lời chính xác cho câu hỏi
Deniz Kocaboğa

đây phải là câu trả lời được chấp thuận
amiabl

3

Một cách dễ dàng để UNDO tệp cục bộ thay đổi vì lần cam kết cuối cùng là đặt chúng vào một nhánh mới:

git branch changes
git checkout changes
git add .
git commit

Điều này để lại những thay đổi trong nhánh mới. Quay lại nhánh ban đầu để tìm nó trở lại lần cam kết cuối cùng:

git checkout master

Chi nhánh mới là nơi tốt để thực hành các cách khác nhau để hoàn nguyên các thay đổi mà không có nguy cơ làm xáo trộn chi nhánh ban đầu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.