git: hoàn tác tất cả các thay đổi thư mục làm việc bao gồm các tệp mới


1151

Làm thế nào để xóa tất cả các thay đổi từ thư mục làm việc bao gồm các tập tin mới không bị theo dõi. Tôi biết điều git checkout -fđó, nhưng nó không xóa các tệp mới không bị theo dõi được tạo từ lần xác nhận cuối cùng.

Có ai có ý tưởng làm thế nào để làm điều đó?


1
@Joel & Wayfarer: tại sao bạn không thử git help resetgit help clean
SHernandez

3
Tạo một bí danh cho điều này trong cấu hình git của bạn là một ý tưởng hay;)
anubina

Câu trả lời:


1699
git reset --hard # removes staged and working directory changes

## !! be very careful with these !!
## you may end up deleting what you don't want to
## read comments and manual.
git clean -f -d # remove untracked
git clean -f -x -d # CAUTION: as above but removes ignored files like config.
git clean -fxd :/ # CAUTION: as above, but cleans untracked and ignored files through the entire repo (without :/, the operation affects only the current directory)

Để xem những gì sẽ bị xóa trước đó, mà không thực sự xóa nó, hãy sử dụng -ncờ (về cơ bản đây là bản chạy thử). Khi bạn đã sẵn sàng để thực sự xóa, sau đó xóa -ncờ:

git clean -nfd


16
Lưu ý: thiết lập lại git - loại bỏ các thay đổi theo giai đoạn cũng như thay đổi thư mục làm việc. Ngoài ra, git clean -f -d có lẽ ngược lại tốt hơn với việc thêm một tệp mới không bị theo dõi. Từ câu hỏi, người hỏi có thể khá hài lòng với bộ tệp bị bỏ qua hiện tại của mình.
CB Bailey

7
Đọc câu trả lời tiếp theo và xem ra công tắc -x. (Nó cũng có thể xóa cấu hình cục bộ của bạn, chẳng hạn như các tệp mật khẩu / cài đặt db. Ví dụ: cơ sở dữ liệu.yml)
Boris

9
Công tắc -x đó là không cần thiết và hơi nguy hiểm trong trường hợp này.
Tim Gautier

66
git clean -fxdthực sự có thể nguy hiểm nếu bạn không biết bạn đang làm gì. Cuối cùng, bạn có thể xóa vĩnh viễn một số tệp không bị theo dõi rất quan trọng, chẳng hạn như cơ sở dữ liệu của bạn, v.v. Hãy thận trọng.
Mason Stewart

10
Lưu ý rằng git clean -f -dsẽ xóa các tập tin từ các thư mục bỏ qua quá. Vì vậy, tất cả các bản ghi địa phương của bạn và những thứ như thế sẽ biến mất. Thông thường nó không phải là một vấn đề lớn, nhưng tốt hơn là nên biết.
cyriel

299

Phương pháp an toàn nhất, mà tôi sử dụng thường xuyên:

git clean -fd

Cú pháp giải thích theo từng /docs/git-cleantrang:

  • -f(bí danh --force:). Nếu biến cấu hình Git clean.requireForce không được đặt thành false, git clean sẽ từ chối xóa các tệp hoặc thư mục trừ khi được đưa ra -f, -n hoặc -i. Git sẽ từ chối xóa các thư mục với thư mục hoặc tệp phụ .git trừ khi được cung cấp lần thứ hai.
  • -d. Loại bỏ các thư mục không bị theo dõi ngoài các tập tin không bị theo dõi. Nếu một thư mục không bị theo dõi được quản lý bởi một kho lưu trữ Git khác, nó sẽ không bị xóa theo mặc định. Sử dụng tùy chọn -f hai lần nếu bạn thực sự muốn xóa một thư mục như vậy.

Như đã đề cập trong các bình luận, có thể tốt hơn là git clean -ndthực hiện một thao tác khô và cho bạn biết những gì sẽ bị xóa trước khi thực sự xóa nó.

Liên kết đến git cleantrang tài liệu: https://git-scm.com/docs/git-clean


124
Tôi luôn luôn git clean -nd .trước khi thực sự xóa các tệp bằng cách sử dụnggit clean -fd .
vào

14
Tại sao? Bạn có thể giải thích chi tiết xin vui lòng.
Greg B

31
Tùy chọn mỗi git sạch -n thực sự là một hoạt động khô khan mà không loại bỏ bất cứ điều gì, nó chỉ cho bạn thấy những gì sẽ được thực hiện.
RNickMcCandless

