Làm cách nào để loại bỏ các thay đổi chưa được tạo trong Git?


4819

Làm cách nào để loại bỏ các thay đổi trong bản sao làm việc không có trong chỉ mục?


9
git-cleanchỉ xóa các tệp không bị theo dõi khỏi cây làm việc git-scm.com/docs/git-clean
Yega

24
Để làm rõ nhận xét của Asenar ở trên, git-clean -dfcó thể nguy hiểm. Nó sẽ xóa các tệp không bị theo dõi cục bộ (ví dụ được bao phủ bởi .gitignore) Đọc kỹ tất cả bên dưới và xem xét kiểm tra git. thay vào đó
jacanterbury

15
'git sạch -df' Được cảnh báo! Tôi đã thử điều đó và mất các thư mục chính không thể khôi phục ... Ouch!
Gabe Karkanis

46
nhấn git statusđưa ra một gợi ý về cách làm điều đó! git checkout -- .
Paulo

4
@Paulo: bắt đầu từ tháng 7 năm 2019, git statusđưa ra gợi ý : git restore. git restorelà một lệnh mới chính xác cho mục đích này. Xem cập nhật năm 2019 của tôi .
prosoitos

Câu trả lời:


2684

Một cách khác nhanh hơn là:

git stash save --keep-index --include-untracked

Bạn không cần phải bao gồm --include-untrackednếu bạn không muốn kỹ lưỡng về nó.

Sau đó, bạn có thể thả stash đó bằng git stash droplệnh nếu muốn.


122
Và để được kỹ lưỡng về nó, bạn cũng muốn --include-untracked.
TJ Crowder

9
@KarimSamir: Câu hỏi đặc biệt hỏi về những thay đổi không có trong chỉ mục . Các git resetlệnh sẽ hủy thay đổi trong chỉ số quá.
Greg Hewgill

146
kiểm tra git -. nhanh hơn nhiều
Frank

38
Không git stash, cũng như bất kỳ sự đa dạng nào git checkoutsẽ loại bỏ các xóa không được sắp xếp. Theo kết quả đầu ra git status, câu trả lời đúng thực tế ở đây là một số hương vịgit reset HEAD
Chris Warth

127
Điều này gây ô nhiễm ngăn xếp stash. git checkout -- .thực hiện công việc chỉ với một lệnh.
Felipe Tonello

5338

Đối với tất cả các tệp chưa được phân loại trong thư mục làm việc hiện tại, hãy sử dụng:

git checkout -- .

Đối với một tập tin cụ thể sử dụng:

git checkout -- path/to/file/to/revert

--ở đây để loại bỏ mơ hồ đối số .


117
Đây có vẻ là cách git canonical. tức là chính xác những gì git bảo bạn làm nếu bạn gõgit status
ABMagil

27
Không hoạt động nếu có các tệp không bị theo dõi. Git nói error: The following untracked working tree files would be overwritten by checkout: ....
Michael Iles

92
người mới hỏi, "git checkout -." có nghĩa là về mặt ngữ nghĩa?
trả lời

120
@Ninjack git checkout -- .có nghĩa tương tự như git checkout ., ngoại trừ việc bạn rõ ràng về thực tế là bạn không chỉ định tên chi nhánh. Cả hai đều nói kiểm tra phiên bản CHÍNH trên nhánh tôi hiện đang sử dụng cho '.' hoặc là './'. Nếu bạn git checkout branch-name directory-or-file-namenói chung, bạn nhận được phiên bản CHÍNH của directory-or-file-namechi nhánh branch-name.
akgill

23
IMO biến thể này là không hoàn hảo, vì nó không xử lý tình huống khi kho lưu trữ đã thay đổi của bạn không có trong bản sửa đổi CHÍNH tại thời điểm làm sạch thay đổi và bạn KHÔNG muốn cập nhật nó lên CHÍNH, và chỉ muốn làm sạch các thay đổi.
alexykot

1899

Có vẻ như giải pháp hoàn chỉnh là:

