2015-06-11 19 views
11

Xin chào, tôi rất tò mò về sự khác biệt giữa hai lệnh này. Khi họ giới thiệu ở đây: https://www.atlassian.com/git/tutorials/undoing-changesSự khác biệt giữa git reset --hard và git clean

Dường như git reset --hard cũng đặt cả dàn và thư mục hoạt động để khớp với cam kết mới nhất, nhưng cuối cùng họ nói rằng git reset --hard sẽ không thay đổi hiện tại thư mục làm việc. Vì vậy, tôi rất bối rối ở đây, ai đó có thể làm rõ nó?

+1

đâu * không * nó nói 'git reset --hard sẽ không thay đổi hiện tại thư mục làm việc'? Nó rõ ràng nói ngược lại - "Đặt một cách khác: điều này ** [đặt lại cứng] xóa tất cả các thay đổi không được cam kết **". – user2864740

+0

Ngoài ra, hãy chú ý đến "Hãy nhớ rằng [cứng] ** đặt lại * chỉ ảnh hưởng đến các tệp được theo dõi ***, vì vậy cần có lệnh [clean] riêng biệt để dọn dẹp các tệp không được theo dõi." – user2864740

+0

@ user2864740 phải xóa tất cả các thay đổi chưa được cam kết nếu nó cũng đặt lại thư mục làm việc để khớp với cam kết cuối cùng, tại sao chúng ta vẫn cần lệnh git clean, vì trong trường hợp này sẽ không có bất kỳ tệp nào không được làm như thư mục làm việc và vùng dàn đều giống nhau – AlexWang

Trả lời

5

Họ làm hai việc khác nhau. Giả sử, bạn đã thực hiện GIT PULL và sau đó bắt đầu chỉnh sửa một số tệp và có thể đã thêm và cam kết những thay đổi đó sẽ được đẩy ... và sau đó vì lý do nào đó, bạn đã quyết định loại bỏ tất cả các thay đổi đã được thực hiện cho các tệp đã cho và trở lại trạng thái trước đó. trong trường hợp bạn sẽ làm

$ git reflog 
... snip ... 
cf42fa2... [email protected]{0}: commit: fixed misc bugs 
~ 
~ 
cf42fa2... [email protected]{84}: commit: fixed params for ..... 
73b9363... [email protected]{85}: commit: Don't symlink to themes on deployment. 
547cc1b... [email protected]{86}: commit: Deploy to effectif.com web server. 
1dc3298... [email protected]{87}: commit: Updated the theme. 
18c3f51... [email protected]{88}: commit: Verify with Google webmaster tools. 
26fbb9c... [email protected]{89}: checkout: moving to effectif 

Chọn cam kết rằng bạn muốn quay trở lại để, như vậy:

git reset --hard 73b9363 

sau khi cài đặt lại HEAD, tất cả thay đổi không bị giam/file sẽ biến mất.

Còn với git clean. Dưới đây là cách git-docs mô tả nó.

DESCRIPTION 
Cleans the working tree by recursively removing files that 
are not under version control, starting from the current directory. 

Normally, only files unknown to Git are removed, but if the -x 
option is specified, ignored files are also removed. This 
can, for example, be useful to remove all build products. 

If any optional <path>... arguments are given, only those paths are affected. 

Thông tin thêm về thiết lập lại vs sạch và --options họ

lnydex99uhc:~ user$ git reset -h 
usage: git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>] 
    or: git reset [-q] <tree-ish> [--] <paths>... 
    or: git reset --patch [<tree-ish>] [--] [<paths>...] 

    -q, --quiet   be quiet, only report errors 
    --mixed    reset HEAD and index 
    --soft    reset only HEAD 
    --hard    reset HEAD, index and working tree 
    --merge    reset HEAD, index and working tree 
    --keep    reset HEAD but keep local changes 
    -p, --patch   select hunks interactively 

VS

lnydex99uhc:~ user$ git clean -h 
    usage: git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>... 

     -q, --quiet   do not print names of files removed 
     -n, --dry-run   dry run 
     -f, --force   force 
     -i, --interactive  interactive cleaning 
     -d     remove whole directories 
     -e, --exclude <pattern> 
           add <pattern> to ignore rules 
     -x     remove ignored files, too 
     -X     remove only ignored files 


    [1]: http://git-scm.com/docs/git-clean 
+0

cảm ơn bạn đã chia sẻ. điều đó có nghĩa là đây là một lệnh mạnh có thể ảnh hưởng đến mã hóa trong tương lai của dự án? – AlexWang

+0

Nó sẽ ảnh hưởng đến những thay đổi gần đây và bằng cách đặt lại một cam kết trước đó bạn đang nói git để thùng rác tất cả các thay đổi mới kể từ lần commit cuối cùng. – zee

+0

Wrt "tất cả thay đổi/tệp được dàn dựng sẽ biến mất" - điều này chỉ ảnh hưởng đến các thay đổi * không cam kết *. Các thay đổi đã cam kết (như đã thấy với việc reflog) sẽ luôn được duy trì và luôn có thể được phục hồi miễn là chúng có thể truy cập được - ví dụ: thông qua chi nhánh, thẻ hoặc trẻ em. (Thời gian duy nhất git 'mất' một cam kết là khi GC chạy và họ * không * có thể truy cập, ngoại trừ bằng id.) Ghi lại commit là một con thú khác, nhưng git reset đơn giản là không có khả năng sửa đổi/xóa các commit trước đó. – user2864740

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