2011-07-08 38 views
7

Uh oh ... Tôi đã nhầm lẫn một thay đổi khá phức tạp (bao gồm cả thư mục con và các tập tin đổi tên) mà không biết tôi đang làm gì (hoặc Git sẽ làm gì) .Git: Làm thế nào để hoàn tác commit * và * trở về nhánh cuối

bây giờ tôi muốn phục hồi lại tất cả mọi thứ như vậy:

  1. cam kết là hoàn toàn đảo ngược (như thể nó chưa bao giờ được thực hiện, có lẽ loại bỏ nó từ lịch sử cũng)
  2. Khôi phục thư mục làm việc hiện tại (trong đó .git) đến một chi nhánh nhất định (người cuối cùng sẽ làm ngay bây giờ).

tôi tìm thấy tài liệu tham khảo để git reset --softgit reset --hard nhưng tôi đã chứng minh bản thân mình rằng tôi có thể làm thiệt hại thực tế do sớm sử dụng một lệnh mà không hiểu đầy đủ về nó. :)

Tôi tìm thấy git reset man page nhưng tôi vẫn còn nhầm lẫn như:

  1. HEAD là gì?
  2. Sự khác nhau giữa HEAD* master là gì?
  3. Trong trường hợp của tôi (xem ở trên) làm tôi cần sử dụng --soft, --hard hoặc khác (3 tùy chọn khác)?
  4. Tôi có cần chạy lệnh khác (sau khi thực hiện git reset) để "hoàn tất" việc đảo ngược không?

UPDATE: Sau khi đọc câu trả lời dưới đây:

  1. Tôi hiểu một cách chính xác rằng tất cả những gì cần phải làm gì trong hoàn cảnh của tôi là vấn đề một lệnh đơn git reset --hard HEAD^?
  2. Làm cách nào để xác minh rằng đảo ngược là được thực hiện chính xác?
+2

Vì bạn đang học git, hãy để tôi giới thiệu hai cuốn sách cho bạn: [git community book] (http://book.git-scm.com/index .html) và [pro git] (http://progit.org/book/), cả hai đều hoàn toàn trực tuyến. – shelhamer

+0

@Shelhamer Cảm ơn! – WinWin

Trả lời

7
  1. HEAD là cam kết mới nhất của chi nhánh đã thanh toán.
  2. master là chi nhánh (nhánh chính, theo quy ước) trong khi HEAD là vị trí trong lịch sử cho chi nhánh đã thanh toán. HEAD liên quan đến chi nhánh bạn đang ở.
  3. git reset --soft sẽ để lại các thay đổi trong cây đang hoạt động, không được cam kết để bạn làm bất cứ điều gì bạn thích. git reset --hard sẽ khôi phục cây đang hoạt động về trạng thái tại thời điểm bạn cam kết đặt lại.
  4. Không cần lệnh nào khác.

Trước tiên, để giữ cam kết trong trường hợp bạn muốn kiểm tra nó sau này, tạo ra một ngành: (. Hoặc cách khác làm git branch my_bad_commit như đã đề cập trong bình luận larsman của)

git checkout -b my_bad_commit 

Sau đó trở lại đến master hoặc bất kỳ nhánh nào bạn đã bật và đặt lại:

git checkout branch_with_bad_commit 
git reset --hard HEAD^ 

HEAD^được dịch thành "p arent của HEAD, "mà bạn thậm chí có thể ngăn xếp cho HEAD^^ = 2 commit trở lại. Để biết thêm về chủ đề này, hãy xem chương sách cộng đồng git trên undo in git

+1

'checkout -b; chuỗi checkout' có thể được thực hiện bằng cách sử dụng lệnh 'branch'. –

+0

Điểm tốt để đề cập đến điều đó. Tôi có rất nhiều bí danh tôi chỉ làm 'git cob new_branch_name' mà đôi khi tôi quên những người thật. – shelhamer

+0

@Shelhamer Thực hiện cả 'git checkout master' ** và **' git reset --hard HEAD^'đưa tôi ** hai ** commit trở lại. Đây không phải là những gì tôi muốn. Tôi chỉ cần quay trở lại. Một cái gì đó phải không được rõ ràng trong câu hỏi của tôi. – WinWin

1
  1. HEADtip of the current branch.
  2. Sự khác biệt giữa HEADmasterHEAD thay đổi khi bạn thanh toán chi nhánh (hoặc cam kết).
  3. --soft sẽ để lại các thay đổi xung quanh, vì vậy bạn có thể thêm lại/cam kết hoặc hoàn tác chúng bằng cách thực hiện git checkout trên các tệp đã thay đổi. --hard sẽ đặt lại khu vực làm việc về trạng thái của cam kết mà bạn đang đặt lại.
  4. Không nếu bạn reset --hard. Bạn có thể phải git push --force để repos từ xa (mặc dù, nếu những thay đổi bạn thực hiện đã có trên một lịch sử từ xa, viết lại là mạnh mẽ khuyến khích).
+0

Cảm ơn +1. May mắn thay, tôi chưa đẩy bất cứ điều gì. Vì vậy, 'git reset --hard HEAD ^' một mình làm thủ thuật cho tôi? – WinWin

+2

Nếu bạn chỉ muốn hoàn tác lần commit cuối cùng, vâng. Để được ở bên an toàn, bạn cũng có thể làm 'git branch mistake' trước' git reset --hard'; nếu có điều gì sai, bạn có thể 'git merge mistake' để lấy lại commit nhầm. –

+0

OMG sau khi sử dụng CVS trong nhiều năm, tôi cảm thấy như một tổng số tân binh trong thế giới git này. :) – WinWin

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