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



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



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



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

1054   9  

9 ответов:

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

затем вишня-выбрать другой фиксации, что вам нужно на вершине его:

git cherry-pick SHA1

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

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

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

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

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

и последней используйте git apply d.diff чтобы применить реальные изменения, которые вы сделали.

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

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

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

почти на 9 лет позже этого, но не видел, чтобы эта вариация упоминалась, выполняя то же самое (это своего рода комбинация нескольких из них, похожая на top answer (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. прикрепить это совершение

    git commit -C HEAD@{1}

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

Comments

    Ничего не найдено.