Как отменить последние коммиты в Git?

Я случайно передал неправильные файлы Git, но я еще не запушил коммит на сервер.

Как я могу отменить эти коммиты из локального репозитория?

Вам также может понравиться

About the Author: qw

30 комментариев

  1. Отменить фиксацию и повторить

    $ git commit -m "Something terribly misguided"             # (1)
    $ git reset HEAD~                                          # (2)
    << edit files as necessary >>                              # (3)
    $ git add ...                                              # (4)
    $ git commit -c ORIG_HEAD                                  # (5)
    
    1. Это то, что вы хотите отменить
    2. Это оставляет рабочее дерево (состояние ваших файлов на диске) неизменным, но отменяет фиксацию и оставляет внесенные вами изменения недействительными (поэтому они будут отображаться как "Изменения не поставлены для фиксации" в git status, и вам нужно будет добавьте их еще до совершения). Если вы хотите добавить дополнительные изменения в предыдущую фиксацию или изменить сообщение коммита 1 вместо этого вы можете использовать git reset --soft HEAD~, что похоже на git reset HEAD~ (где HEAD~ совпадает с HEAD~1), но оставляет ваши существующие изменения.
    3. Внести исправления в файлы рабочих деревьев.
    4. git add все, что вы хотите включить в новый коммит.
    5. Зафиксируйте изменения, повторно используя старое сообщение коммита. reset скопировал старую голову в .git/ORIG_HEAD; commit с -c ORIG_HEAD откроет редактор, который изначально содержит сообщение журнала из старой фиксации и позволяет вам редактировать его. Если вам не нужно редактировать сообщение, вы можете использовать -c.

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

    Если код уже перенесен на ваш сервер, и у вас есть права на перезапись истории (rebase), тогда:

    git push origin master --force
    

    Вы также можете посмотреть на этот ответ:



    Как переместить HEAD обратно в предыдущее место? (Отдельная головка)

    Вышеупомянутый ответ покажет вам git reflog который используется, чтобы узнать, что такое SHA-1, к которому вы хотите вернуться. После того как вы нашли точку, в которую вы хотите отменить, использовать последовательность команд, как описано выше.


    1 Обратите внимание, однако, что вам не нужно выполнять сброс до более раннего фиксации, если вы только что допустили ошибку в своем сообщении о фиксации. Более простым вариантом является git reset (завышать любые изменения, которые вы сделали с тех пор), а затем git commit --amend, который откроет ваш редактор сообщений по умолчанию, предварительно заполненный последним сообщением фиксации.

  2. Отмена фиксации немного страшна, если вы не знаете, как это работает. Но это действительно удивительно легко, если вы понимаете.

    Скажите, что у вас есть это, где C — ваш ГОЛОВА, а (F) — состояние ваших файлов.

       (F)
    A-B-C
        ↑
      master
    

    Вы хотите, чтобы nuke совершил C, и больше не увидите его. Ты делаешь это:

    git reset --hard HEAD~1
    

    Результат:

     (F)
    A-B
      ↑
    master
    

    Теперь B — HEAD. Поскольку вы использовали --hard, ваши файлы сбрасываются в их состояние при фиксации B.

    Ах, но предположим, что совершение C не было катастрофой, а просто откупорено. Вы хотите отменить фиксацию, но сохраните свои изменения для небольшого редактирования, прежде чем выполнять более эффективную фиксацию. Начиная с этого момента, с C в качестве вашего HEAD:

       (F)
    A-B-C
        ↑
      master
    

    Вы можете сделать это, оставив --hard:

    git reset HEAD~1
    

    В этом случае результат:



       (F)
    A-B-C
      ↑
    master
    

    В обоих случаях HEAD — это всего лишь указатель на последнюю фиксацию. Когда вы выполняете git reset HEAD~1, вы указываете Git, чтобы переместить указатель HEAD назад на один фиксатор. Но (если вы не используете --hard), вы оставляете свои файлы такими, какие они есть. Итак, теперь git status показывает изменения, которые вы проверили на C. Вы ничего не потеряли!

    Для легкого прикосновения вы можете даже отменить фиксацию, но оставить свои файлы и свой индекс:

    git reset --soft HEAD~1
    

    Это не только оставляет ваши файлы в покое, но и оставляет ваш индекс в одиночку. Когда вы выполните git status, вы увидите, что те же файлы находятся в индексе, как и раньше. Фактически, сразу после этой команды вы можете выполнить git commit и вы будете переделывать тот же самый коммит, который у вас был.

    Еще одно: предположим, что вы уничтожаете фиксацию, как в первом примере, но затем обнаруживаете, что вам это нужно в конце концов? Жесткая удача, не так ли?

    Нет, еще есть способ вернуть его. Напечатайте git reflog и вы увидите список (частичных) git reflog которые вы переместили. Найдите скот, который вы уничтожили, и выполните следующее:

    git checkout -b someNewBranchName shaYouDestroyed
    

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

  3. Мне потребовалось некоторое время, чтобы понять, так что, возможно, это поможет кому-то…

    Существует два способа "отменить" ваш последний коммит, в зависимости от того, сделал ли вы общедоступный отчет (нажал на удаленный репозиторий):

    Как отменить локальную фиксацию

    Пусть говорят, что я совершил локально, но теперь хочу удалить эту фиксацию.

    git log
        commit 101: bad commit    # latest commit, this would be called 'HEAD'
        commit 100: good commit   # second to last commit, this is the one we want
    

    Чтобы восстановить все до того, как это было до последнего фиксации, нам нужно выполнить reset до фиксации перед HEAD:

    git reset --soft HEAD^     # use --soft if you want to keep your changes
    git reset --hard HEAD^     # use --hard if you don't care about keeping the changes you made
    

    Теперь git log покажет, что наша последняя фиксация была удалена.

    Как отменить публичную фиксацию

    Если вы уже сделали свои коммиты общедоступными, вам нужно будет создать новый коммит, который "вернет" изменения, внесенные вами в предыдущую фиксацию (текущий HEAD).

    git revert HEAD
    

    Теперь ваши изменения будут отменены и готовы к фиксации:

    git commit -m 'restoring the file I removed by accident'
    git log
        commit 102: restoring the file I removed by accident
        commit 101: removing a file we don't need
        commit 100: adding a file that we need
    

    Для получения дополнительной информации, ознакомьтесь с Основами Git — Отменить вещи

  4. Добавить/удалить файлы, чтобы получить то, что вы хотите:

    git rm classdir
    git add sourcedir
    

    Затем измените фиксацию:

    git commit --amend
    

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

    Обратите внимание, что вы должны сделать это только в том случае, если вы еще не нажали. Если вы нажали, вам просто придется совершить исправить нормально.

  5. git rm yourfiles/*.class
    git commit -a -m "deleted all class files in folder 'yourfiles'"
    

    или

    git reset --hard HEAD~1
    

    Предупреждение. Вышеупомянутая команда навсегда удалит изменения в .java файлах (и любых других файлах), которые вы хотите зафиксировать.

    hard reset в HEAD-1 установит вашу рабочую копию в состояние фиксации до вашего неправильного фиксации.

  6. Чтобы изменить последнее фиксацию

    Замените файлы в индексе:

    git rm --cached *.class
    git add *.java
    

    Затем, если это частный филиал, измените фиксацию:

    git commit --amend
    

    Или, если это общая ветка, выполните новую фиксацию:

    git commit -m 'Replace .class files with .java files'
    

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


    ProTip ™: добавьте *.class в gitignore, чтобы остановить это повторение.


    Чтобы вернуть фиксацию

    Изменение коммита — идеальное решение, если вам нужно изменить последнее коммит, но reset более общее решение.

    Вы можете сбросить git на любой фиксатор с помощью:

    git reset @~N
    

    Где N — количество коммитов перед HEAD, а @~ возврат к предыдущему фиксации.

    Итак, вместо внесения изменений в коммит вы можете использовать:

    git reset @~
    git add *.java
    git commit -m "Add .java files"
    

    Проверьте git help reset, в частности разделы --soft --mixed и --hard, чтобы лучше понять, что это делает.

    Reflog

    Если вы испортились, вы всегда можете использовать reflog, чтобы найти удаленные коммиты:

    $ git reset @~
    $ git reflog
    c4f708b HEAD@{0}: reset: moving to @~
    2c52489 HEAD@{1}: commit: added some .class files
    $ git reset 2c52489
    ... and you're back where you started
    

  7. Если вы планируете полностью отменить локальную фиксацию, независимо от того, что вы изменили, вы сделали в фиксации, и если вы ничего не волнуетесь об этом, просто выполните следующую команду.

    git reset --hard HEAD^1
    

    (Эта команда будет игнорировать всю вашу фиксацию, и ваши изменения будут полностью потеряны из вашего локального рабочего дерева). Если вы хотите отменить фиксацию, но хотите внести изменения в промежуточную область (перед фиксацией точно так же, как после git add), выполните следующую команду.

    git reset --soft HEAD^1
    

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

    git reset HEAD
    

    Теперь переданные файлы поступают из поэтапной области в непоставленную область. Теперь файлы готовы к редактированию, поэтому, что бы вы ни изменили, вы хотите перейти к редактированию и добавить его и создать новый/новый коммит.

    Больше

  8. Если у вас установлена Git Extras, вы можете запустить git undo чтобы отменить последнюю фиксацию. git undo 3 отменяет последние 3 фиксации.

  9. Я хотел отменить последние 5 коммитов в нашем общем хранилище. Я просмотрел идентификатор ревизии, к которому я хотел откат. Затем я набрал следующее.

    prompt> git reset --hard 5a7404742c85
    HEAD is now at 5a74047 Added one more page to catalogue
    prompt> git push origin master --force
    Total 0 (delta 0), reused 0 (delta 0)
    remote: bb/acl: neoneye is allowed. accepted payload.
    To git@bitbucket.org:thecompany/prometheus.git
     + 09a6480...5a74047 master -> master (forced update)
    prompt>
    

  10. Я предпочитаю использовать git rebase -i для этого задания, потому что появляется хороший список, где я могу выбрать коммиты, чтобы избавиться. Это может быть не так прямо, как некоторые другие ответы здесь, но это просто кажется правильным.

    Выберите количество коммитов, которые вы хотите перечислить, затем вызовите это (чтобы забрать последние три)

    git rebase -i HEAD~3
    

    Примерный список

    pick aa28ba7 Sanity check for RtmpSrv port
    pick c26c541 RtmpSrv version option
    pick 58d6909 Better URL decoding support
    

    Затем git удалит фиксации для любой удаляемой строки.

  11. Как исправить предыдущую локальную фиксацию

    Используйте git-gui (или подобное) для выполнения git commit --amend. Из графического интерфейса вы можете добавлять или удалять отдельные файлы из фиксации. Вы также можете изменить сообщение коммита.

    Как отменить предыдущую локальную фиксацию

    Просто верните ветку в предыдущее место (например, используя gitk или git rebase). Затем повторите внесение изменений из сохраненной копии. После сбора мусора в вашем локальном репозитории, это будет похоже на то, что нежелательная фиксация никогда не происходила. Чтобы сделать все это в одной команде, используйте git reset HEAD~1.

    Слово предупреждения: Небрежное использование git reset — хороший способ заставить вашу рабочую копию запутать состояние. Я рекомендую, чтобы новички Git избегали этого, если могли.

    Как отменить публичную фиксацию

    Выполните обратную вишню (git-revert), чтобы отменить изменения.

    Если вы еще не ввели другие изменения в свою ветку, вы можете просто сделать…

    git revert --no-edit HEAD
    

    Затем нажмите обновленную ветку в общий репозиторий.

    В истории фиксации будут отображаться обе фиксации отдельно.


    Дополнительно: Исправление частной ветки в общедоступном хранилище

    Это может быть опасно — убедитесь, что у вас есть локальная копия ветки, чтобы отменить.

    Также обратите внимание: вы не хотите этого делать, если кто-то другой может работать в филиале.

    git push --delete (branch_name) ## remove public version of branch
    

    Очистите свою ветку локально, затем отпустите…

    git push origin (branch_name)
    

    В нормальном случае вам, вероятно, не нужно беспокоиться о том, что история фиксации частного ветки является нетронутой. Просто нажмите фиксацию последующего действия (см. "Как отменить публичный коммит" выше), а затем выполните сквош-слияние, чтобы скрыть историю.

  12. Если вы совершили ошибку, но не нажали,

    git reset --soft HEAD~1
    

    HEAD ~ 1 является сокращением для фиксации перед головой. В качестве альтернативы вы можете обратиться к SHA-1 хэша, если вы хотите сбросить его. —soft удалит коммит, но он оставит все ваши измененные файлы "Изменения будут совершены", как сказал бы статус git.

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

    ИЛИ

    Если вы уже нажали, и кто-то потянул, что обычно является моим делом, вы не можете использовать сброс git. Однако вы можете сделать git revert,

    git revert HEAD
    

    Это создаст новую фиксацию, которая отменяет все, введенное случайным фиксацией.

  13. Если вы хотите окончательно отменить его, и вы клонировали некоторый репозиторий

    Идентификатор фиксации можно увидеть

    git log 
    

    Тогда вы можете сделать —

    git reset --hard <commit_id>
    
    git push origin <branch_name> -f
    

  14. В SourceTree (GUI для GitHub) вы можете щелкнуть правой кнопкой мыши фиксацию и выполнить "Обратный фиксат". Это должно отменить ваши изменения.

    На терминале:

    Вы также можете использовать:

    git revert
    

    Или:

    git reset --soft HEAD^ # Use --soft if you want to keep your changes.
    git reset --hard HEAD^ # Use --hard if you don't care about keeping your changes.
    

  15. Просто сбросьте его, выполнив команду ниже, используя git:

    git reset --soft HEAD~1
    

    Объясните: что делает git reset, он в основном reset на любой фиксатор, на который вы хотите вернуться, тогда, если вы объедините его с --soft, он вернется, но сохранит изменения в ваших файлах, поэтому вы вернетесь на сцену, в которую был добавлен файл, HEAD — глава ветки, и если вы объединитесь с ~1 (в этом случае вы также используете HEAD^), он вернется только к одной команде, которую вы хотите…

    Я создаю шаги на изображении ниже более подробно для вас, включая все шаги, которые могут произойти в реальных ситуациях и совершение кода:

    How to undo the last commits in Git?

  16. Как отменить последний Git?

    Чтобы восстановить все до того, как это было до последнего фиксации, нам нужно сбросить фиксацию до HEAD.

    1. Если вы не хотите сохранять свои изменения, которые вы сделали:

      git reset --hard HEAD^
      
    2. Если вы хотите сохранить свои изменения:

      git reset --soft HEAD^
      

    Теперь проверьте свой журнал git. Он покажет, что наша последняя фиксация была удалена.

  17. Используйте reflog, чтобы найти правильное состояние

    git reflog
    

    reflog before REFLOG ПЕРЕД СБРОСОМ

    Выберите правильный рефлог (f3cb6e2 в моем случае) и введите

    git reset --hard f3cb6e2
    

    После этого HEAD возвращается в HEADid reset effect LOG AFTER RESET

    Наконец, reflog выглядит как картинка ниже

    reflog after REFLOG FINAL

  18. "Сбросить рабочее дерево до последнего фиксации"

    git reset --hard HEAD^ 
    

    "Очистить неизвестные файлы от рабочего дерева"

    git clean    
    

    см. — Краткая ссылка Git

    ПРИМЕЧАНИЕ. Эта команда удалит предыдущую фиксацию, поэтому используйте ее с осторожностью! git reset --hard безопаснее —

  19. Первый забег:

    git reflog
    

    Он покажет вам все возможные действия, которые вы выполнили в своем репозитории, например, commit, merge, pull и т.д.

    Затем выполните:

    git reset --hard ActionIdFromRefLog
    

  20. Другой путь:

    Оформите заявку на филиал, который хотите вернуть, затем верните локальную рабочую копию обратно на коммит, который вы хотите быть последним на удаленном сервере (все после того, как оно пройдет до свидания). Для этого в SourceTree я щелкнул правой кнопкой мыши и выбрал "Сбросить BRANCHNAME на это коммит".

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

    git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME
    

    Это приведет к удалению всех коммитов после текущего в локальном репозитории, но только для одной ветки.

  21. Отменить последнее коммит:

    git reset --soft HEAD^ или git reset --soft HEAD~

    Это приведет к отмене последнего фиксации.

    Здесь --soft означает сброс настроек.

    HEAD~ или HEAD^ означает переход к фиксации перед HEAD.


    Заменить последнюю фиксацию на новую фиксацию:

    git commit --amend -m "message"
    

    Он заменит последнее коммит новым фиксатором.

  22. В моем случае я случайно совершил некоторые файлы, которые я не хотел. Поэтому я сделал следующее, и это сработало:

    git reset --soft HEAD^
    git rm --cached [files you do not need]
    git add [files you need]
    git commit -c ORIG_HEAD
    

    Проверьте результаты с помощью gitk или git log —stat

  23. Используйте SourceTree (графический инструмент для Git), чтобы увидеть ваши коммиты и дерево. Вы можете вручную сбросить его, щелкнув правой кнопкой мыши.

  24. Существует два основных сценария

    Вы еще не нажали фиксацию

    Если проблема связана с дополнительными файлами, которые вы совершили (и вы не хотите их использовать в репозитории), вы можете удалить их с помощью git rm а затем --amend с --amend

    git rm <pathToFile>
    

    Вы также можете удалить целые каталоги с помощью -r или даже объединить с другими командами Bash

    git rm -r <pathToDirectory>
    git rm $(find -name '*.class')
    

    После удаления файлов вы можете зафиксировать с помощью опции —amend

    git commit --amend -C HEAD # the -C option is to use the same commit message
    

    Это позволит переписать недавний локальный коммит, удалив лишние файлы, поэтому эти файлы никогда не будут отправляться на push, а также будут удалены из вашего локального репозитория.git через GC.

    Вы уже нажали на фиксацию

    Вы можете применить одно и то же решение другого сценария, а затем выполнить git push с -f опции -f, но это не рекомендуется, так как он перезаписывает удаленную историю с расходящимся изменением (это может испортить ваш репозиторий).

    Вместо этого вам необходимо выполнить фиксацию без --amend (помните об этом -amend ": этот вариант перезаписывает историю последнего коммита).

  25. Есть много способов сделать это:

    Команда Git для отмены последнего фиксации/предыдущих коммитов:

    Предупреждение: Не используйте —hard, если вы не знаете, что делаете. —hard слишком опасен, и он может удалить ваши файлы.

    Основная команда для отмены фиксации в Git:

    $ git reset --hard <COMMIT -ID>
    

    или

    $ git reset --hard HEAD~<n>
    

    COMMIT-ID: идентификатор для фиксации

    n: число последних коммитов, которые вы хотите вернуть

    Вы можете получить идентификатор фиксации, как показано ниже:

    $ **git log --oneline**
    
    d81d3f1 function to subtract two numbers
    
    be20eb8 function to add two numbers
    
    bedgfgg function to mulitply two numbers
    

    где d81d3f1 и be20eb8 — идентификатор commit.

    Теперь рассмотрим некоторые случаи:

    Предположим, вы хотите вернуть последнее коммит 'd81d3f1'. Вот два варианта:

    $ git reset --hard d81d3f1
    

    или

    $ git reset --hard HEAD~1
    

    Предположим, вы хотите вернуть commit 'be20eb8':

    $ git reset --hard be20eb8
    

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

    $ git reset --help
    

  26. Чтобы вернуться к предыдущей ревизии, навсегда удалите все незафиксированные изменения:

    git reset --hard HEAD~1
    

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *