git hoàn tác tất cả các thay đổi không được cam kết hoặc chưa lưu


834

Tôi đang cố gắng hoàn tác tất cả các thay đổi kể từ lần cam kết cuối cùng của tôi. Tôi đã thử git reset --hardgit reset --hard HEADsau khi xem bài viết này . Tôi trả lời với đầu bây giờ là 18c3773 ... nhưng khi tôi nhìn vào nguồn cục bộ của mình thì tất cả các tệp vẫn còn đó. Tôi đang thiếu gì?


1
Đây là một nguồn tài nguyên tuyệt vời trực tiếp từ Github: Cách hoàn tác (gần như) mọi thứ với Git
jasonleonhard

Dễ hiểu và đơn giản để đọc: git-scm.com/book/en/v2/Git-Basics-Undceed-Things
MyTitle 9/12/19

Câu trả lời:


1620
  • Điều này sẽ bỏ qua tất cả các tệp bạn có thể đã dàn dựng với git add:

    git reset
    
  • Điều này sẽ hoàn nguyên tất cả các thay đổi không được cam kết cục bộ (nên được thực hiện trong root repo):

    git checkout .
    

    Bạn cũng có thể hoàn nguyên các thay đổi không được cam kết chỉ vào tệp hoặc thư mục cụ thể:

    git checkout [some_dir|file.txt]
    

    Tuy nhiên, một cách khác để hoàn nguyên tất cả các thay đổi không được cam kết (để nhập lâu hơn, nhưng hoạt động từ bất kỳ thư mục con nào):

    git reset --hard HEAD
    
  • Điều này sẽ loại bỏ tất cả các tệp không bị theo dõi cục bộ, do đó chỉ còn lại các tệp được theo dõi git:

    git clean -fdx
    

    CẢNH BÁO: -x cũng sẽ xóa tất cả các tệp bị bỏ qua, bao gồm các tệp được chỉ định bởi .gitignore! Bạn có thể muốn sử dụng -nđể xem trước các tập tin sẽ bị xóa.


Tóm lại: thực hiện các lệnh bên dưới về cơ bản tương đương với nguồn mới git clonetừ nguồn ban đầu (nhưng nó không tải lại bất cứ thứ gì, vì vậy nhanh hơn nhiều):

git reset
git checkout .
git clean -fdx

Cách sử dụng điển hình cho việc này sẽ là trong các tập lệnh xây dựng, khi bạn phải đảm bảo rằng cây của bạn hoàn toàn sạch sẽ - không có bất kỳ sửa đổi hoặc tệp đối tượng nào được tạo cục bộ hoặc xây dựng các thành phần và bạn muốn làm cho nó hoạt động rất nhanh và không tái hoạt động nhân bản toàn bộ kho lưu trữ mỗi lần.


@turibe đúng rồi. Tôi đã phải bắt đầu dự án của mình nhiều lần vì nó đã loại bỏ tất cả các phụ thuộc được tải xuống và thư mục .idea của tôi. Cần một giải pháp tốt hơn.
EresDev

2
@EresDev, bạn không phải thực thi git clean, nó sẽ hoàn tác các thay đổi không được cam kết nhưng giữ tất cả các tệp không bị theo dõi hoặc thêm vào. Nhưng, nó có thể ảnh hưởng đến kết quả xây dựng vì một số tệp không được theo dõi có thể bị can thiệp. Ví dụ: nếu thư mục .idea của bạn bị hỏng thì sao?
mvp

git resetnói với tôi rằng tôi có những thay đổi tôi cần lưu
Daniel Springer

1
đang chạy git clean -fdxđã xóa của tôi node_modules.env, thật tuyệt
fires3as0n

1
@ fires3as0n Bạn còn mong đợi gì nữa? Điều này đã được ràng buộc để xảy ra. Có một cảnh báo trong câu trả lời quá.
Rishav

148

Nếu bạn muốn " hoàn tác " tất cả các thay đổi không được cam kết chỉ cần chạy:

git stash
git stash drop

