2011-11-03 34 views
29

Làm cách nào để thực hiện tương đương với TFS 'Hoàn tác các thay đổi đang chờ xử lý' trong Git, trên một hoặc nhiều tệp?Cách thực hiện tương đương TFS 'Hoàn tác các thay đổi đang chờ xử lý'

Đó cơ bản có nghĩa là làm các bước sau:

  • Undo những thay đổi trên đĩa
  • Reset bất kỳ thay đổi Git đã phát hiện
  • Bắt những thay đổi mới nhất về các tập tin từ Git

Nó sẽ là tốt để biết sự khác biệt (nếu có) trong các lệnh để làm điều này nếu bạn đã (1) chỉ cần thay đổi nó trên đĩa, mà không cần thêm nó, nhưng cũng có khi bạn đã (2) thực hiện lệnh thêm và để nhận tiền thưởng, (3) ngay cả khi bạn đã cam kết thay đổi.

Trả lời

31

Đối với 1 và 2, tất cả các bạn cần làm là:

git stash -u #same effect as git reset --hard, but can be undone 

này sẽ vứt bỏ bất kỳ thay đổi. Hãy cẩn thận nếu bạn sử dụng reset. Tìm hiểu về thao tác chỉ mục và các hoán vị của các tùy chọn cứng, mềm và hỗn hợp với thiết lập lại và thanh toán. Cuốn sách progit giải thích điều này một cách chi tiết: http://progit.org/2011/07/11/reset.html

Đối với 3,

git reset --hard HEAD^ 

nhưng sẽ tốt hơn nếu ra git stash -u trước đây - chỉ trong trường hợp bạn có những thay đổi đang chờ giải quyết.

Điều này sẽ đặt lại nhánh hiện tại thành phụ huynh của cam kết hiện tại. Tra cứu "cây-ish" trực tuyến.^và ~ N sau khi tham chiếu sẽ cho phép bạn trỏ đến bất kỳ điểm nào có thể truy cập trong lịch sử của tham chiếu đó. Để hiểu lịch sử được theo dõi như thế nào trong git, "Git cho các nhà khoa học máy tính" giải thích về Đồ thị theo chu kỳ tốt: http://eagain.net/articles/git-for-computer-scientists/

Để nhận các tệp riêng lẻ từ trạng thái cam kết hiện tại (tức là, bỏ đi thay đổi), bạn có thể sử dụng thanh toán

git checkout HEAD -- <a list of files> 

Nếu bạn đưa ra lệnh đặt lại cuối cùng ở trên do lỗi, bạn không gặp rắc rối. Git theo dõi vị trí của các nhánh được sử dụng để trỏ vào việc reflog.

git reflog 

sẽ liệt kê lịch sử của bạn. Bạn có thể thấy trong đầu ra đó cách tham chiếu từng loại, vì vậy:

git reset --hard [email protected]{1} 

sẽ đặt lại chi nhánh thành nơi trước đây đã thay đổi 1 lần.

Để thêm, nếu bạn muốn xóa sạch các file bị bỏ qua và các tập tin untracked, bạn có thể lau bằng này:

git clean -xdf 
+0

Hãy cẩn thận; git sẽ không nhắc bạn bằng một hộp thoại đẹp (khó chịu?) để chọn những tệp đã thay đổi nào bạn muốn hoàn tác các thay đổi đang chờ xử lý. :) –

+1

một cách để làm điều đó sẽ là thêm tham số -p sẽ nhắc bạn cho từng thay đổi. Bạn có thể nói 'a' hoặc' d' để làm việc trên toàn bộ tệp thay vì 'y' hoặc' n' cho từng phần riêng lẻ. –

4

Lệnh này sẽ lùi lại thay đổi địa phương và khôi phục chúng vào các phiên bản hiện tại trong kho:

git reset --hard 

bạn có thể trở lại giá trị cuối cùng của bạn cam kết bằng cách phát hành:

git reset --hard HEAD 

tôi f bạn chỉ muốn khôi phục chỉ là một tập tin, sử dụng git checkout thay vì:

git checkout -- file_name.extension 
git checkout HEAD file_name.extension 
+2

Tại sao bạn phân biệt giữa 'git reset --hard' và' git reset --hard HEAD'? – manojlds

2
  1. git checkout [path] hoặc (toàn bộ repo) git reset --hard HEAD
  2. git reset [path] Tiếp theo git checkout [path]
  3. git reset --hard [commit] để khôi phục lại trạng thái của repo tại [commit], phải là tree-ish
0

Tương đương vớicủa tôitrong Git với Eclipse là chỉ cần nhấp chuột phải vào tệp và chọn Replace with ->HEAD Revision (hoặc bất kỳ phiên bản nào bạn muốn).

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