Как отменить "git commit --amend" сделано вместо " git commit"
я случайно изменил свой предыдущий коммит. Фиксация должна была быть отдельной, чтобы сохранить историю изменений, которые я внес в конкретный файл.
есть ли способ, чтобы отменить последний коммит? Если я сделаю что-то вроде git reset --hard HEAD^, первый коммит также отменено.
(Я еще не нажал на какие-либо удаленные каталоги)
9 ответов:
что вам нужно сделать, это создать новый коммит с такими же подробностями, как ток!--1--> commit, но с родителем в качестве предыдущей версии
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}
использовать ref-log:
git branch fixing-things HEAD@{1} git reset fixing-thingsвы должны иметь все ваши ранее внесены изменения только в вашей рабочей копии и может снова совершить
чтобы увидеть полный список предыдущих индексов типа
git reflog
найдите свои исправленные коммиты:
git log --reflogПримечание: Вы можете добавить
--patchчтобы увидеть тело совершает для ясности. То же, что иgit reflog.затем сбросьте голову на любую предыдущую фиксацию в точке, где это было нормально:
git reset SHA1 --hardПримечание: заменить SHA1 с вашим реальным хэшем фиксации. Также обратите внимание, что эта команда будет сбросить любые незафиксированные изменения, так что вы можете держать их до. В качестве альтернативы использовать
--softвместо.затем вишня-выбрать другой фиксации, что вам нужно на вершине его:
git cherry-pick SHA1
вы всегда можете разделить совершить, Из руководство
- запустить интерактивный перебазирования с Git перебазирования -я предаю^, где фиксация фиксации, которую вы хотите разделить. Фактически, любой диапазон фиксации будет делать, пока он содержит эту фиксацию.
- отметьте фиксацию, которую вы хотите разделить с помощью действия "редактировать".
- когда дело доходит до редактирования этой фиксации, выполните git reset HEAD^. Эффект заключается в том, что голова перематывается на один, а индекс следует подходить. Однако, рабочее дерево остается прежним.
- теперь добавьте изменения в индекс, который вы хотите иметь в первой фиксации. Вы можете использовать git add (возможно, в интерактивном режиме) или Git-gui (или оба) для этого.
- зафиксируйте теперь текущий индекс с любым сообщением фиксации, которое подходит сейчас.
- повторите последние два шага, пока ваше рабочее дерево не станет чистым.
- продолжить перебазирование с помощью git rebase --продолжить.
может быть, можно использовать
git reflogчтобы получить два фиксации до изменения и после изменения.затем использовать
git diff before_commit_id after_commit_id > d.diffчтобы получить разницу между до изменения и после изменения.далее использовать
git checkout before_commit_idвернуться до фиксациии последней используйте
git apply d.diffчтобы применить реальные изменения, которые вы сделали.это решает мою проблему.
возможно, стоит отметить, что если вы все еще в редакторе с фиксацией сообщение, вы можете удалить сообщение и прервет .
вы можете сделать ниже, чтобы отменить свой "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", чтобы нажать на ветку
почти на 9 лет позже этого, но не видел, чтобы эта вариация упоминалась, выполняя то же самое (это своего рода комбинация нескольких из них, похожая на top answer (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сделано.
это вернет вас обратно к старой фиксации полностью.
(включая дату предыдущей перезаписанной отсоединенной головки фиксации)
проверка на временную ветку с последней фиксацией
git branch temp HEAD@{1}сброс последнего коммита
git reset tempтеперь у вас будут все файлы вашего коммита, а также предыдущего коммита. Проверьте состояние всех файлов.
git statusсброс файлов фиксации с этапа git.
git reset myfile1.js(так далее)прикрепить это совершение
git commit -C HEAD@{1}добавить и зафиксировать ваши файлы для новой фиксации.
Comments