2
@tbear, Bạn luôn có thể làm trống add -A+ commit -a+ revert headtrước git clean. Xem xét từng lần xóa đơn giản là không mở rộng quy mô cho các tình huống chính. Ngoài ra, chạy khô không phải là một viên đạn bạc: nếu bạn bỏ lỡ điều gì hoặc mắc lỗi trong quá trình đánh giá thì sao?
Pacerier

1
Điều này loại bỏ các tập tin, nhưng nó không hoàn tác sửa đổi.
donquixote

202

Đối với tất cả unstaged file sử dụng:

git checkout -- .

Các .cuối cùng là quan trọng.

Bạn có thể thay thế .bằng một tên thư mục con để chỉ xóa một thư mục con cụ thể của dự án của bạn. Vấn đề được giải quyết cụ thể ở đây .


7
@Vincent: The - tránh các lỗi đánh máy bằng cách thông báo lệnh thanh toán rằng không có thêm tham số nào được chỉ định. Không có chúng, bạn có thể kết thúc với một nhánh mới thay vì đặt lại nhánh hiện tại!
Igor Rodriguez

2
Đây là con đường an toàn nhất, nhưng nó sẽ không loại bỏ các tệp không bị theo dõi (các tệp mới được thêm vào).
TinkerTenorSoftwareGuy

5
Điều này không khôi phục các tập tin đã xóa, chưa được cam kết.
Cerin

Chỉ cần FYI. Tôi đã bỏ lỡ điều này. Hãy chắc chắn rằng bạn đang ở trong thư mục bạn muốn xóa các thay đổi chưa được thực hiện. Chẳng hạn, tôi đã có những thay đổi ở 2 tệp khác nhau tại các vị trí khác nhau trên một nhánh, tức là: src/app/work/filename.js../app/working/test/filename.js. Chỉ sử dụng git checkout -- .trên nhánh chỉ xóa tệp đầu tiên ( không có phần đầu ../ ). Vì vậy, tôi đã phải cd ../vào thư mục vị trí thứ hai để xóa tệp thứ hai bằng lệnh đó.
Chris22

57

Có một cái nhìn vào git cleanlệnh.

git-clean - Loại bỏ các tệp không bị theo dõi khỏi cây làm việc

Làm sạch cây làm việc bằng cách loại bỏ đệ quy các tệp không thuộc kiểm soát phiên bản, bắt đầu từ thư mục hiện tại.

Thông thường, chỉ các tệp không xác định với git được xóa, nhưng nếu tùy chọn -x được chỉ định, các tệp bị bỏ qua cũng bị xóa. Điều này có thể, ví dụ, có thể hữu ích để loại bỏ tất cả các sản phẩm xây dựng.


Tôi đã thử git clean -ivà chọn "sạch" từ menu - điều này cuối cùng đã xóa các tệp mới.
Sany

43

Các công việc sau đây:

git add -A .
git stash
git stash drop stash@{0}

Xin lưu ý rằng điều này sẽ loại bỏ cả những thay đổi cục bộ chưa được dàn dựng và dàn dựng của bạn. Vì vậy, bạn nên cam kết bất cứ điều gì bạn muốn giữ, trước khi bạn chạy các lệnh này.

Một trường hợp sử dụng thông thường: Bạn đã di chuyển rất nhiều tệp hoặc thư mục xung quanh và sau đó muốn quay lại trạng thái ban đầu.

Tín dụng: https://stackoverflow.com/a/52719/246724


1
Tại sao bạn tham khảo stash @ {0} thay vì chỉ git stash drop?
maikel

Thành thật mà nói, tôi không nhớ :)
donquixote

Cái này làm việc Lưu ý, đảm bảo bạn đang ở trong thư mục chính ( git add -A .). Tôi đã mất 30m vì không có tập tin phù hợp. Cảm ơn!
dùng9869932

Tôi đã từng sử dụng phương pháp này, và nó có giá trị. Tuy nhiên, kể từ đó, tôi đã tìm thấy các giải pháp được đề xuất bởi jfenez và Heath Dutton thích hợp hơn với vấn đề ban đầu, IMHO.
HeyZiko

2
git stash drop stash @ {0} giảm stash mới nhất nếu bạn đã git stash nó sẽ làm rơi tất cả các stash bạn đã làm
DonatasD

42

Bạn có thể làm điều này trong hai bước:

  1. Hoàn nguyên các tệp đã sửa đổi: git checkout -f
  2. Xóa các tệp không bị theo dõi: git clean -fd

3
+1 vì đơn giản. Ngoài ra bởi vì nó hoạt động và thực hiện chính xác những gì OP muốn mà không khiến họ sợ hãi với omg, điều này sẽ xóa mọi thứ.
geekzster

