Как отменить "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
-
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>
, чтобы нажать на ветку.
Ответ 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}
-
Добавьте и зафиксируйте свои файлы для нового коммита.