git reset - ĐẦU TIÊN để lại các tệp không bị theo dõi


584

Khi tôi chạy git reset --hard HEAD, nó được thiết lập lại thành phiên bản nguyên sơ của những gì bạn đã kéo, như tôi hiểu. Thật không may, nó để lại các tập tin nằm xung quanh, vì nó git statushiển thị một danh sách lớn các tập tin chưa được theo dõi.

Làm thế nào để bạn nói với git "Chỉ cần đưa nó trở lại CHÍNH XÁC những gì trong lần kéo cuối cùng, không hơn, không kém"?


44
git reset --hardĐặt lại chỉ mục của bạn và hoàn nguyên các tệp được theo dõi trở lại trạng thái như chúng đang ở TRƯỚC. Nó để lại các tập tin không bị theo dõi một mình.
fifigyuri

Câu trả lời:


904

Bạn phải sử dụng git clean -f -dđể loại bỏ các tập tin và thư mục không bị theo dõi trong bản sao làm việc của bạn.

Nếu bạn cần đặt lại toàn bộ kho lưu trữ thành chủ bao gồm tất cả các mô hình con git, hãy chạy tập lệnh này:

git reset --hard HEAD
git clean -f -d
git checkout master
git fetch origin master
git reset --hard origin/master
git pull
git submodule update
git submodule update --init --recursive
git submodule foreach git reset --hard HEAD
git submodule foreach git clean -f -d
git submodule foreach git submodule update --init --recursive
git submodule foreach git fetch
git submodule foreach git pull
git status

56
Ngoài ra -xnếu bạn muốn xóa các tệp .gitignored của mình và quay lại trạng thái nguyên sơ.
jtdub

44
Thêm -nvào kiểm tra sẽ được gỡ bỏ đầu tiên. kết hợp tất cả chúng trong một đối số:-dfn
HyBRiD

31
Lệnh chung của tôi là git clean -qfdxở đây. Hủy bỏ mọi thứ và làm nó âm thầm.
aragaer

3
-d -fcó thể được decalred hai lần -dffcho -d -f -f, điều này sẽ xóa thư mục TẤT CẢ untracked, bao gồm danh bạ untracked bảo vệ.
ThorSummoner

3
@BKSpurgeon: vâng, nó xóa các tập tin. Ý bạn là gì với »Tôi muốn các tập tin không bị theo dõi như trước đây«? Git không biết gì về các tệp không bị theo dõi, ngoại trừ việc chúng tồn tại. Nó không theo dõi nhiều phiên bản của các tệp này (vì chúng không bị theo dõi ).
knittl

61

Nếu bạn có tệp bạn vẫn muốn giữ:

git clean -di sẽ làm sạch tương tác cho phép bạn chỉ xóa các tệp / thư mục bạn không muốn nữa.


48
git reset --hard && git clean -dfx

hoặc, zsh cung cấp bí danh 'gpristine':

alias gpristine='git reset --hard && git clean -dfx'

Mà thực sự tiện dụng.

Nếu làm việc trên một repo rẽ nhánh, hãy đảm bảo tìm nạp và đặt lại từ repo / nhánh chính xác, ví dụ:

git fetch upstream && git reset --hard upstream/master && git clean -df

8
Xin lỗi nếu đây không phải là một lệnh an toàn - Tôi đã không cố gắng an toàn, tôi đã cố gắng trả lời câu hỏi. Bạn có thể nhận xét về điều này trả lời câu hỏi?
jjnevis

3
Điều này hoạt động tốt và nên được tích hợp vào git IMHO (mặc dù tôi không chắc chắn tôi sẽ sử dụng -x thường xuyên). Vì vậy, nhiều lần tôi đang làm việc với một dự án địa phương, chưa được đồng bộ hóa với github, v.v. và một công cụ tái cấu trúc lộn xộn sẽ vượt quá trạng thái 'hoàn tác' của IDE. Bản năng của tôi là trở lại cam kết cuối cùng nhưng googling cho điều đó thường đưa ra câu trả lời cho cam kết áp chót, không phải cam kết cuối cùng. Tất cả những gì tôi muốn là quay trở lại với cam kết gần đây nhất. Điều này làm điều đó. Nên là một cách dễ dàng hơn mặc dù. Cảm ơn Linus! ;-)
Dell Anderson