30

Tôi nghĩ đó là ( cảnh báo: sau đây sẽ xóa sạch mọi thứ )

$ git reset --hard HEAD
$ git clean -fd

Việc resethoàn tác thay đổi. Các cleanđể loại bỏ bất kỳ untracked f Iles và d irectories.


Điều này không hiệu quả, tôi vẫn nhận được cảnh báo xung đột khi thực hiện git pullsau đó: CONFLICT (content): Merge conflict in...Tôi chỉ giải quyết vấn đề này bằng mộtgit pull --strategy=ours
rubo77

7
git reset --hard origin/{branchName}

Nó sẽ xóa tất cả các tập tin chưa được theo dõi.


4

git clean -iđầu tiên sẽ hiển thị cho bạn các mục sẽ bị xóa và tiến hành sau khi xác nhận của bạn. Tôi thấy điều này hữu ích khi xử lý các tệp quan trọng không nên vô tình xóa.

Xem git help cleanđể biết thêm thông tin, bao gồm một số tùy chọn hữu ích khác.


4

Nếu bạn muốn loại bỏ tất cả các thay đổi, bạn có thể sử dụng bất kỳ tùy chọn hợp lệ nào trong bí danh .gitconfig. Ví dụ:

[alias]
    discard = "!f() { git add . && git stash && git stash drop stash@{0}; }; f"

Sử dụng: git discard


1
Bí danh này tôi rất thích
cờ

3

Một giải pháp thay thế là cam kết các thay đổi, và sau đó loại bỏ các cam kết đó. Điều này ban đầu không có lợi ích ngay lập tức, nhưng nó mở ra khả năng cam kết trong các khối và để tạo thẻ git để sao lưu.

Bạn có thể làm điều đó trên nhánh hiện tại, như thế này:

git add (-A) .
git commit -m"DISCARD: Temporary local changes"
git tag archive/local-changes-2015-08-01  # optional
git revert HEAD
git reset HEAD^^

Hoặc bạn có thể làm điều đó trên đầu tách ra. (giả sử bạn bắt đầu trên chi nhánh BRANCHNAME):

git checkout --detach HEAD
git add (-A) .
git commit -m"DISCARD: Temporary local changes"
git tag archive/local-changes-2015-08-01  # optional
git checkout BRANCHNAME

Tuy nhiên, những gì tôi thường làm là cam kết theo từng khối, sau đó đặt tên cho một số hoặc tất cả các cam kết là "KHÁM PHÁ: ...". Sau đó sử dụng rebase tương tác để loại bỏ các cam kết xấu và giữ các cam kết tốt.

git add -p  # Add changes in chunks.
git commit -m"DISCARD: Some temporary changes for debugging"
git add -p  # Add more stuff.
git commit -m"Docblock improvements"
git tag archive/local-changes-2015-08-01
git rebase -i (commit id)  # rebase on the commit id before the changes.
  # Remove the commits that say "DISCARD".

Điều này dài dòng hơn, nhưng nó cho phép xem lại chính xác những thay đổi bạn muốn loại bỏ.

Các git lolgit lola các phím tắt đã rất hữu ích với công việc này.


3

Đối với một thư mục cụ thể tôi đã sử dụng:

git checkout -- FolderToClean/*

3
Điều đó không xóa các tệp không bị theo dõi, như trạng thái OP.
vonbrand

0

Đây có lẽ là một câu trả lời không đúng, nhưng: Tôi sử dụng TortoiseGit cho các cửa sổ và nó có một tính năng hay gọi là REVERT. Vì vậy, những gì bạn làm để hoàn nguyên các thay đổi không được xử lý cục bộ của bạn là:

  1. đưa ra một menu ngữ cảnh cho thư mục cần thiết và chọn hoàn nguyên, nó hiển thị cửa sổ bật lên hoàn nguyên nơi bạn có thể chọn các tệp đã thay đổi để hoàn nguyên / khôi phục.
  2. Nếu bạn cũng muốn xóa các tệp đã thêm (chưa có trong git), hãy nhấp vào cam kết (từ cùng một menu ngữ cảnh), nó sẽ hiển thị cửa sổ bật lên Cam kết và hiển thị cho bạn các tệp đã thêm, sau đó nhấp chuột phải vào từng tệp và chọn xóa. Nhưng đừng nhấn Commit btn trong cửa sổ bật lên này, vì bạn không muốn cam kết, mà chỉ xem các tệp được thêm và xóa chúng từ đây.
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.