2011-07-13 27 views
133

Tôi đã làm lệnh sauLàm thế nào tôi có thể unstage các tập tin của tôi một lần nữa sau khi thực hiện một cam kết địa phương?

git add <foo.java> 
git commit -m "add the foo java" 

Làm thế nào tôi có thể xóa địa phương của tôi cam kết ngay bây giờ và làm foo.java trong tình trạng unstaged?

Nếu tôi nhập git reset --hard, tôi thấy rằng nó sẽ hoàn nguyên sửa đổi foo.java của tôi thành bản gốc.

Trả lời

239

git reset --soft HEAD^ nên làm những gì bạn muốn. Sau đó, bạn sẽ có những thay đổi đầu tiên trong chỉ mục (hiển thị với git diff --cached) và các thay đổi mới nhất của bạn không được tổ chức. git status sau đó sẽ trông như thế này:

# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  modified: foo.java 
# 
# 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: foo.java 
# 

Sau đó, bạn có thể làm git add foo.java và cam kết cả thay đổi cùng một lúc.

+0

Cả hai thay đổi ở đâu ?? –

+0

Tôi đã chỉnh sửa câu trả lời: "Thay đổi được cam kết" có những thay đổi đầu tiên và "thay đổi không được tổ chức cho cam kết" có các thay đổi thứ hai. – Antti

+2

Điều được mô tả trong câu trả lời này thực sự là gì 'git commit --amend'; nhưng với một quy trình làm việc phức tạp hơn nhiều. Điều này không trả lời câu hỏi mà OP hỏi, mặc dù đưa ra một hướng tốt ('git reset'). –

35

Sử dụng:

git reset HEAD^ 

Đó làm một "hỗn hợp" thiết lập lại theo mặc định, mà sẽ làm những gì bạn yêu cầu; đặt foo.java ở chế độ không được sắp xếp, xóa cam kết gần đây nhất.

+0

Bạn có quan tâm giải thích cho tôi những gì là "hỗn hợp" thiết lập lại "mềm" thiết lập lại và "cứng" thiết lập lại? –

+1

@Kit Ho - git đặt lại hướng dẫn sử dụng có mô tả tuyệt vời về những điều này. – manojlds

+3

@Kit, @manojlds: Vì vậy, không http://stackoverflow.com/questions/2530060/can-you-explain-to-me-git-reset-in-plain-english (plug shameless) – Cascabel

34

git reset --soft chỉ dành cho điều đó: nó giống như git reset --hard, nhưng không chạm vào tệp.

+4

Đó là lời giải thích dễ hiểu nhất mà tôi đã nghe (chỉ trong 11 từ)! Cảm ơn! – phreakhead

+2

Câu trả lời đó là sai. 'git reset'" giống như 'git reset --hard' nhưng không chạm vào tệp." Không phải 'git reset --soft'. 'git reset --soft' sẽ hiển thị các thay đổi, vì vậy bạn sẽ không phải thêm chúng để dàn dựng trong trường hợp bạn muốn cam kết chúng, nhưng bạn sẽ phải' git reset' chúng (có, lần thứ hai và không có '--soft') trong trường hợp bạn không. Vì vậy, câu trả lời là ngắn, nhưng không chính xác. –

17

Đối với tôi, dễ đọc hơn (do đó thích hợp hơn) theo cách sau luôn là để làm điều đó:

git reset HEAD~1 

Thay 1 có thể có bất kỳ số lượng cam kết mà bạn muốn unstage.

1

Đối unstaging tất cả các tập tin trong bạn cam kết cuối cùng -

git reset HEAD~

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