Как отменить "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"

  1. $ git reset --мягкая головка^
  2. $ git checkout files_from_old_commit_on_branch
  3. $ 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

сделано.

это полностью вернет вас к старой фиксации.

(включая дату предыдущей перезаписанной отдельной главы фиксации)


  1. выезд во временную ветку с последней фиксацией

    git branch temp HEAD@{1}

  2. сбросить последнюю фиксацию

    git reset temp

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

    git status

  4. сброс файлов фиксации со стадии git.

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

  5. прикрепить это commit

    git commit -C HEAD@{1}

  6. добавить и зафиксировать файлы на новую фиксацию.