Làm cách nào để hoàn nguyên các thay đổi không được cam kết bao gồm các tệp và thư mục?


1071

Có một lệnh git để hoàn nguyên tất cả các thay đổi không được cam kết trong một cây và chỉ mục làm việc và cũng để loại bỏ các tệp và thư mục mới được tạo?



1
Chà, tôi đã đọc tất cả các câu trả lời khác nhau và khó nhớ dưới đây, với các cảnh báo và trường hợp cạnh của chúng và "không hoạt động nếu bạn có xxx", và đã bị mắc kẹt với việc xóa toàn bộ repo, sao chép nó để xóa tất cả các tệp đã chỉnh sửa và thêm . Cũng chỉ có hai lệnh. rm -r projectdir; git clone xxx. Đối với tôi đây là một hoạt động thường xuyên - hãy kiểm tra một repo chơi xung quanh nó, sau đó muốn quay lại kiểm tra sạch để tôi có thể bắt đầu sửa đổi nó. Không tuyệt vời, nhưng hoạt động 100%. Hy vọng một ngày nào đó họ sẽ thêm một lệnh đơn giản cho việc này.
John Little

Câu trả lời:


1771

Bạn có thể chạy hai lệnh này:

# Revert changes to modified files.
git reset --hard

# Remove all untracked files and directories.
# '-f' is force, '-d' is remove directories.
git clean -fd

147
ý tưởng tốt để chạy 'git clean -nd' để xem trước các thay đổi trước khi chạy git clean để đảm bảo bạn không có các tệp hoặc thư mục không bị theo dõi mà bạn quan tâm sẽ bị xóa.
jpw

79
Lưu ai đó một chuyến đi đến các tài liệu: -f là lực lượng, -d là xóa các thư mục, -n là chạy khô (cũng là - chạy thử; hiển thị đầu ra mà không làm gì cả)
Aaron Campbell

12
git clean -icho một chế độ tương tác.
galath

Nó không thiết lập lại các tập tin chưa được sắp xếp của tôi, tôi phải xử lý chúng trước.
Aron Lorincz

4
@IgorGanapolsky Có lẽ bạn đang ở giữa xung đột hợp nhất. Hãy thử chạy git merge --abort.
htanata

555

Nếu bạn muốn hoàn nguyên các thay đổi chỉ trong thư mục làm việc hiện tại, hãy sử dụng

git checkout -- .

Và trước đó, bạn có thể liệt kê các tệp sẽ được hoàn nguyên mà không thực sự thực hiện bất kỳ hành động nào, chỉ để kiểm tra những gì sẽ xảy ra, với:

git checkout --

1
Khi tôi thử điều này, tôi nhận được "lỗi: pathspec '.' không khớp với bất kỳ tập tin nào được biết đến với git.
Mike K

34
sự khác biệt giữa cái này và git reset --hardcái gì?
Felipe Almeida

104
'git reset --hard' sẽ hoàn tác cả thay đổi theo giai đoạn và không theo giai đoạn, trong khi 'kiểm tra git -.' sẽ hoàn tác chỉ những thay đổi chưa được thực hiện
chiaByZero

Nhưng nếu bạn sử dụng thanh toán và bạn đã sửa đổi các tệp, cmd sẽ trả về rằng tôi cần thực hiện hợp nhất, ngay cả khi tôi chỉ cần hoàn nguyên các thay đổi này
Vinicius Monteiro

7
git checkout - sẽ chỉ liệt kê các tệp sẽ được hoàn nguyên (không có hành động, chỉ liệt kê). Điều này rất hữu ích nếu bạn muốn xem những tập tin nào sẽ bị ảnh hưởng trước khi thực hiện kiểm tra git -.
Krish Srinivasan

107

Sử dụng "git checkout - ..." để loại bỏ các thay đổi trong thư mục làm việc

git checkout -- app/views/posts/index.html.erb

hoặc là

git checkout -- *

xóa tất cả các thay đổi được thực hiện đối với các tệp chưa được xử lý trong trạng thái git, vd

modified:    app/controllers/posts.rb
modified:    app/views/posts/index.html.erb

5
git checkout -- *không hoạt động đối với tôi trừ khi tôi nằm trong thư mục chứa các tệp đã thay đổi. Để kiểm tra tất cả các tệp trên toàn bộ kho lưu trữ, bạn phải làmgit checkout -- :/
waldyrious

Trong git checkout -- *, ngôi sao được thay thế bởi Shell, với tất cả các tệp và thư mục trong thư mục hiện tại. Vì vậy, nó nên đi trong thư mục con. Nó làm việc cho tôi. Nhưng nhờ làm nổi bật cú pháp ": /" mà theo tôi, đường may sạch hơn.
mcoolive

53

Một cách không tầm thường là chạy hai lệnh này:

  1. git stash Điều này sẽ chuyển các thay đổi của bạn sang stash, đưa bạn trở lại trạng thái CHÍNH
  2. git stash drop Điều này sẽ xóa stash mới nhất được tạo trong lệnh cuối cùng.

3
Điều này không hoạt động đối với các thay đổi không được cam kết, chỉ thay đổi được cam kết.
b0xxed1n

4
Tôi đã sử dụng nó cho những thay đổi không được cam kết và nó hoạt động.
Paul D. Eden

7
@ b0xxed1n Stashing là tất cả về những thay đổi không được cam kết, và rõ ràng nó hoạt động với chúng.
TJ

