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

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

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

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

819
задан Jesper Rønn-Jensen 22 сент. '09 в 12:56
источник поделиться

7 ответов

Что вам нужно сделать, так это создать новый коммит с теми же деталями, что и текущий 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}
1418
ответ дан Charles Bailey 22 сент. '09 в 13:23
источник поделиться

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

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

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

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

88
ответ дан knittl 22 сент. '09 в 13:02
источник поделиться

Найдите исправленные изменения:

git log --reflog

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

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

git reset SHA1 --hard

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

Затем вишня выберите другую фиксацию, которая вам нужна:

git cherry-pick SHA1
19
ответ дан kenorb 27 марта '16 в 4:56
источник поделиться

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

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

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

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

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

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

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

10
ответ дан utzcoz 20 сент. '16 в 15:39
источник поделиться

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

4
ответ дан Justin Schulz 03 марта '17 в 21:45
источник поделиться
  • Проверка на временную ветку с последней фиксацией

    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
ответ дан Priyanshu Chauhan 04 марта '16 в 10:28
источник поделиться

Другие вопросы по меткам