5
Đó là nguy hiểm bởi vì nó cũng xóa bỏ qua các file với -xnhư thế nào nếu bạn muốn vừa nhân bản repo. Nếu đó là những gì bạn muốn, nó hoàn hảo. Nếu bạn chỉ muốn xóa các tập tin không bị theo dõi , loại bỏ -xtùy chọn hoạt động tốt.
Emile Bergeron

2
Cảm ơn chúa vìgpristine
Snowcrash

2
và xóa cài đặt intellij;)
Kalpesh Soni

17

Phương pháp tương tác người dùng:

git clean -i -fd

Remove .classpath [y/N]? N
Remove .gitignore [y/N]? N
Remove .project [y/N]? N
Remove .settings/ [y/N]? N
Remove src/com/amazon/arsdumpgenerator/inspector/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/s3/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/s3/ [y/N]? y

-i cho tương tác
-f cho lực lượng
-d cho thư mục
-x cho các tệp bị bỏ qua (thêm nếu cần)

Lưu ý: Thêm -n hoặc --dry-run để chỉ kiểm tra những gì nó sẽ làm.


4

Bạn có thể sử dụng git stash. Bạn phải xác định --include-untracked, nếu không, bạn sẽ kết thúc với vấn đề ban đầu.

git stash --include-untracked

Sau đó chỉ cần thả mục cuối cùng trong stash

git stash drop

Bạn có thể tạo một bí danh tiện dụng cho việc đó và gọi nó là git wipeví dụ:

git config --global alias.wipe "! git stash -q --include-untracked && git stash drop -q"

2

Lệnh bạn đang tìm kiếm là git clean


4
Lần tới xin vui lòng thêm một chút mô tả / ví dụ, vv Bất cứ điều gì giúp người dùng hiểu những gì nó làm, và trong trường hợp này, sử dụng tham số nào.
rugk

1

git-clean Sử dụng để loại bỏ các tệp không bị theo dõi trong cây làm việc. Sau đây là một số tùy chọn (tóm tắt) có thể sử dụng với git cleanlệnh.

-dsử dụng khi không có đường dẫn được chỉ định. Vì vậy, git recurse vào các thư mục không bị theo dõi loại bỏ chúng.

-f/--force Để loại bỏ các tập tin lồng nhau không bị theo dõi.

-i/--interactive Hiển thị những gì sẽ được thực hiện và làm sạch các tệp tương tác.

-n/--dry-run Hiển thị những gì sẽ xảy ra mà không loại bỏ bất cứ điều gì.

-x bỏ qua các tập tin

ví dụ: git clean -f -d-> Xóa tất cả các tệp không bị theo dõi trong thư mục hiện tại bất kỳ thư mục con nào.


-16

Bạn có thể đã thực hiện thiết lập lại mềm tại một số điểm, bạn có thể giải quyết vấn đề này bằng cách thực hiện

git add .
git reset --hard HEAD~100
git pull

7
Tôi không nghĩ đây là điều OP muốn. Một trong những câu trả lời khác làm tốt hơn rất nhiều việc thực sự chỉ ra cách khắc phục điều này.
Avery

1
Điều này cũng có thể chậm nếu bạn có nhiều tệp để thêm.
Devin G Rhode

4
hoàn toàn không liên quan.
Azeem Hassni

1
Làm điều này, các tập tin không bị theo dõi được loại bỏ. Nhưng là lập trình viên, mọi người nên cố gắng tìm giải pháp chính xác cho các vấn đề mà không cần sử dụng cách giải quyết và mỉm cười.
Yuresh Karunanayake
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.