git clean -df
git checkout -- .

git cleanxóa tất cả các tệp không bị theo dõi ( cảnh báo : trong khi nó sẽ không xóa các tệp bị bỏ qua được đề cập trực tiếp trong .gitignore, nó có thể xóa các tệp bị bỏ qua trong các thư mục ) và git checkoutxóa tất cả các thay đổi chưa được xử lý.


116
Hai câu trả lời khác không thực sự hiệu quả, câu trả lời này đã làm.
John Hunt

18
@dval đây là vì lệnh đầu tiên đã loại bỏ các tệp không được mã hóa và lệnh thứ hai đã loại bỏ các thay đổi chưa được xử lý (của các tệp được lập chỉ mục). Vì vậy, nếu bạn không có bất kỳ thay đổi theo giai đoạn nào thì điều này cũng giống như trở lại cam kết cuối cùng vớigit reset --hard
Amanuel Nega

3
sử dụng -dff nếu thư mục không bị theo dõi là một bản sao git.
accuya

87
Hãy cẩn thận khi chạy git sạch -df. Nếu bạn không hiểu những gì nó làm, bạn có thể xóa các tệp bạn muốn giữ, như robot.txt, các tệp đã tải lên, v.v.
ctl Racer 28/1/2015

40
Như @ctl Racer đã nói, lệnh đầu tiên cũng xóa các thư mục nếu chúng chỉ bao gồm các tệp bị bỏ qua ... Mất toàn bộ tệp cấu hình trong dự án của tôi :( Hãy cẩn thận.
Maxime Lorant 16/07/2015

326

Điều này kiểm tra chỉ mục hiện tại cho thư mục hiện tại, loại bỏ tất cả các thay đổi trong các tệp từ thư mục hiện tại trở xuống.

git checkout .

hoặc cái này kiểm tra tất cả các tệp từ chỉ mục, ghi đè các tệp cây làm việc.

git checkout-index -a -f

28
Xin chào, sự khác biệt giữa git checkout .và là git checkout -- .gì?
Evan Hu

5
@Evan: Không có sự khác biệt trong trường hợp này.
Robert Siemer

10
@Robert Siemer và trong trường hợp chung?
RJFalconer

2
@Evan: nơi tồi tệ để đặt câu hỏi này. - Nó không liên quan đến câu hỏi của OP, và không liên quan đến câu trả lời ở đây.
Robert Siemer

14
+1 Đây là TRẢ LỜI ĐÚNG, vì nó xử lý chính xác trường hợp một số tệp có cả thay đổi theo giai đoạn không theo giai đoạn. Lưu ý rằng giải pháp này GIẢI QUYẾT những thay đổi chưa được thực hiện; nếu bạn muốn giữ lại chúng, thì bạn nên sử dụng câu trả lời của @ greg-hewgill git stash save --keep-index.
Đại hoàng

248
git clean -df

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.

-d: Xóa các thư mục không bị theo dõi ngoài các tệp không bị theo dõi

-f: Buộc (có thể không cần thiết tùy thuộc vào clean.requireForcecài đặt)

Chạy git help cleanđể xem hướng dẫn


Tại sao câu trả lời này không có tất cả các phiếu bầu? trả lời lại vào năm 2011 và vẫn đúng.
Eugene Braginets

106

Sở thích của tôi là

git checkout -p

Điều đó cho phép bạn chọn lọc hoàn nguyên khối.

Xem thêm:

git add -p

9
Tôi thích khả năng nhìn thấy sự thay đổi thực tế trước khi nó bị loại bỏ.
Penghe Geng

Đây là những gì tôi sử dụng. kiểm tra git -p và sau đó "a" để chấp nhận tất cả.
Mattis

2
Tôi chưa bao giờ nghĩ về. Điều đó -pthêm một lớp an toàn tốt đẹp. Kết hợp nó git clean -dđể thực sự trả lời OP.
Stephan Henningsen

96

Vì không có câu trả lời nào cho thấy sự kết hợp tùy chọn chính xác mà tôi sử dụng, nên đây là:

git clean -dfx
git checkout .

Đây là văn bản trợ giúp trực tuyến cho các git cleantùy chọn được sử dụng :

-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 -ftùy chọn hai lần nếu bạn thực sự muốn loại bỏ một thư mục như vậy.

-f

Nếu biến cấu hình Git clean.requireForcekhông được đặt để false, Git sạch sẽ từ chối để xóa các tập tin hoặc thư mục trừ khi có -f, -nhoặc -i. Git sẽ từ chối xóa các .gitthư mục trong thư mục con hoặc tệp, trừ khi có một giây -f.

-x

Không sử dụng quy tắc bỏ qua từ .gitignore(mỗi thư mục) và $GIT_DIR/info/exclude, nhưng vẫn sử dụng quy tắc bỏ qua được cung cấp với -ecác tùy chọn. Điều này cho phép loại bỏ tất cả các tệp không bị theo dõi, bao gồm cả các sản phẩm xây dựng. Điều này có thể được sử dụng (có thể kết hợp với git reset) để tạo một thư mục làm việc nguyên sơ để kiểm tra bản dựng sạch.

Ngoài ra, git checkout .cần phải được thực hiện trong thư mục gốc của repo.


+1 cho giải pháp này. Về nhận xét của bạn rằng "kiểm tra git. Cần phải được thực hiện trong thư mục gốc của repo", có lẽ bạn có thể đề cập đến việc chúng ta chỉ có thể làm git reset --hardthay thế? (cái này thực sự tương đương git reset --hard HEADvà nên hoạt động tùy theo thư mục hiện tại ...)
ErikMD

2
Cũng liên quan đến lệnh đầu tiên git clean -dfx, đây là một mẹo tôi sử dụng để đảm bảo an toàn trước khi chạy: chỉ cần chạy git clean -d -x -ntrước, để hiển thị danh sách các tệp cần xóa, sau đó xác nhận thao tác bằng cách chạy git clean -d -x -f(Tôi đặt đối số -n, -fcuối cùng, để có thể nhanh chóng thay đổi nó trong một thiết bị đầu cuối)
ErikMD

5
Lưu ý nhanh rằng điều này là không thể đảo ngược, và nếu bạn có tệp trong đó, .gitignorebạn sẽ mất chúng. Vì vậy, hãy xem xét sao lưu dự án của bạn trước khi điều này.
Cướp

69

Nếu bạn chỉ muốn xóa các thay đổi đối với các tệp hiện có , hãy sử dụng checkout( tài liệu ở đây ).

git checkout -- .
  • Không có chi nhánh nào được chỉ định, vì vậy nó kiểm tra chi nhánh hiện tại.
  • Dấu gạch nối kép ( --) cho Git biết rằng phần tiếp theo nên được lấy làm đối số thứ hai (đường dẫn) của nó, rằng bạn đã bỏ qua đặc tả của một nhánh.
  • Dấu chấm ( .) chỉ ra tất cả các đường dẫn.

Nếu bạn muốn xóa các tệp được thêm vào từ lần cam kết cuối cùng của bạn, hãy sử dụng clean( tài liệu ở đây ):

git clean -i 
  • Các -itu lựa chọn một tương tác clean, để ngăn chặn xóa nhầm.
  • Một số ít các tùy chọn khác có sẵn để thực hiện nhanh hơn; xem tài liệu.

Nếu bạn muốn di chuyển các thay đổi sang một không gian lưu trữ để truy cập sau này , hãy sử dụng stash( tài liệu ở đây ):

git stash
  • Tất cả các thay đổi sẽ được chuyển đến Stit của Git, để có thể truy cập sau này.
  • Một số ít các tùy chọn có sẵn cho stashing nhiều sắc thái hơn; xem tài liệu.

Điều này sẽ chuyển đổi chính xác các thay đổi của bạn và loại bỏ các tệp mới được thêm vào từ cam kết trước đó.
Yohan Chung

nâng cấp điều này cho lời giải thích :)
Archie G. Quiñones

