2012-08-26 29 views
154

Có thể hủy thay đổi lần cuối (không cam kết) cuối cùng trong git không? Giả sử có rất nhiều tệp trong nhánh hiện tại, một số đã được dàn dựng, một số thì không. Tại một số điểm, một số lập trình viên ngu ngốc vô tình thực hiện:Làm thế nào bạn có thể hoàn tác việc thêm git cuối cùng?

git add -- . 

... thay vì:

git checkout -- . 

có thể lập trình viên này ngay bây giờ unstage thay đổi cuối cùng của ông với một số huyền diệu git lệnh? Hay anh ta nên cam kết trước khi thử nghiệm ngay từ đầu?

+14

"Uh, không * tôi * bạn hiểu. Đó là một anh chàng khác. Một số lập trình ngu ngốc. Vâng, đó là vé. Một người khác. Anh ta. Heh, heh. "[Clears throat]. – Rap

+0

Heh. Chúng tôi có một câu hỏi và câu trả lời hữu ích trong số này. – steveha

+2

bản sao có thể có của [Undo 'git add' trước khi commit] (http://stackoverflow.com/questions/348170/undo-git-add-before-commit) –

Trả lời

260

Bạn có thể sử dụng git reset. Điều này sẽ 'unstage' tất cả các tập tin bạn đã thêm sau khi cam kết cuối cùng của bạn.

Nếu bạn chỉ muốn bỏ bớt một số tệp, hãy sử dụng git reset -- <file 1> <file 2> <file n>.

Ngoài ra, bạn cũng có thể unstage một số thay đổi trong tệp bằng cách sử dụng git reset -p.

+2

Thật buồn. Tôi đoán có điều gì đó sai trái trong thực tế cam kết của tôi sau khi tất cả. Chấp nhận câu trả lời này, bởi vì bạn đã đề cập đến công tắc '-p'. Cảm ơn! :) – Septagram

+0

Tạo (cho tôi) lỗi: gây tử vong: Không thể giải quyết 'HEAD' dưới dạng ref hợp lệ. Tôi đã không cam kết bất cứ điều gì được nêu ra (repo mới) chỉ cần thực hiện git thêm. và hối hận. Tôi không muốn đặt lại toàn bộ thêm, chỉ một thư mục. git reset - dir /*.* tạo lỗi ở trên. –

+0

... Ah, tôi thấy điều gì đang xảy ra với tôi. Tôi đã không có bất cứ điều gì cho HEAD để trỏ đến được nêu ra và do đó git reset không thành công (vì nó hoạt động trên HEAD). –

35

Bạn không thể hoàn tác mới nhất git thêm, nhưng bạn có thể hoàn tác tất cả add giây kể từ lần commit cuối cùng. git reset mà không có một lập luận cam kết reset chỉ số (unstages tổ chức thay đổi):

git reset 
+2

"Bạn không thể hoàn tác _latest_ git thêm": Wow, điều này thật đáng ngạc nhiên và có khả năng đau đớn. Có một nguồn dứt khoát cho việc này không? Ngoài ra, có lý do chính đáng nào không? Cảm ơn! –

+0

@AndrewMoylan: tốt, không có cách nào _automatic_ để làm như vậy.Bạn luôn có thể 'đặt lại' một tệp duy nhất hoặc sử dụng 'đặt lại -p' để bỏ đoạn mã cụ thể. – knittl

5

Bạn có thể sử dụng git reset (xem docs)

0

Tùy thuộc vào kích thước và quy mô của khó khăn, bạn có thể tạo nhánh tạm thời (tạm thời) và cam kết công việc hiện tại tại đó.

Sau đó chuyển sang và thanh toán chi nhánh ban đầu của bạn và chọn các tệp thích hợp từ cam kết đầu.

Ít nhất bạn sẽ có hồ sơ vĩnh viễn về trạng thái hiện tại và trước đó để làm việc (cho đến khi bạn xóa nhánh đầu đó).

13

Vì vậy, câu trả lời thực sự cho

Can this programmer now unstage his last changes with some magical git command?

thực sự là: Không, bạn không thể unstage chỉ là cuối cùng git add.

Đó là nếu chúng ta giải thích các câu hỏi như trong tình huống sau đây:

Initial file:

void foo() { 

} 

main() { 
    foo(); 
} 

sự thay đổi đầu tiên tiếp theo git add:

void foo(int bar) { 
    print("$bar"); 
} 

main() { 
    foo(1337); 
} 

thay đổi lần thứ hai tiếp theo git add :

void foo(int bar, String baz) { 
    print("$bar $baz"); 
} 

main() { 
    foo(1337, "h4x0r"); 
} 

Trong trường hợp này, git reset -p sẽ không hữu ích, vì độ chi tiết nhỏ nhất của nó là các dòng.git không biết trạng thái trung gian của:

void foo(int bar) { 
    print("$bar"); 
} 

main() { 
    foo(1337); 
} 

nữa.

2

Tại ngày git nhắc nhở:

  1. use "git rm --cached <file>..." to unstage nếu các tập tin đã không có trong repo. Nó unstages các tập tin giữ chúng ở đó.
  2. use "git reset HEAD <file>..." to unstage nếu các tệp nằm trong repo và bạn đang thêm chúng dưới dạng sửa đổi. Nó giữ các tập tin như họ đang có, và unstages chúng.

Theo hiểu biết của tôi, bạn không thể hoàn tác git add -- nhưng bạn có thể unstage danh sách tệp như đã đề cập ở trên.

2
  • Di chuyển các tập tin từ các chỉ số, nhưng giữ cho nó là phiên bản và trái với những thay đổi không bị giam trong bản sao làm việc:

    git reset head <file> 
    
  • Thiết lập lại các tập tin sang trạng thái cuối cùng từ HEAD, thay đổi hoàn tác và tháo gỡ chúng chỉ từ chỉ mục:

    git reset HEAD <file> 
    git checkout <file> 
    
    # If you have a `<branch>` named like `<file>`, use: 
    git checkout -- <file> 
    

    Điều này là cần thiết vì git reset --hard HEAD sẽ không hoạt động với các tệp đơn lẻ.

  • Remove <file> từ chỉ mục và phiên bản, lưu giữ các tập tin bỏ phiên bản với những thay đổi trong bản sao làm việc:

    git rm --cached <file> 
    
  • Di <file> từ bản sao làm việc và versioning hoàn toàn:

    git rm <file> 
    
1

Nếu bạn muốn xóa tất cả các tệp được thêm từ git cho cam kết

git reset 

Nếu bạn muốn xóa một tập tin cá nhân

git rm <file> 
Các vấn đề liên quan