2009-03-23 42 views

Trả lời

882

Để thiết lập lại một tập tin cụ thể để tình trạng cuối cùng cam kết (để loại bỏ những thay đổi không bị giam trong một tập tin cụ thể):

này được đề cập trong git status đầu ra:

(use "git checkout -- <file>..." to discard changes in working directory) 

Để thiết lập lại toàn bộ kho lưu trữ trạng thái cam kết cuối cùng: (! Nhưng không thư mục .git/)

git reset --hard 

Để gỡ bỏ những file untracked, tôi thường chỉ cần xóa tất cả các file trong bản sao làm việc, sau đó làm git reset --hard mà lá nó chỉ với các tập tin cam kết.

Cách tốt hơn là sử dụng git clean: (Cảnh báo:. Sử dụng -x cờ như dưới đây sẽ gây git để xóa các tập tin bị bỏ qua)

git clean -d -x -f 

sẽ gỡ bỏ những file untracked, bao gồm cả thư mục (-d) và các tệp bị bỏ qua bởi git (-x). Thay thế đối số -f bằng -n để thực hiện khô hoặc -i cho chế độ tương tác và nó sẽ cho bạn biết nội dung sẽ bị xóa.

liên kết liên quan:

+18

Lưu ý rằng theo mặc định, 'git clean -d' không đủ. Bạn cũng cần thêm cờ -f (force). Ngoài ra, nếu bạn muốn xóa thêm các tệp bị bỏ qua bởi .gitignore, thì bạn cần phải thêm tùy chọn -x. Đây là những gì nó trông giống như: git clean -xdf –

+1

Tôi nghĩ rằng bạn có nghĩa là "thư mục làm việc" thay vì "kho" trong câu "Tôi thường chỉ xóa tất cả các tệp trong kho lưu trữ". –

+0

@Dr. Người tốt Điểm, đó là rõ ràng hơn, chỉnh sửa – dbr

102
git clean -df 

Edit: Nó không cũng được quảng cáo nhưng git clean thực sự tiện dụng. Git Ready có nice intro to git clean.

Cập nhật: loại bỏ các x cờ dựa trên gợi ý trong các bình luận bên dưới

+18

Tôi khuyên bạn không nên sử dụng tham số '-x' vì nó sẽ xóa tất cả nội dung gitignored. Giả sử bạn có một thư mục có tên ''gitignored'' được thêm vào' .gitignore' và bạn lưu trữ các tệp của mình phải an toàn, bạn cũng sẽ xóa chúng bằng tham số '-x' – Highmastdon

+1

Rất tiếc. 'git clean -xdf' cũng loại bỏ' .gitignore', và tôi không chú ý trước lần commit kế tiếp. Tôi sẽ không bỏ qua '.gitignore' nữa. :) – Grastveit

+3

@Grastveit 'git clean -xdf' sẽ xóa' .gitignore' nếu và chỉ khi nó chưa được thêm vào, do đó hoạt động như dự định. – Marko

29

Tất cả các câu trả lời cho đến nay vẫn giữ cam kết của địa phương. Nếu bạn thực sự nghiêm trọng, bạn có thể loại bỏ tất cả các địa phương cam kết và tất cả các chỉnh sửa địa phương bằng cách thực hiện:

git reset --hard origin/branchname 

Ví dụ:

git reset --hard origin/master 

Điều này làm cho kho địa phương của bạn chính xác phù hợp nhà nước của nguồn gốc (trừ các tập tin không được theo dõi).

Nếu bạn vô tình làm điều này sau khi chỉ đọc lệnh, và không phải những gì nó :), hãy sử dụng git reflog để tìm các cam kết cũ của bạn.

+0

Tên chi nhánh có thực sự cần thiết không? Đối với tôi 'git reset --hard' chỉ đơn giản là làm việc cho nhánh đang làm việc hiện tại mà không có tên chi nhánh. – RBT

+0

Nếu không có chi nhánh, nó không rõ ràng cam kết địa phương. – dbn

+0

ohh. được. Quan sát của tôi chỉ liên quan đến các tệp được sửa đổi cục bộ và mới được thêm vào. Vì vậy, nếu tôi nhận được bạn một cách chính xác, nếu bất kỳ tập tin được tổ chức hoặc đã được cam kết trong chi nhánh địa phương (không đẩy như được nêu ra) sẽ không được làm sạch nếu tôi không sử dụng tên chi nhánh một cách rõ ràng. Chính xác? – RBT

9

Bạn có thể tạo một cam kết chứa bản sao làm việc trống.

Đây là cách tiếp cận an toàn, không phá hủy vì nó không liên quan đến việc sử dụng bất kỳ cơ chế đặt lại bạo lực nào. Trước tiên, bạn ẩn tất cả nội dung được quản lý với git checkout empty, sau đó bạn được tự do xem xét và xóa nội dung không được quản lý theo cách thủ công.

## create and initialize a temporary repo with an empty working copy 
(
mkdir ./temp-repo && cd ./temp-repo && git init 
touch ./temp-file && git add . && git commit -m "almost empty" 
git rm ./temp-file && git commit -m "empty" 
git tag empty 
) 

## fetch the history from the temporary repo 
git remote add empty ./temp-repo && git fetch --tags empty && git remote rm empty 
gvfs-trash ./temp-repo ## delete the temporary repo 

## clear the working copy 
git checkout empty 

Bây giờ, bản sao làm việc của bạn phải rõ ràng về mọi nội dung được quản lý. Tất cả những gì còn lại là các tệp không được quản lý và chính thư mục .git.

Để tái cư bản sao làm việc của bạn ...

git checkout master ## or whatever branch you will be using 
+0

Đây cũng có thể là một cách hay để tiết kiệm dung lượng ổ đĩa. – nobar

+5

Cách nhanh hơn để tạo thanh toán trống: 'true | git mktree | xargs git commit-tree | xargs git tag empty' – jthill

+0

@jthill: Điều đó dường như hoạt động - cảm ơn mẹo! – nobar

1

Để thiết lập lại một tập tin cụ thể như tình trạng git gợi ý:

git checkout <filename> 

Để thiết lập lại một thư mục

git checkout <foldername>/* 
7

Để chuyển sang một nhánh khác, loại bỏ tất cả các thay đổi không được cam kết (ví dụ như kết quả xử lý kỳ lạ của kết thúc dòng Git):

git checkout -f <branchname> 

Tôi đã có một bản sao làm việc với hàng trăm tập tin thay đổi (nhưng trống git diff --ignore-space-at-eol) mà tôi không thể thoát khỏi tắt với bất kỳ các lệnh tôi đọc ở đây, và git checkout <branchname> sẽ không làm việc, hoặc là - trừ khi có tùy chọn -f (hoặc --force).

+0

' git checkout -p'? – badp

Các vấn đề liên quan