Hướng dẫn cách khôi phục lại cơ sở dữ liệu


102

Trong Git, làm thế nào để bạn khôi phục lại một rebase nếu bạn không hài lòng với nó?

Git không chạy khô cho rebase. Nếu tôi đã thực hiện rebase và vẫn chưa đẩy nó, làm cách nào để quay trở lại trước đó, như thể nó chưa từng xảy ra?


4
git rebase --abort
olibiaz

2
Ý bạn là "thất bại" là gì? Bạn đã hoàn thành rebase và bạn không thích kết quả? Hay bạn đã gặp phải xung đột và muốn dừng rebase giữa chừng? Tôi cho rằng điều trước đây, vì bạn không thể đẩy một rebase chưa hoàn thành, xung đột, nhưng tôi hỏi vì chúng là hai câu hỏi khác nhau.
Edward Thomson

có, trước đây. cảm ơn.
user1615666

3
Có thể trùng lặp của Suy vi một rebase git
Jon Schneider

Câu trả lời:


211

Bạn có thể sử dụng reflog để tìm hành động đầu tiên trước khi rebase bắt đầu và sau đó đặt lại --hard trở lại nó. ví dụ

$ git reflog

b710729 HEAD@{0}: rebase: some commit
5ad7c1c HEAD@{1}: rebase: another commit
deafcbf HEAD@{2}: checkout: moving from master to my-branch
...

$ git reset HEAD@{2} --hard

Bây giờ bạn sẽ quay lại trước khi rebase bắt đầu.

Để tìm đúng nơi cần đặt lại, bạn chỉ cần chọn mục nhập gần nhất không bắt đầu bằng "rebase".

Cách tiếp cận khác

Nếu rebase là thứ duy nhất bạn đã thực hiện trên nhánh, tức là bạn không có cam kết / thay đổi nào chưa được đẩy - thì bạn chỉ cần xóa nhánh cục bộ git branch -Dvà sau đó kiểm tra lại:

$ git checkout my-branch
$ git rebase master
// not happy with result
$ git checkout master
$ git branch -D my-branch
$ git checkout my-branch

Hoặc để có hiệu ứng tương tự, bạn có thể đặt lại --hard về nhánh gốc:

$ git reset --hard origin/my-branch

Nếu bạn làm điều này trong khi bạn có các cam kết chưa được đẩy khác, thì bạn sẽ mất chúng. Trong trường hợp đó, chỉ cần sử dụng cách tiếp cận nhật ký ở trên để quay lại mục nhập nhật ký mà bạn đã thực hiện (các) cam kết.


11
Một phím tắt tiện dụng khác: rebase đặt ORIG_HEADthành giá trị băm ban đầu của nhánh được khôi phục. Vì vậy, thay vì tìm số 2 cho HEAD@{2}, bạn chỉ có thể sử dụng ORIG_HEAD... nhưng chỉ khi ORIG_HEADvẫn không bị quấy rầy. Một loạt các lệnh Git thiết lập nó (rebase, am, reset và merge, trong các trường hợp khác nhau).
torek

1
Cảm ơn ngài! Giúp đỡ rất nhiều về điều này :)
Alec

1
cảm ơn bạn mã nguồn của tôi trở lại .... sau khi sử dụng $ git này, hãy đặt lại HEAD @ {2}
--hard

Nhận được sự ủng hộ của tôi vì đề xuất chỉ cần xóa chi nhánh cục bộ và kéo lại!
quicklikerabbit

1
Đây là một tiết kiệm cuộc sống. Cảm ơn bạn @Robbie
Nelson Katale

42

Rebase giữ một bản sao lưu của trạng thái cũ như ORIG_HEAD.
Vì vậy, bạn có thể hoàn nguyên rebase cuối cùng bằng cách chạy:

git reset --hard ORIG_HEAD

1
Bạn có tình cờ biết thẻ đó được ghi ở đâu không?
Ben S

Có một số nhược điểm của điều này hay nó là một tính năng mới? Điều này có vẻ dễ dàng hơn rất nhiều so với việc sàng lọc thông qua một bản tóm tắt.
1252748

Nó không phải là mới. Nhưng bạn thường sử dụng nó ngay sau khi rebase, không thể quay ngược trở lại sau một số lần phục hồi. đó bây giờ? " nó hoạt động tốt.
Meligy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.