2013-03-10 23 views
9

Đây là những gì tôi muốn làm. Tôi muốn quay trở lại 2 lần commit trước, mang lại các file đã thay đổi trong commit đó như một commit mới. Nhưng tôi không muốn mất cam kết cuối cùng của mình. Cam kết cuối cùng của tôi có một số sai lầm trong mã nhưng tôi muốn giữ nó ngay bây giờ.Làm thế nào để quay trở lại cam kết trước đó mà không làm mất cam kết cuối cùng trong Git?

Tôi đã đọc một số tài liệu nhưng không có tài liệu nào rõ ràng về những gì xảy ra khi bạn đặt lại đầu. Bạn có mất tất cả các cam kết cho đến khi một trong những bạn đang đặt lại để (đi lạc hậu) ví dụ?

Tôi đang cố gắng hiểu cách hoạt động của tất cả nhưng tôi khá bối rối về các lệnh git revert, resetcheckout.

Tôi nhận ra rằng tôi nên đã vứt bỏ cam kết cuối cùng thay vì cam kết, nhưng đó là một câu chuyện khác ngay bây giờ.

+1

Bạn có thể cụ thể hơn về những gì bạn muốn làm không? Bạn có muốn hoàn tác cam kết trước đó không? Hoặc bạn có muốn giữ hầu hết các thay đổi mà hai cam kết đã thực hiện, ngoại trừ một vài tệp không? – jszakmeister

+0

jszakmeister, Tôi không muốn loại bỏ bất kỳ cam kết nào. Tôi muốn giữ lịch sử quá khứ của mình nguyên vẹn. Tôi chỉ muốn mang lại 2 cam kết trước đây như một giai đoạn làm việc mới mà tôi đoán. –

+0

Vẫn chưa rõ "mang lại" nghĩa là gì. – wRAR

Trả lời

9

revert thực hiện một cam kết mới để hoàn nguyên các thay đổi được thực hiện bởi một cam kết cũ hơn. reset --hard thay đổi HEAD của nhánh hiện tại thành cam kết được chỉ định. checkout chuyển bản sao làm việc sang nhánh hoặc cam kết được chỉ định.

Khi bạn đặt lại nhánh thành cam kết cũ hơn, các cam kết mới hơn sẽ bị mất nếu chúng không phải là một phần của các nhánh khác hoặc tổ tiên của thẻ (chúng vẫn có thể truy cập được qua reflog).

Không rõ bạn cần làm gì, các giải pháp có thể xảy ra nhất là revert (để hoàn nguyên một cam kết cũ hơn hoặc loạt cam kết) và rebase -i (để thay đổi một cam kết cũ hơn hoặc xóa nó khỏi lịch sử).

+0

'git revert' có tác động mạnh mẽ vì nó tạo ra một cam kết phủ nhận những thay đổi của một cam kết trước đó. Hãy cẩn thận khi sử dụng nó trừ khi bạn chắc chắn về những gì bạn dự định. – LopSae

+0

@LopSae đã tạo cam kết không được xuất bản, vì vậy bạn có thể dễ dàng xóa nó nếu nó làm điều gì đó mà bạn không muốn. thiết lập lại và rebase là nhiều lệnh nguy hiểm hơn như phục hồi từ các lỗi là khó khăn hơn nhiều. – wRAR

+0

Xin chào, @wRAR. Khi tôi kiểm tra lại một cam kết trước đó, sau đó, khi tôi sử dụng git log để xem lịch sử commit , tất cả các bản ghi sau khi cam kết mà tôi chuyển trở lại là mất tích. Làm thế nào để giải quyết điều đó? Tôi có nghĩa là để xem lịch sử cam kết đầy đủ sau khi tôi kiểm tra một cam kết trước đó. – Mario

10

Nếu bạn muốn quay lại, hãy nói 2 lần commit trước đó, bạn chỉ cần thực hiện git checkout HEAD~2. Điều này sẽ giúp bạn có được tất cả như nó sau đó. Nếu bạn đang ở trên chi nhánh master, git checkout master sẽ đưa bạn trở lại hiện tại. Tuy nhiên, nếu bạn muốn giữ trạng thái hiện tại nhưng bắt đầu một nhánh phát triển mới ở đó, git checkout -b HEAD~2 sẽ bắt đầu một nhánh mới ở đó. Trong trường hợp bạn muốn tua lại bản gốc nhưng không làm mất công việc hiện tại, chưa hoàn thành/hỏng, hãy làm

git branch wip   # New branch ends a current tip 
git reset --hard HEAD~2 # Old branch rewound, get files from then 
Các vấn đề liên quan