62

Tôi thực sự thấy bài viết này hữu ích cho việc giải thích khi nào nên sử dụng lệnh gì: http://www.szakmeister.net/blog/2011/oct/12/reverting-changes-git/

Có một vài trường hợp khác nhau:

  1. Nếu bạn chưa dàn dựng tập tin, thì bạn sử dụng git checkout. Kiểm tra "cập nhật tệp trong cây làm việc để khớp với phiên bản trong chỉ mục". Nếu các tệp chưa được phân loại (còn được thêm vào chỉ mục) ... thì lệnh này về cơ bản sẽ hoàn nguyên các tệp về mức cam kết cuối cùng của bạn.

    git checkout -- foo.txt

  2. Nếu bạn đã dàn dựng tập tin, sau đó sử dụng git reset. Đặt lại thay đổi chỉ mục để phù hợp với một cam kết.

    git reset -- foo.txt

Tôi nghi ngờ rằng sử dụng git stashlà một lựa chọn phổ biến vì nó ít nguy hiểm hơn. Bạn luôn có thể quay lại nó nếu bạn vô tình thổi quá nhiều khi sử dụng git reset. Đặt lại được đệ quy theo mặc định.

Hãy xem bài viết trên để được tư vấn thêm.


60

Cách dễ nhất để làm điều này là bằng cách sử dụng lệnh này:

