По-перше, отримано "ваша філія випереджає походження / майстер на 3 коміти", потім моя програма повернулася до більш раннього часу з більш ранніми змінами.
Як я можу отримати те, що я витратив останні 11 годин, роблячи назад?
По-перше, отримано "ваша філія випереджає походження / майстер на 3 коміти", потім моя програма повернулася до більш раннього часу з більш ранніми змінами.
Як я можу отримати те, що я витратив останні 11 годин, роблячи назад?
Відповіді:
git reflog
твій друг. Знайдіть комісію, на якій ви хочете бути у цьому списку, і зможете скинути його (наприклад:git reset --hard e870e41
:).
(Якщо ви не здійснили своїх змін ... у вас можуть виникнути проблеми - дотримуйтесь завчасно та виконайте часто!)
git log HEAD@{1}
. Якщо це виглядає як правильний ряд зобов’язань, тоді ви можете git reset HEAD@{1}
.
git fsck --lost-found
.
Перш ніж відповісти, давайте додамо деяку інформацію, пояснивши, що це HEAD
таке.
First of all what is HEAD?
HEAD
це просто посилання на поточний комітет (останній) у поточній гілці.
У HEAD
будь-який момент може бути лише одиниця (виключаючиgit worktree
).
Вміст HEAD
зберігається всередині, .git/HEAD
і він містить 40 байт SHA-1 поточної комісії.
detached HEAD
Якщо ви не перебуваєте на останньому комітеті - це означає, що HEAD
вказує на попереднє вчинення в історії, воно називається detached HEAD
.
У командному рядку це буде виглядати приблизно так - SHA-1 замість назви гілки, оскільки значення HEAD
не вказує на кінчик поточної гілки:
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
Це дозволить перевірити нову гілку, яка вказує на бажану комісію.
Ця команда перевірятиме дану комісію.
У цей момент ви можете створити відділення і почати працювати з цього моменту.
# 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
Ви завжди можете використовувати reflog
також.
git reflog
відобразиться будь-яка зміна, яка оновила HEAD
і перевірка потрібного запису відмикань HEAD
поверне цю комісію .
Кожен раз, коли зміниться HEAD, буде новий запис у reflog
git reflog
git checkout HEAD@{...}
Це поверне вас до бажаного завдання
git reset --hard <commit_id>
"Перемістіть" голову назад до потрібної фіксації.
# 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>
"Скасувати" заданий діапазон фіксації чи фіксації.
Команда скидання "скасує" будь-які зміни, внесені в дану комісію.
Нова фіксація з виправленням патча буде здійснена, тоді як оригінальна комісія також залишиться в історії.
# 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>
Ця схема ілюструє, яка команда робить що.
Як ви бачите там, reset && checkout
модифікуйте HEAD
.
git reset --hard <commit_id>
, видалення HEAD
працював! +1 для графічного зображення !!.
git reflog <branchname>
може бути дуже корисною, оскільки ви бачите зміни лише однієї гілки.
Ще один спосіб дістатися до видаленої фіксації - за допомогою git fsck
команди.
git fsck --lost-found
Це виведе щось на кшталт останнього рядка:
dangling commit xyz
Ми можемо перевірити, чи це той самий фільтр, reflog
як запропоновано в інших відповідях. Тепер ми можемо зробитиgit merge
git merge xyz
Примітка.
Ми не можемо повернути фіксацію, fsck
якщо ми вже виконали git gc
команду, яка видалить посилання на звисаючий коміт.