Trước khi trả lời, hãy thêm một số nền tảng, giải thích đây là gì HEAD
. vì một số tùy chọn bên dưới sẽ dẫn đến đầu bị tách ra
First of all what is HEAD?
HEAD
chỉ đơn giản là một 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ồmgit 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 tham gia vào cam kết mới nhất - có nghĩa HEAD
là chỉ đến một cam kết trước đó trong lịch sử được gọi là cam kết detached HEAD
.
Trên dòng lệnh, nó sẽ trông như thế này- SHA-1 thay vì tên chi nhánh vì HEAD
nó không trỏ đến đầu của nhánh hiện tại
Một vài lựa chọn về cách phục hồi từ một ĐẦU tách ra:
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 chi nhánh mới chỉ vào 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 làm việc 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
là tốt.
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ẽ đặt HEAD
lại cho cam kết này.
Mỗi khi sửa đổi ĐẦU 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" ĐẦU 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" mọi thay đổi đượ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 làm gì.
Như bạn có thể thấy có reset && checkout
sửa đổi HEAD
.