Как отменить "git commit -amend" done вместо "git commit"

Я случайно изменил свою предыдущую фиксацию. Конец должен быть отдельным, чтобы сохранить историю изменений, внесенных мной в конкретный файл.

Есть ли способ отменить последнее коммит? Если я делаю что-то вроде git reset --hard HEAD^, первая фиксация также отменяется.

(я еще не нажал ни на какие удаленные каталоги)

1075
22 сент. '09 в 12:56
источник поделиться
10 ответов

Что вам нужно сделать, так это создать новый коммит с теми же деталями, что и текущий HEAD commit, но с родителем как с предыдущей версией HEAD. git reset --soft будет перемещать указатель на ветку, чтобы следующая фиксация выполнялась поверх другой фиксации, от которой теперь находится текущая ветка.

# Move the current head so that it 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 now pointing at the erroneously amended commit.)
git commit -C HEAD@{1}
1885
22 сент. '09 в 13:23
источник

Связанные вопросы


Похожие вопросы

используйте ref-log:

git branch fixing-things HEAD@{1}
git reset fixing-things

вы должны иметь все свои измененные изменения только в своей рабочей копии и снова выполнить фиксацию

чтобы увидеть полный список предыдущих типов индексов git reflog

116
22 сент. '09 в 13:02
источник

Найти исправленные коммиты можно по:

git log --reflog

Примечание. Вы можете добавить --patch чтобы увидеть --patch для ясности.То же, что и git reflog.

затем сбросьте ваш HEAD на любой предыдущий коммит в тот момент, когда он был в порядке:

git reset SHA1 --hard

Примечание: замените SHA1 вашим реальным хэшем коммита.Также обратите внимание, что эта команда потеряет все незафиксированные изменения, поэтому вы можете сохранить их раньше.Или используйте вместо этого --soft чтобы сохранить последние изменения, а затем зафиксировать их.

Затем выберите другой коммит, который вам нужен:

git cherry-pick SHA1
47
27 марта '16 в 4:56
источник

Вы всегда можете разделить фиксацию, Из руководства

  • Запустите интерактивную перезагрузку с помощью git rebase -i commit ^, где commit - это фиксация, которую вы хотите разделить. Фактически, любой диапазон фиксации будет действовать, если он содержит это commit.
  • Отметьте фиксацию, которую вы хотите разделить, с действием "редактировать".
  • Когда дело доходит до редактирования этого сообщения, выполните git reset HEAD ^. Эффект заключается в том, что HEAD перематывается на один, и индекс следует примеру. Однако рабочее дерево остается прежним.
  • Теперь добавьте изменения в индекс, который вы хотите иметь в первом коммите. Вы можете использовать git add (возможно, интерактивно) или git -gui (или оба) для этого.
  • Зафиксировать текущий текущий индекс с любым сообщением о фиксации. Теперь
  • Повторите два последних шага, пока ваше рабочее дерево не станет чистым.
  • Продолжить перезагрузку с помощью git rebase -continue.
22
22 сент. '09 в 13:01
источник

Возможно, стоит отметить, что если вы все еще находитесь в своем редакторе с сообщением фиксации, вы можете удалить сообщение о фиксации, и оно прервет команду git commit --amend.

13
03 марта '17 в 21:45
источник

Может быть, можно использовать git reflog, чтобы получить две фиксации до изменения и после изменения.

Затем используйте git diff before_commit_id after_commit_id > d.diff, чтобы получить разницу между изменением и после изменения.

Затем используйте git checkout before_commit_id для возврата до фиксации

И последнее использование git apply d.diff для применения реальных изменений.

Это решает мою проблему.

13
20 сент. '16 в 15:39
источник

Вы можете сделать ниже, чтобы отменить ваш git commit —amend

  1. git reset --soft HEAD^
  2. git checkout files_from_old_commit_on_branch
  3. git pull origin your_branch_name

====================================

Теперь ваши изменения соответствуют предыдущим. Итак, вы закончили с отменой git commit —amend

Теперь вы можете сделать git push origin <your_branch_name>, чтобы нажать на ветку.

3
25 июня '18 в 14:46
источник

Почти 9 лет опоздал, но не увидел, что этот вариант упоминал о том, что он совершал одно и то же (это своего рода комбинация нескольких из них, аналогично верхнему ответу (qaru.site/questions/11810/...),

Обыщи все отдельные головы на ветке

git reflog show origin/BRANCH_NAME --date=relative

Затем найдите хэш SHA1

Сброс на старый SHA1

git reset --hard SHA1

Тогда поднимите это назад.

git push origin BRANCH_NAME

Готово.

Это вернет вас обратно к старому коммиту полностью.

(Включая дату предыдущего перезаписанного отдельного коммита)

2
18 июня '18 в 0:55
источник
  • Проверка на временную ветку с последней фиксацией

    git branch temp HEAD@{1}

  • Reset last commit

    git reset temp

  • Теперь у вас будут все файлы с фиксацией, а также с предыдущим фиксацией. Проверьте состояние всех файлов.

    git status

  • Reset ваши файлы фиксации с этапа git.

    git reset myfile1.js (так далее)

  • Повторите эту фиксацию

    git commit -C HEAD@{1}

  • Добавьте и зафиксируйте свои файлы для нового коммита.

1
04 марта '16 в 10:28
источник

Если вы передали коммит на удаленный, а затем ошибочно внесли изменения в этот коммит, это решит вашу проблему. Выполните git log чтобы найти SHA перед фиксацией. (предполагается, что удаленное имя называется источником). Теперь выполните эти команды, используя этот SHA.

git reset --soft <SHA BEFORE THE AMMEND>
#you now see all the changes in the commit and the amend undone

#save ALL the changes to the stash
git stash

git pull origin <your-branch> --ff-only
#if you issue git log you can see that you have the commit you didn't want to amend

git stash pop
#git status reveals only the changes you incorrectly amended

#now you can create your new unamended commit
0
24 апр. '19 в 21:26
источник

Посмотрите другие вопросы по меткам или Задайте вопрос