Đầu tiên, nhận được "chi nhánh của bạn đi trước nguồn gốc / chủ nhân bằng 3 lần cam kết" thì ứng dụng của tôi đã trở lại thời điểm sớm hơn với những thay đổi trước đó.
Làm thế nào tôi có thể nhận được những gì tôi đã dành 11 giờ qua để làm lại?
Đầu tiên, nhận được "chi nhánh của bạn đi trước nguồn gốc / chủ nhân bằng 3 lần cam kết" thì ứng dụng của tôi đã trở lại thời điểm sớm hơn với những thay đổi trước đó.
Làm thế nào tôi có thể nhận được những gì tôi đã dành 11 giờ qua để làm lại?
Câu trả lời:
git reflog
là bạn của bạn. Tìm cam kết mà bạn muốn có trong danh sách đó và bạn có thể đặt lại cho nó (ví dụ git reset --hard e870e41
:).
(Nếu bạn không cam kết thay đổi của mình ... bạn có thể gặp rắc rối - hãy cam kết sớm và cam kết thường xuyên!)
git log HEAD@{1}
. Nếu đó trông giống như một loạt các cam kết, thì bạn có thể git reset HEAD@{1}
.
git fsck --lost-found
.
Trước khi trả lời, hãy thêm một số nền tảng, giải thích đây HEAD
là gì .
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 lần 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 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ử, nó được gọi detached HEAD
.
Trên dòng lệnh, nó sẽ trô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:
git checkout
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>
git reflog
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
git reset --hard <commit_id>
"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.
git rebase --no-autostash
.git revert <sha-1>
"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 a 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 ở đó, reset && checkout
sửa đổi HEAD
.
git reset --hard <commit_id>
, loại bỏ HEAD
làm việc! +1 cho biểu diễn đồ họa !!.
git reflog <branchname>
có thể khá hữu ích, vì bạn thấy những thay đổi của chỉ một chi nhánh.
Một cách khác để có được cam kết bị xóa là với git fsck
lệnh.
git fsck --lost-found
Điều này sẽ tạo ra một cái gì đó giống như ở dòng cuối cùng:
dangling commit xyz
Chúng tôi có thể kiểm tra xem đó có phải là cùng một cam kết sử dụng reflog
như được đề xuất trong các câu trả lời khác không. Bây giờ chúng ta có thể làm mộtgit merge
git merge xyz
Lưu ý:
Chúng tôi không thể lấy lại cam kết fsck
nếu chúng tôi đã chạy một git gc
lệnh sẽ xóa tham chiếu đến cam kết lơ lửng.