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?
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?
Câu trả lời:
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".
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 -D
và 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.
ORIG_HEAD
thà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_HEAD
vẫ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).
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