Lệnh này được sử dụng để loại bỏ các thay đổi trong thư mục làm việc -

git checkout -- .

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

Trong lệnh git, việc lấy các tệp không bị theo dõi được thực hiện bằng cách sử dụng:

git stash -u

http://git-scm.com/docs/git-stash


19
Hai lần tôi đến đây, đọc câu trả lời này và quên .cuối cùng. Để tương lai tôi: thời kỳ là điều cần thiết !
bejado

2
Tôi cần phải loại bỏ tất cả các thay đổi cục bộ trong một thư mục con, mà không thổi bay mọi thay đổi khác. Câu trả lời này đã giúp rất nhiều, cảm ơn
Ally

2
Hãy mô tả những gì hai lệnh làm. Thật không có ích khi không có lời giải thích.
Chris Kennedy

2
thông minh. kiểm tra thực hiện trong một lệnh những gì phổ biến nhất làm trong hai. cũng có thể được theo dõi git clean -fdđể làm sạch các tập tin không có trong chỉ mục.
oligofren

49

Nếu bạn không quan tâm đến việc giữ các thay đổi chưa được phân loại (đặc biệt nếu các thay đổi theo giai đoạn là các tệp mới), tôi đã tìm thấy tiện ích này:

git diff | git apply --reverse

44

git checkout -f


man git-checkout:

-f, --force

Khi chuyển nhánh, tiến hành ngay cả khi chỉ mục hoặc cây làm việc khác với HEAD. Điều này được sử dụng để vứt bỏ những thay đổi địa phương.

Khi kiểm tra các đường dẫn từ chỉ mục, không thất bại khi các mục không được trộn; thay vào đó, các mục không được trộn được bỏ qua.


2
Điều này sẽ loại bỏ những thay đổi trong chỉ mục !! (Và OP yêu cầu phải để nguyên như vậy.)
Robert Siemer

44

Khi bạn nhập trạng thái git, (sử dụng "git checkout - ..." để loại bỏ các thay đổi trong thư mục làm việc) được hiển thị.

ví dụ git checkout -- .


1
Bị từ chối vì nó không giúp loại bỏ nhanh chóng tất cả các tệp. Ba dấu chấm cho biết bạn được yêu cầu liệt kê tất cả các tệp. Điều này đặc biệt tệ nếu bạn cần loại bỏ hàng tấn tệp cùng một lúc, ví dụ. trong một sự hợp nhất lớn sau khi bạn đã dàn dựng tất cả các sửa đổi bạn muốn giữ
usr-local-ΕΨΗΕΛΩΝ

2
Tất nhiên, lệnh chính xác là "git checkout -." một dấu chấm đơn Trong bình luận, ba dấu chấm là một điều ngữ pháp, để chỉ ra có nhiều lựa chọn khác có thể đã được sử dụng ..
Josef.B

39

Bạn có thể sử dụng git stash - nếu có lỗi xảy ra, bạn vẫn có thể hoàn nguyên từ stash. Tương tự như một số câu trả lời khác ở đây, nhưng câu trả lời này cũng loại bỏ tất cả các tệp chưa được xử lý và tất cả các xóa không được sắp xếp:

git add .
git stash

nếu bạn kiểm tra xem mọi thứ có ổn không, hãy ném stash đi:

git stash drop

Câu trả lời từ Bilal Maqsood git cleancũng có tác dụng với tôi, nhưng với stash tôi có nhiều quyền kiểm soát hơn - nếu tôi vô tình làm sth, tôi vẫn có thể lấy lại những thay đổi của mình

CẬP NHẬT

Tôi nghĩ rằng có thêm 1 thay đổi (không biết tại sao điều này lại hiệu quả với tôi trước đây):

git add . -A thay vì git add .

không có các -Atập tin bị loại bỏ sẽ không được tổ chức


38

Cập nhật 2019:

Kể từ tháng 7 năm 2019 , đã có một lệnh mới thực hiện chính xác điều này : git restore.

Trong git status, bây giờ Git khuyên bạn nên sử dụng lệnh này thay vì git checkoutnhư trước đây.

Mặc dù lệnh này cũng có thể được sử dụng để khôi phục cây làm việc theo một cam kết cụ thể hoặc để khôi phục nội dung của chỉ mục, theo mặc định, cây làm việc được khôi phục về trạng thái trong chỉ mục (những gì được hỏi ở đây).

Vì vậy, để khôi phục các tệp khớp với một pathspec (loại bỏ các thay đổi chưa được xử lý của chúng), bạn sẽ làm:

git restore <pathspec>

Chẳng hạn, để khôi phục tất cả các thay đổi chưa được sắp xếp trong thư mục hiện tại, bạn có thể chạy:

git restore .

Nếu bạn chạy nó từ thư mục gốc của dự án, nó sẽ khôi phục tất cả các thay đổi chưa được xử lý trong toàn bộ kho lưu trữ.

Lưu ý rằng, như với git checkout -- .(như Mariusz Nowak đã chỉ ra), điều này sẽ chỉ loại bỏ các thay đổi đối với các tệp được theo dõi bởi Git và sẽ không loại bỏ bất kỳ tệp mới nào không bị theo dõi. Nếu bạn muốn loại bỏ bất kỳ thay đổi chưa được xử lý nào, bao gồm các tệp mới chưa được theo dõi, bạn có thể chạy bổ sung:

git clean -df

Tuy nhiên, hãy cẩn thận với lệnh sau này vì bạn có thể loại bỏ các tệp mà bạn không có ý định loại bỏ.


Lưu ý về git restore: vì đây là một lệnh mới, trang man của nó đưa ra cảnh báo:

Lệnh này là thử nghiệm. Hành vi có thể thay đổi.

Vì vậy, có thể câu trả lời này có thể trở nên lỗi thời nếu hành vi không thay đổi trong tương lai. Do đó, có thể là khôn ngoan để chạy nhanh man git-restoretrước khi sử dụng nó.


2
Tôi chỉ muốn hoàn nguyên các thay đổi chưa được xử lý của mình mà không ảnh hưởng đến các tệp mới được thêm vào để một git restore .hoạt động hoàn hảo. Cảm ơn.
Saurabh Misra

3
Tôi đã làm git restore <filename>và nó hoạt động hoàn hảo.
Merlin

1
Làm việc tốt cho tôi.
Prometheus

1
Theo trang man git restore .khôi phục tất cả các tệp trong thư mục hiện tại, không phải trong toàn bộ kho lưu trữ.
jarno

