git reflog
có thể đến để giải cứu bạn.
Nhập nó vào bảng điều khiển của bạn và bạn sẽ nhận được danh sách lịch sử git của mình cùng với SHA-1 đại diện cho chúng.
Chỉ cần kiểm tra bất kỳ SHA-1 nào mà bạn muốn hoàn nguyên về
Trước khi trả lời, chúng ta hãy thêm một số thông tin cơ bản, giải thích đây là gì HEAD
.
First of all what is HEAD?
HEAD
chỉ đơn giản là tham chiếu đến cam kết hiện tại (mới nhất) trên nhánh hiện tại.
Chỉ có thể có một duy nhất HEAD
tại bất kỳ thời điểm nào. (không bao gồm git worktree
)
Nội dung của HEAD
được lưu trữ bên trong .git/HEAD
và nó chứa 40 byte SHA-1 của cam kết hiện tại.
detached HEAD
Nếu bạn không sử dụng lần cam kết mới nhất - nghĩa HEAD
là nó trỏ đến một lần cam kết trước trong lịch sử mà nó được gọi detached HEAD
.
Trên dòng lệnh, nó sẽ giống như thế này- SHA-1 thay vì tên nhánh vì HEAD
nó không trỏ đến đầu của nhánh hiện tại
Một số tùy chọn về cách khôi phục từ HEAD bị tách rời:
git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back
Điều này sẽ kiểm tra nhánh mới trỏ đến cam kết mong muốn.
Lệnh này sẽ kiểm tra một cam kết nhất định.
Tại thời điểm này, bạn có thể tạo một nhánh và bắt đầu hoạt động từ thời điểm này.
# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>
# create a new branch forked to the given commit
git checkout -b <branch name>
Bạn luôn có thể sử dụng reflog
.
git reflog
sẽ hiển thị bất kỳ thay đổi nào đã cập nhật HEAD
và kiểm tra mục nhập reflog mong muốn sẽ thiết lập HEAD
trở lại cam kết này.
Mỗi khi HEAD được sửa đổi, sẽ có một mục mới trong reflog
git reflog
git checkout HEAD@{...}
Điều này sẽ đưa bạn trở lại cam kết mong muốn của bạn
"Di chuyển" HEAD của bạn trở lại cam kết mong muốn.
# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32
# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts if you've modified things which were
# changed since the commit you reset to.
- Lưu ý: ( Kể từ Git 2.7 ),
bạn cũng có thể sử dụng git rebase --no-autostash
.
"Hoàn tác" phạm vi cam kết hoặc cam kết đã cho.
Lệnh đặt lại sẽ "hoàn tác" bất kỳ thay đổi nào được thực hiện trong cam kết đã cho.
Một cam kết mới với bản vá hoàn tác sẽ được cam kết trong khi cam kết ban đầu cũng sẽ vẫn còn trong lịch sử.
# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>
Lược đồ này minh họa lệnh nào thực hiện những gì.
Như bạn có thể thấy ở đó, hãy reset && checkout
sửa đổi HEAD
.