Nếu bạn có bất kỳ tệp nào chưa được theo dõi (kiểm tra bằng cách chạy git status), những tệp này có thể bị xóa bằng cách chạy:

git clean -fdx

git stashtạo một stash mới sẽ trở thành stash @ {0} . Nếu bạn muốn kiểm tra trước, bạn có thể chạy git stash listđể xem danh sách các stash của mình. Nó sẽ trông giống như:

stash@{0}: WIP on rails-4: 66c8407 remove forem residuals
stash@{1}: WIP on master: 2b8f269 Map qualifications
stash@{2}: WIP on master: 27a7e54 Use non-dynamic finders
stash@{3}: WIP on blogit: c9bd270 some changes

Mỗi stash được đặt tên theo mớ hỗn độn trước đó.


2
Thực sự là một giải pháp tốt nhưng bạn cần thay đổi giai đoạn bằng cách sử dụng git add .trước git stashvì nó cho tôi thấy những thay đổi không được chấp nhận ngay cả sau đógit stash
EresDev

21

cũng có git stash- cái "cất giấu" những thay đổi cục bộ của bạn và có thể được áp dụng lại sau đó hoặc bỏ đi nếu không còn cần thiết

nhiều thông tin về stashing


12

Tôi đang sử dụng cây nguồn .... Bạn có thể hoàn nguyên tất cả các thay đổi không được cam kết với 2 bước đơn giản:

1) chỉ cần đặt lại trạng thái tệp không gian làm việc

nhập mô tả hình ảnh ở đây 2) chọn tất cả các tệp unstage (lệnh + a), nhấp chuột phải và chọn loại bỏ

nhập mô tả hình ảnh ở đây

Thật đơn giản: D


Nếu bạn đặt lại và sau đó thay đổi nhánh và rebase trên nhánh được đặt lại, điều này sẽ gây tổn hại. Đặt lại là hữu ích, nhưng không nên được sử dụng để loại bỏ các thay đổi không được cam kết. Trong trường hợp bỏ các thay đổi không được cam kết, chỉ cần bỏ và bỏ stash.
Dinu Nicolae

10

Những gì tôi làm là

git add . (adding everything)
git stash 
git stash drop

Lót: git add . && git stash && git stash drop


đây là điều tốt nhất
Madrugada

7

Đối với những người đã đến đây để tìm kiếm nếu họ có thể hoàn tác git clean -f -d, theo đó một tệp được tạo trong nhật thực đã bị xóa,

Bạn có thể làm tương tự từ UI bằng cách sử dụng "khôi phục từ lịch sử cục bộ" cho ref: Khôi phục từ lịch sử địa phương


3
Tôi đã không bỏ phiếu tuy nhiên câu trả lời của bạn chưa rõ ràng về ý định của bạn; nó sẽ giúp nếu bạn sắp xếp lại câu đầu tiên trong câu trả lời.
Mark Schultheiss

5

Các tiểu bang chuyển từ một cam kết sang cam kết mới

0. last commit,i.e. HEAD commit
1. Working tree changes, file/directory deletion,adding,modification.
2. The changes are staged in index
3. Staged changes are committed

Hành động chuyển đổi nhà nước

0->1: manual file/directory operation
1->2: git add .
2->3: git commit -m "xxx"

Kiểm tra khác

0->1: git diff
0->2: git diff --cached
0->1, and 0->2: git diff HEAD
last last commit->last commit: git diff HEAD^ HEAD

Hoàn nguyên cam kết cuối cùng

2->1: git reset
1->0: git checkout .     #only for tracked files/directories(actions include modifying/deleting tracked files/directories)
1->0: git clean -fdx     #only for untracked files/directories(action includes adding new files/directories)
2->1, and 1->0: git reset --hard HEAD

Tương đương với bản sao git, mà không cần tải lại bất cứ thứ gì

git reset && git checkout . && git clean -fdx

Tôi không thấy làm thế nào điều này liên quan đến câu hỏi. Đây chỉ là một loạt các công thức lạ, không có bất kỳ chất thực sự.
mvp
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.