1
Bạn đúng rồi. Cảm ơn! Tôi chỉ thử nó và thực sự, đó là trường hợp. Đó là, tuy nhiên, đệ quy. Vì vậy, khi chạy từ gốc của dự án, nó áp dụng cho toàn bộ kho lưu trữ. Tôi sẽ chỉnh sửa câu trả lời của tôi.
prosoitos

35

Thay vì loại bỏ các thay đổi, tôi đặt lại điều khiển từ xa về nguồn gốc. Lưu ý - phương pháp này là khôi phục hoàn toàn thư mục của bạn với thư mục của repo.

Vì vậy, tôi làm điều này để đảm bảo họ không ngồi đó khi tôi git reset (sau này - không bao gồm gitignores trên Origin / Branchname)

LƯU Ý: Nếu bạn muốn giữ các tệp chưa được theo dõi, nhưng không có trong GITIGNORE, bạn có thể muốn bỏ qua bước này, vì nó sẽ xóa các tệp không bị theo dõi này không tìm thấy trên kho lưu trữ từ xa của bạn (cảm ơn @XtrmJosh).

git add --all

Sau đó tôi

git fetch --all

Sau đó, tôi đặt lại về nguồn gốc

git reset --hard origin/branchname

Điều đó sẽ đặt nó trở lại một hình vuông. Cũng giống như nhân bản lại chi nhánh, WHILE giữ tất cả các tệp được phân bổ cục bộ của tôi tại chỗ và tại chỗ.

Cập nhật cho mỗi bình luận của người dùng bên dưới: Biến thể để đặt lại bất kỳ nhánh hiện tại nào mà người dùng đang bật.

git reset --hard @{u}

Đây là tùy chọn ưa thích của tôi, nhưng tại sao bạn lại thêm tất cả các thay đổi trước? Theo như tôi biết thì điều này chỉ sửa đổi danh sách thư mục trong các tệp Git, trong khi sử dụng git reset - dù sao, điều này sẽ bị mất trong khi các thư mục vẫn sẽ bị xóa.
XtrmJosh

Tôi không có trên mac hoặc linux, github windows powershell đôi khi để các tập tin ở đó sau khi thiết lập lại. Tôi nghĩ rằng vì git reset đặt tất cả các tệp trong repo về trạng thái ban đầu. Nếu họ không được thêm vào, họ sẽ không cảm động. Sau đó, ứng dụng khách máy tính để bàn sẽ chọn "hey tập tin này ở đây và cần phải được cam kết"
Nick

Ý thức thực hiện. Tôi không sử dụng Windows nên đã không thấy vấn đề đó (ít nhất là đã sử dụng Windows trong vài tháng qua, đừng nhớ nhiều về điều đó trước đây - đó là một sự mờ nhạt đáng tiếc lớn). Có thể đáng chú ý lý do trong câu trả lời chính của bạn :)
XtrmJosh

Bây giờ tôi cũng gặp vấn đề này trên máy Mac. Nếu tệp không được theo dõi trong Repo đôi khi git reset không chạm vào nó. Tôi không thể thực sự cô lập "TẠI SAO" nhưng khi điều đó xảy ra, nếu tôi đặt lại và tôi vẫn còn 1 hoặc hai tệp không được cam kết, tôi thêm --all và đặt lại - một lần nữa
Nick

2
Một biến thể nhỏ của cái này tôi thích là git reset --hard @{u}đặt lại chi nhánh đến bất cứ nơi nào chi nhánh theo dõi từ xa hiện tại
2221343

31

Đã thử tất cả các giải pháp ở trên nhưng vẫn không thể thoát khỏi các tệp mới, chưa được xử lý.

Sử dụng git clean -fđể loại bỏ những tập tin mới - mặc dù thận trọng! Lưu ý tùy chọn lực.


21

nói đơn giản

git stash

Nó sẽ loại bỏ tất cả các thay đổi địa phương của bạn. Bạn cũng có thể sử dụng sau bằng cách nói

git stash apply 

hoặc git stash pop


21