git stash đã được thực hiện để lưu các thay đổi không được cam kết để bạn có thể .. lưu chúng mà không cần cam kết.
Cướp

git stash dẫn đến lỗi sau:fatal: git-write-tree: error building trees Cannot save the current index state
IgorGanapolsky

19
git clean -fd

Không giúp đỡ, các tập tin mới vẫn còn. Những gì tôi đã làm là hoàn toàn xóa tất cả các cây làm việc và sau đó

git reset --hard

Xem " Làm cách nào để xóa thư mục làm việc cục bộ của tôi trong git? " Để được tư vấn thêm -xtùy chọn để xóa:

git clean -fdx

-xCờ lưu ý sẽ xóa tất cả các tệp bị Git bỏ qua, vì vậy hãy cẩn thận (xem thảo luận trong câu trả lời tôi đề cập).


-fdx là gì? "Lực lượng, thư mục và x là?
Adi Prasetyo

Cờ @AdiPrasetyo -x cũng xóa tất cả các tệp bị bỏ qua; nó có thể là một hiệu ứng không mong muốn vì vậy tôi đã cập nhật câu trả lời của mình.
Fr0sT

Tôi vẫn không thể nổi loạn. Tôi nhận được lỗi: error: Không thể hợp nhất trong các thay đổi. Bản vá lỗi không thành công tại 0003 Tạo cuộc gọi trở lại Bản sao của bản vá bị lỗi được tìm thấy trong:
IgorGanapolsky

13

Tôi nghĩ bạn có thể sử dụng lệnh sau: git reset --hard


hhmm ... tôi đã làm điều đó nhưng các tập tin của tôi vẫn còn đó Tôi có nên làm một cái gì đó sau?
MEM

1
git reset chỉ hoàn nguyên các thay đổi không được cam kết trong cây làm việc. Nó sẽ không loại bỏ các tập tin và thư mục mới. Tôi không chắc làm thế nào để làm điều đó với git
Josnidhin

1
Vì vậy, nếu chúng ta thay đổi một thư mục hệ thống bằng cách thêm các tệp và thư mục mới, và sau đó chúng ta muốn hoàn nguyên thư mục đó về trạng thái trước đó (loại bỏ các tệp và thư mục đó), chúng ta không thể làm điều đó với git? Vì vậy, tốt nhất chúng ta có thể là hoàn nguyên trạng thái tập tin? Nhưng một khi chúng ta tạo một tệp, chúng ta không thể xóa tệp đó trừ khi chúng ta làm thủ công?
MEM

6

Xin lưu ý rằng vẫn có thể có các tệp dường như không biến mất - chúng có thể chưa được chỉnh sửa, nhưng git có thể đã đánh dấu chúng là đã được chỉnh sửa do thay đổi CRLF / LF. Xem nếu bạn đã thực hiện một số thay đổi .gitattributesgần đây.

Trong trường hợp của tôi, tôi đã thêm cài đặt CRLF vào .gitattributestệp và tất cả các tệp vẫn nằm trong danh sách "tệp đã sửa đổi" vì lý do này. Thay đổi cài đặt .gitattribut khiến chúng biến mất.


6

Nếu bạn có một thay đổi không được cam kết (chỉ có trong bản sao làm việc của bạn) mà bạn muốn trở lại bản sao trong cam kết mới nhất của mình, hãy làm như sau:

git checkout filename

Tôi đang thử điều này sau khi không được cam kết git rm filenamevà nó không hoạt động. error: pathspec 'filename' did not match any file(s) known to git.
falsePockets

Giải pháp cho việc hoàn tác git rmgit checkout master -- filename
falsePockets

3

Git 2.23 đã giới thiệu git restorelệnh để khôi phục các tệp cây làm việc.

https://git-scm.com/docs/git-restore

Để khôi phục tất cả các tệp trong thư mục hiện tại

khôi phục git.

Nếu bạn muốn khôi phục tất cả các tệp nguồn C để khớp với phiên bản trong chỉ mục, bạn có thể làm

khôi phục git '* .c'


1
đó là git 2.23 , không phải 2.13
phuclv

2

Bạn chỉ có thể sử dụng lệnh git sau để có thể hoàn nguyên tất cả các thay đổi không được cam kết thực hiện trong kho lưu trữ của bạn:

git checkout .

Thí dụ:

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   application/controllers/Drivers.php
        modified:   application/views/drivers/add.php
        modified:   application/views/drivers/load_driver_info.php
        modified:   uploads/drivers/drivers.xlsx

no changes added to commit (use "git add" and/or "git commit -a")

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git checkout .

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working tree clean

-2

Tôi thường sử dụng cách này hoạt động tốt:

mv fold/file /tmp
git checkout fold/file

Điều này hoàn toàn giống với những gì anh chàng với 357 "thích" đề xuất. Chỉ có điều bạn thậm chí còn tạo một bản sao lưu của tệp vừa được kiểm tra.
Matthias

-3

Một cách an toàn và lâu dài:

  1. git branch todelete
  2. git checkout todelete
  3. git add .
  4. git commit -m "I did a bad thing, sorry"
  5. git checkout develop
  6. git branch -D todelete

-3

Sử dụng:

git reset HEAD filepath

Ví dụ:

git reset HEAD om211/src/META-INF/persistence.xml
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.