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