Chỉ dùng:

git stash -u

Làm xong. Dễ dàng.

Nếu bạn thực sự quan tâm đến ngăn xếp của bạn thì bạn có thể làm theo git stash drop. Nhưng tại thời điểm đó, bạn nên sử dụng (từ Mariusz Nowak):

git checkout -- .
git clean -df

Tuy nhiên, tôi thích git stash -uđiều tốt nhất vì nó "loại bỏ" tất cả các thay đổi được theo dõi và không theo dõi chỉ trong một lệnh . Tuy nhiên, git checkout -- .chỉ vứt bỏ theo dõi những thay đổi, và git clean -dfthay đổi chỉ vứt bỏ untracked ... và gõ cả hai lệnh là xa quá nhiều công việc :)


Lưu ý: git stash -usẽ sớm (Git 2.14.x / 2.15, quý 3 năm 2017) phát triển một chút: stackoverflow.com/a/46027357/6309
VonC

Nếu tôi nhận được câu hỏi của OP chính xác, các tệp được lập chỉ mục sẽ được giữ lại. Chỉ nên thay đổi unstage. Vì vậy, nên git stash -ktheo ý kiến ​​của tôi.
chụp

21

Để loại bỏ vĩnh viễn: git reset --hard

Để lưu các thay đổi cho lần sau: git stash


16

Điều này hoạt động ngay cả trong các thư mục đó là; ngoài quyền git bình thường.

