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

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

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

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

Ответы

Ответ 1

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

# Move the current head so that it pointing at the old commit
# Leave the index intact for redoing the commit.
# [email protected]{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 [email protected]{1}

# commit the current tree using the commit details of the previous
# HEAD commit. (Note that [email protected]{1} is pointing somewhere different from the
# previous command. It now pointing at the erroneously amended commit.)
git commit -C [email protected]{1}

Ответ 2

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

git branch fixing-things [email protected]{1}
git reset fixing-things

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

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

Ответ 3

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

git log --reflog

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

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

git reset SHA1 --hard

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

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

git cherry-pick SHA1

Ответ 4

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

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

Ответ 5

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

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

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

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

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

Ответ 6

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

Ответ 7

Вы можете сделать ниже, чтобы отменить ваш 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>, чтобы нажать на ветку.

Ответ 8

Если вы передали коммит на удаленный, а затем ошибочно внесли изменения в этот коммит, это решит вашу проблему. Выполните 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

Ответ 9

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

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

git reflog show origin/BRANCH_NAME --date=relative

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

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

git reset --hard SHA1

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

git push origin BRANCH_NAME

Готово.

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

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

Ответ 10

  • Проверка на временную ветку с последней фиксацией

    git branch temp [email protected]{1}

  • Reset last commit

    git reset temp

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

    git status

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

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

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

    git commit -C [email protected]{1}

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