Вам нужно создать новый коммит с теми же деталями, что и текущий HEAD
коммит, но с родителем, как в предыдущей версии HEAD
. git reset --soft
переместит указатель ветвления так, чтобы следующий коммит происходил поверх другого коммита, чем текущий заголовок ветки.
# Move the current head so that it's pointing at the old commit
# Leave the index intact for redoing the commit.
# HEAD@{1} gives you "the commit that HEAD pointed at before
# it was moved to where it currently points at". Note that this is
# different from HEAD~1, which gives you "the commit that is the
# parent node of the commit that HEAD is currently pointing to."
git reset --soft HEAD@{1}
# commit the current tree using the commit details of the previous
# HEAD commit. (Note that HEAD@{1} is pointing somewhere different from the
# previous command. It's now pointing at the erroneously amended commit.)
git commit -C HEAD@{1}
git reflog
чтобы найти правильный номер, например{2}
.git commit --amend
. Второе - это «переделать» в новый коммит. Это работает для любогоgit commit
, а не только--amend
.git commit
.git reset --soft HEAD@{1}
:fatal: ambiguous argument 'HEAD@1': unknown revision or path not in the working tree. Use '--' to separate paths from revisions
. Когда я заменилHEAD@{1}
эквивалентный хеш коммита, показанный вgit reflog
(спасибо JJD!), Этот ответ работал чудесно!HEAD@{1}
. Если я,echo HEAD@{1}
например, запускаю tcsh, то вывод получитсяHEAD@1
потому, что скобки были интерпретированы tcsh. Если я использую одинарные кавычки, скобки сохраняются.используйте ref-log :
После этого все внесенные вами ранее изменения должны быть сохранены только в вашей рабочей копии, и вы можете подтвердить их снова.
чтобы увидеть полный список предыдущих типов индексов
git reflog
источник
HEAD@{1}
иHEAD~1
?HEAD~1
точно так же, какHEAD^
и идентификаторы родителя текущего коммита.HEAD@{1}
с другой стороны, относится к коммиту, на который HEAD указывал до этого, т.е. они означают разные коммиты, когда вы извлекаете другую ветку или изменяете коммит.git reset HEAD@{1}
достаточно.Найти исправленные коммиты можно по:
Примечание. Вы можете добавить
--patch
текст коммитов для ясности. То же самоеgit reflog
.затем сбросьте ваш HEAD на любой предыдущий коммит в тот момент, когда он был в порядке:
Примечание: замените SHA1 вашим реальным хэшем коммита. Также обратите внимание, что эта команда потеряет все незафиксированные изменения, поэтому вы можете сохранить их раньше. В качестве альтернативы используйте
--soft
вместо этого, чтобы сохранить последние изменения, а затем зафиксировать их.Затем выберите другой коммит, который вам нужен:
источник
git reset SHA1 --soft
, вы можете сохранить последние изменения, а затем зафиксировать их.Вы всегда можете разделить коммит, из руководства
источник
git reflog
это все, что вам нужноgit reset
вместоgit reset --soft
, потом делайgit add --patch
.Возможно, стоит отметить, что если вы все еще находитесь в редакторе с сообщением о коммите, вы можете удалить сообщение о коммите, и оно прервет выполнение
git commit --amend
команды.источник
Может быть, можно использовать,
git reflog
чтобы получить два коммита до изменения и после изменения.Затем используйте,
git diff before_commit_id after_commit_id > d.diff
чтобы получить разницу между до и после изменения.Далее используйте,
git checkout before_commit_id
чтобы вернуться к перед фиксациейИ последнее использование,
git apply d.diff
чтобы применить реальные изменения, которые вы сделали.Это решает мою проблему.
источник
Если вы передали коммит на удаленный, а затем ошибочно внесли изменения в этот коммит, это решит вашу проблему. Выполните
git log
команду a, чтобы найти SHA перед фиксацией. (предполагается, что удаленное имя называется источником). Теперь выполните эти команды, используя этот SHA.источник
Вы можете сделать ниже, чтобы отменить
git commit —amend
git reset --soft HEAD^
git checkout files_from_old_commit_on_branch
git pull origin your_branch_name
====================================
Теперь ваши изменения соответствуют предыдущим. Итак, вы сделали с отменой для
git commit —amend
Теперь вы можете сделать
git push origin <your_branch_name>
, чтобы подтолкнуть к ветке.источник
Почти 9 лет опоздал, но не увидел, что этот вариант упоминал о том, что он совершал одно и то же (это своего рода комбинация нескольких из них, аналогично верхнему ответу ( https://stackoverflow.com/a/1459264/4642530 ) ,
Обыщи все отдельные головы на ветке
git reflog show origin/BRANCH_NAME --date=relative
Тогда найдите хэш SHA1
Сбросить до старого SHA1
git reset --hard SHA1
Тогда поднимите это назад.
git push origin BRANCH_NAME
Выполнено.
Это вернет вас обратно к старому коммиту полностью.
(Включая дату предыдущего перезаписанного отдельного коммита)
источник
--soft
чтобы сохранить изменения. Я просто хочу, чтобы это совершалось отдельноОформить заказ на временную ветку с последним коммитом
git branch temp HEAD@{1}
Сбросить последний коммит
git reset temp
Теперь у вас будут все файлы вашего коммита, а также предыдущий коммит. Проверьте статус всех файлов.
git status
Сбросьте ваши файлы коммитов со стадии git.
git reset myfile1.js
(скоро)Прикрепите этот коммит
git commit -C HEAD@{1}
Добавить и зафиксировать ваши файлы для нового коммита.
источник