sudo chmod -R 664 ./* && git checkout -- . && git clean -dfx

Đã xảy ra với tôi gần đây


Mặc dù vậy, hãy cẩn thận, nội dung bị bỏ qua git sẽ không giữ lại quyền ban đầu của nó! Do đó nó có thể gây ra rủi ro bảo mật.
hai lần

@twicejr Bạn đã sai, vui lòng đọc git help clean"-d Xóa các thư mục không bị theo dõi ngoài các tệp không bị theo dõi."
GlassGhost

Tại sao bạn đặt tất cả các tệp của mình thành thế giới đọc / ghi? Không thực hành tốt.
Ghoti

@Ghoti xấu của tôi, 664 có đúng không? Bạn cũng được hoan nghênh chỉnh sửa câu trả lời.
GlassGhost

Đặt tất cả các quyền thành 664 sẽ đưa ra rất nhiều giả định về loại quyền mà dự án cần. Tôi nghĩ rằng việc sử dụng một phần của lệnh sẽ gây ra vấn đề cho một số người.
ianrandmckenzie


14
cd path_to_project_folder  # take you to your project folder/working directory 
git checkout .             # removes all unstaged changes in working directory

12

Theo ý kiến ​​của tôi,

git clean -df

nên làm thủ thuật. Theo tài liệu Git về git sạch

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

Sự miêu tả

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.

Nếu bất kỳ đối số ... tùy chọn nào được đưa ra, chỉ những đường dẫn đó bị ảnh hưởng.

Tùy chọn

-d Xóa các thư mục không bị theo dõi ngoài các tệp 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.

-f --force Nếu biến cấu hình Git sạch.requireForce không được đặt thành false, git clean sẽ từ chối chạy trừ khi được đưa ra -f, -n hoặc -i.


11

Bất kể trạng thái repo của bạn ở trạng thái nào, bạn luôn có thể đặt lại về bất kỳ cam kết nào trước đó:

git reset --hard <commit hash>

Điều này sẽ loại bỏ tất cả các thay đổi được thực hiện sau cam kết đó.


2
Điều này cũng sẽ loại bỏ mọi thứ trong chỉ mục (không chỉ những thứ không có trong chỉ mục), vượt quá những gì OP yêu cầu.
Linus Arver

10

Một cách khác để loại bỏ các tệp mới cụ thể hơn git clean -df (nó sẽ cho phép bạn loại bỏ một số tệp không nhất thiết là tất cả), trước tiên là thêm các tệp mới vào chỉ mục, sau đó bỏ qua, sau đó thả cất.

Kỹ thuật này hữu ích khi, vì một số lý do, bạn không thể dễ dàng xóa tất cả các tệp không bị theo dõi bởi một số cơ chế thông thường (như rm).


9

Những gì tiếp theo thực sự chỉ là một giải pháp nếu bạn đang làm việc với một ngã ba của kho lưu trữ nơi bạn thường xuyên đồng bộ hóa (ví dụ: yêu cầu kéo) với một repo khác. Câu trả lời ngắn: xóa fork và refork, nhưng đọc các cảnh báo trên github .

Tôi đã có một vấn đề tương tự, có lẽ không giống nhau, và tôi rất buồn khi nói giải pháp của tôi không lý tưởng, nhưng cuối cùng nó có hiệu quả.

Tôi thường có các thông báo trạng thái git như thế này (liên quan đến ít nhất 2/4 tệp):

$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2var.dats
#
# 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:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2Var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2Var.dats

Một con mắt sắc sảo sẽ lưu ý rằng những tập tin này có dopplegangers là một chữ cái trong trường hợp tắt. Bằng cách nào đó, và tôi không biết điều gì đã dẫn tôi xuống con đường này để bắt đầu (vì tôi không tự làm việc với các tệp này từ repo ngược dòng), tôi đã chuyển các tệp này. Hãy thử nhiều giải pháp được liệt kê trên trang này (và các trang khác) dường như không có ích.

Tôi đã có thể khắc phục sự cố bằng cách xóa kho lưu trữ rẽ nhánh của mình và tất cả các kho lưu trữ cục bộ và giới thiệu lại. Điều này thôi là chưa đủ; ngược dòng đã phải đổi tên các tập tin trong câu hỏi thành tên tập tin mới. Miễn là bạn không có bất kỳ công việc không được cam kết nào, không có wiki và không có vấn đề nào tách khỏi kho lưu trữ ngược dòng, bạn sẽ ổn thôi. Thượng nguồn có thể không được hạnh phúc với bạn, để nói rằng ít nhất. Đối với vấn đề của tôi, chắc chắn là lỗi người dùng vì tôi không thành thạo với git, nhưng thực tế là nó cũng không dễ để sửa các điểm thành vấn đề với git.


7

Khi bạn muốn chuyển một stash cho người khác:

# add files
git add .  
# diff all the changes to a file
git diff --staged > ~/mijn-fix.diff
# remove local changes 
git reset && git checkout .
# (later you can re-apply the diff:)
git apply ~/mijn-fix.diff

[sửa] như đã nhận xét, có thể đặt tên stash. Chà, sử dụng cái này nếu bạn muốn chia sẻ stash của bạn;)


5
Trên thực tế Git stash có thể có một tiêu đề. Chẳng hạn git stash save "Feature X work in progress".
Colin D Bennett

7

Bạn có thể tạo bí danh của riêng bạn, mô tả cách thực hiện theo cách mô tả.

Tôi sử dụng bí danh tiếp theo để loại bỏ các thay đổi.


Hủy thay đổi trong (danh sách) tệp trong cây làm việc

discard = checkout --

Sau đó, bạn có thể sử dụng nó như bên cạnh để loại bỏ tất cả các thay đổi:

discard .

Hoặc chỉ là một tập tin:

discard filename

Mặt khác, nếu bạn muốn loại bỏ tất cả các thay đổi và cả các tệp không bị theo dõi, tôi sử dụng kết hợp thanh toán và dọn dẹp:

Làm sạch và loại bỏ các thay đổi và các tệp không bị theo dõi trong cây làm việc

cleanout = !git clean -df && git checkout -- .

Vì vậy, việc sử dụng là đơn giản như tiếp theo:

cleanout

Bây giờ đã có trong repo Github tiếp theo chứa rất nhiều bí danh:


7

Tôi đã có một tình huống kỳ lạ khi một tập tin luôn luôn không được xử lý, điều này giúp tôi giải quyết.

git rm .gitattribut
git add -A
git reset --hard

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.