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

Я случайно передал неправильные файлы Git , но я еще не нажал фиксацию на сервер.

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

вопрос задан 29.05.2009
Hamza Yerlikaya
25643 репутация

75 ответов


  • 19662 рейтинг

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

     $ 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 добавит их к вашему предыдущему фиксации.

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

     git push origin master --force
     

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

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

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


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

    ответ дан Esko Luontola, с репутацией 65368, 29.05.2009
  • 9837 рейтинг

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

    Скажите, что у вас есть это, где 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 и вы увидите список (частичных) команд shas, ​​которые вы переместили. Найдите скот, который вы уничтожили, и выполните следующее:

     git checkout -b someNewBranchName shaYouDestroyed
     

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

    ответ дан Ryan Lundy, с репутацией 152014, 28.07.2011
  • 1792 рейтинг

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

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

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

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

     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 - Отменить вещи

    ответ дан Andrew, с репутацией 93274, 16.06.2011
  • 1634 рейтинг

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

     git rm classdir
    git add sourcedir
     

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

     git commit --amend
     

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

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

    ответ дан bdonlan, с репутацией 170015, 29.05.2009
  • 892 рейтинг
     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 ваша рабочая копия будет установлена ​​в состояние коммита до вашего неправильного коммита.

    ответ дан Lennart Koopmann, с репутацией 14329, 29.05.2009
  • 686 рейтинг

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

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

     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
     


    ответ дан Zaz, с репутацией 24240, 31.07.2010
  • 558 рейтинг

    Использовать git revert commit-id

    Чтобы получить идентификатор фиксации, просто используйте git log

    ответ дан Jaco Pretorius, с репутацией 20028, 25.05.2012
  • 447 рейтинг

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

     git reset --hard HEAD^1
     

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

     git reset --soft HEAD^1
     

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

     git reset HEAD
     

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

    Больше

    ответ дан Madhan Ayyasamy, с репутацией 9811, 31.01.2013
  • 437 рейтинг

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

    ответ дан nickf, с репутацией 362144, 13.12.2011
  • 404 рейтинг

    Я хотел отменить последние 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>
     
    ответ дан neoneye, с репутацией 29516, 6.04.2012
  • 384 рейтинг

    Я предпочитаю использовать 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 удалит фиксации для любой удаляемой строки.

    ответ дан Steven Penny, с репутацией 1, 25.10.2012
  • 367 рейтинг

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

    Используйте 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)
     

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

    ответ дан nobar, с репутацией 23812, 23.04.2013
  • 301 рейтинг

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

     git reset --soft HEAD~1
     

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

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

    ИЛИ ЖЕ

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

     git revert HEAD
     

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

    ответ дан santos_mgr, с репутацией 22, 3.09.2014
  • 295 рейтинг

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

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

     git log 
     

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

     git reset --hard <commit_id>
    
    git push origin <branch_name> -f
     
    ответ дан poorva, с репутацией 948, 17.05.2013
  • 250 рейтинг

    В 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.
     
    ответ дан Varun Parakh, с репутацией 10, 28.06.2013
  • 236 рейтинг

    Единая команда:

     git reset --soft 'HEAD^' 
     

    Он отлично работает, чтобы отменить последнюю локальную фиксацию!

    ответ дан Manish Shrivastava, с репутацией 17323, 5.03.2014
  • 211 рейтинг

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

     git reset --soft HEAD~1
     

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

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

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

    ответ дан Alireza, с репутацией 39782, 21.06.2017
  • 208 рейтинг

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

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

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

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

       git reset --soft HEAD^
       

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

    ответ дан Ranjithkumar Ravi, с репутацией 2319, 23.04.2014
  • 167 рейтинг

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

     git reflog
     

    reflog перед REFLOG ПЕРЕД СБРОСОМ

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

     git reset --hard f3cb6e2
     

    После этого HEAD возвращается к HEADid сбросить эффект LOG ПОСЛЕ СБРОСА

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

    reflog после REFLOG FINAL

    ответ дан Shubham Chaudhary, с репутацией 11890, 6.01.2014
  • 156 рейтинг

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

     git reset --hard HEAD^ 
     

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

     git clean    
     

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

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

    ответ дан Ravi_Parmar, с репутацией 10431, 3.10.2013
  • 148 рейтинг

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

     git reflog
     

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

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

     git reset --hard ActionIdFromRefLog
     
    ответ дан U. Ali, с репутацией 71, 11.10.2013
  • 133 рейтинг

    Другой путь:

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

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

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

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

    ответ дан CommaToast, с репутацией 4711, 13.05.2013
  • 131 рейтинг

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

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

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

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

    HEAD~ или HEAD^ означает перемещение для фиксации перед ГОЛОВКОЙ.


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

     git commit --amend -m "message"
     

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

    ответ дан akshay_rahar, с репутацией 785, 6.03.2016
  • 126 рейтинг

    Введите git log и найдите последний код хеширования и введите:

     git reset <the previous co>
     
    ответ дан user853293, с репутацией 31, 15.05.2013
  • 123 рейтинг

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

     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

    ответ дан egridasov, с репутацией 359, 18.07.2013
  • 112 рейтинг

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

    ответ дан iOS Coder, с репутацией 19, 29.08.2013
  • 110 рейтинг

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

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

    Если проблема связана с дополнительными файлами, которые вы совершили (и вы не хотите их использовать в репозитории), вы можете удалить их с помощью git rm а затем совершить с --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 , но это не рекомендуется, поскольку он перезаписывает удаленную историю с различными изменениями (это может испортить ваш репозиторий).

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

    ответ дан dseminara, с репутацией 9392, 12.09.2014
  • 95 рейтинг

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

    Команда 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
     
    ответ дан user3799762, с репутацией 307, 18.02.2016
  • 94 рейтинг

    Простой, запустите это в командной строке:

     git reset --soft HEAD~ 
     
    ответ дан kyo, с репутацией 16163, 6.01.2016
  • 86 рейтинг

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

     git reset --hard HEAD~1
     
    ответ дан thestar, с репутацией 2242, 28.08.2014
  • 82 рейтинг

    В этой статье есть отличное объяснение того, как идти о различных сценариях (где совершена фиксация, а также нажать «ИЛИ» только коммит до нажатия):

    http://christoph.ruegg.name/blog/git-howto-revert-a-commit-already-pushed-to-a-remote-reposit.html

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

     git revert dd61ab32
     
    ответ дан AmpT, с репутацией 1319, 6.02.2014
  • 79 рейтинг

    Если вы хотите удалить файлы в последнем коммите, вы можете использовать это:

     git reset --hard HEAD~1
     

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

     git reset --soft HEAD~1
     
    ответ дан aya, с репутацией 1003, 10.01.2017
  • 68 рейтинг

    Для локальной фиксации

     git reset --soft HEAD~1
     

    или если вы точно не помните, в какой фиксации это возможно, вы можете использовать

     git rm --cached <file>
     

    Для нажатой фиксации

    Правильный способ удаления файлов из истории репозитория - использование git filter-branch . То есть,

     git filter-branch --index-filter 'git rm --cached <file>' HEAD
     

    Но я рекомендую вам использовать эту команду с осторожностью. Подробнее читайте в разделе git-filter-branch (1) Manual .

    ответ дан geoom, с репутацией 1051, 4.03.2014
  • 57 рейтинг

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

     git reset HEAD@{1}
     

    Эта команда удалит неправильную фиксацию без журнала Git.

    ответ дан Min Han, с репутацией 199, 29.06.2016
  • 55 рейтинг

    Обычно вы хотите отменить фиксацию, потому что вы допустили ошибку, и хотите ее исправить - по существу, что сделал OP, когда он задал вопрос. Так что вы действительно хотите переделать фиксацию.

    Большинство ответов здесь сосредоточены на командной строке. В то время как командная строка - лучший способ использовать Git, когда вам удобно, это, вероятно, немного чуждо тем, кто приходит из других систем управления версиями в Git.

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

    ПРИМЕЧАНИЕ. Я предполагаю, что вы поняли, что совершение было неправильным, прежде чем вы его подтолкнули. Если вы не знаете, что такое толкание, вы, вероятно, не нажали, так что продолжайте с инструкциями. Если вы допустили ошибочную фиксацию, наименее рискованным способом является просто отслеживание ошибочного фиксации с помощью нового коммита, который исправляет все, как вы это делали в системе контроля версий, которая не позволяет вам переписывать историю.

    Тем не менее, вот как исправить последнее сообщение об ошибке с помощью графического интерфейса:

    1. Перейдите в свой репозиторий в командной строке и запустите gui с помощью git gui
    2. Выберите «Изменить последнее завершение». Вы увидите последнее сообщение о фиксации, файлы, которые вы поставили, и файлы, которые у вас не были.
    3. Теперь измените ситуацию так, как вы хотите, чтобы они выглядели, и нажмите «Зафиксировать».
    ответ дан Carl, с репутацией 29600, 18.11.2014
  • 52 рейтинг

    ЧТО ИСПОЛЬЗОВАТЬ, reset --soft или reset --hard ?

    Я просто добавляю два цента за ответ @ Kyralessa:

    Если вы не уверены, что использовать go для --soft (я использовал это соглашение, чтобы запомнить его - s for for safe).

    Зачем ?

    Если вы выберете --hard по ошибке, вы потеряете свои изменения, как это было раньше. Если вы выберете --soft по ошибке, вы можете добиться тех же результатов --hard , применяя дополнительные команды

     git reset HEAD file.html
    git checkout -- file.html
     

    Полный пример

     echo "some changes..." > file.html
    git add file.html
    git commit -m "wrong commit"
    
    # I need to reset
    git reset --hard HEAD~1 (cancel changes)
    # OR
    git reset --soft HEAD~1 # Back to staging
    git reset HEAD file.html # back to working directory
    git checkout -- file.html # cancel changes
     

    Кредиты идут на @ Kyralessa.

    ответ дан amd, с репутацией 13128, 28.07.2016
  • 51 рейтинг

    Если вы работаете с SourceTree , это поможет вам.

    Щелкните правой кнопкой мыши фиксацию, затем выберите « Сброс (текущая ветка) /мастер для этой фиксации » и последний выбор «Мягкий» сброс .

    Введите описание изображения здесь

    ответ дан Alexandr, с репутацией 2622, 29.07.2016
  • 46 рейтинг

    Подумайте, у нас есть файл code.txt . Мы вносим в него некоторые изменения и совершаем. Мы можем отменить эту фиксацию тремя способами , но сначала вы должны знать, что такое поэтапный файл ... Поэтапный файл - это файл, готовый к фиксации, и если вы запустите git status этот файл будет отображаться зеленым цветом, и если это не поставленный для фиксации будет отображаться красным цветом:

    введите описание изображения здесь

    Это означает, что если вы сделаете свое изменение, ваши изменения в этом файле не будут сохранены. Вы можете добавить этот файл на своем этапе с помощью git add code.txt а затем зафиксировать свое изменение:

    введите описание изображения здесь

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

    1. Теперь, если мы хотим просто отменить фиксацию без каких-либо изменений, мы можем использовать

      git reset --soft HEAD^

      введите описание изображения здесь

    2. Если мы хотим отменить фиксацию и ее изменения ( ЭТО ОПАСНО, потому что ваши изменения будут потеряны ), мы можем использовать

      git reset --hard HEAD^

      введите описание изображения здесь

    3. И если мы хотим отменить фиксацию и удалить изменения со стадии, мы можем использовать

      git reset --mixed HEAD^ или в короткой форме git reset HEAD^

      введите описание изображения здесь

    ответ дан Ali Motameni, с репутацией 494, 18.11.2016
  • 46 рейтинг

    Просто отмените последнее коммит:

     git reset --soft HEAD~
     

    Или отмените время до последнего времени:

     git reset --soft HEAD~2
     

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

     git reset --soft <commitID>
     

    (вы можете получить commitID, используя git reflog )

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

     git clean
     

    Более подробную информацию можно найти в документах: git-reset

    ответ дан steven, с репутацией 353, 8.05.2015
  • 42 рейтинг

    Чтобы отменить локальную фиксацию, вы используете git reset <file> . Также этот учебник очень полезен, чтобы показать вам, как он работает.

    Кроме того, вы можете использовать git revert <commit> : реверсия должна использоваться, когда вы хотите добавить еще одну фиксацию, которая откатывает изменения (но сохраняет их в истории проекта).

    ответ дан mfathy00, с репутацией 1315, 3.01.2016
  • 39 рейтинг

    Типичный цикл Git

    Говоря о командах, связанных с Git, в предыдущих ответах, я хотел бы поделиться своими типичными циклами Git со всеми читателями, которые могут быть полезны. Вот как я работаю с Git,

    1. Клонирование в первый раз с удаленного сервера

      git clone $project

    2. Вытягивание с удаленного (когда у меня нет ожидающего локального коммита для нажатия)

      git pull

    3. Добавление нового локального файла1 в $ to_be_committed_list (просто представьте, что $ to_be_committed_list означает staged область)

      git add $file1

    4. Удаление ошибочно добавленного файла2 из $ to_be_committed_list (предположим, что file2 добавлен как шаг 3, чего я не хотел)

      git reset $file2

    5. Зафиксировать файл1, который находится в $ to_be_committed_list

      git commit -m "commit message description"

    6. Синхронизация локального коммита с удаленным репозиторием перед нажатием

      git pull --rebase

    7. При разрешении конфликтов возникает предварительная настройка configure mergetool

      git mergetool #resolve merging here, also can manually merge

    8. Добавление разрешенных конфликтов файлов, скажем, file1 :

      git add $file1

    9. Продолжение моей предыдущей команды rebase

      git rebase --continue

    10. Нажатие готовой и уже синхронизированной последней локальной фиксации

      git push origin head:refs/for/$branch # branch = master, dev, etc.

    ответ дан Sazzad Hissain Khan, с репутацией 13530, 31.12.2015
  • 38 рейтинг

    Отменить последнее обязательство

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

    В этих случаях команда «reset» - ваш лучший друг:

     $ git reset --soft HEAD~1
     

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

    Обратите внимание на флаг --soft : это гарантирует, что изменения в отмененных версиях сохраняются. После выполнения команды вы найдете изменения как незафиксированные локальные изменения в вашей рабочей копии.

    Если вы не хотите сохранять эти изменения, просто используйте флаг --hard . Обязательно сделайте это только тогда, когда вы уверены, что вам больше не нужны эти изменения.

     $ git reset --hard HEAD~1
     

    Введите описание изображения здесь

    ответ дан Mohit, с репутацией 576, 14.09.2017
  • 37 рейтинг

    ПОЛЬЗОВАТЕЛИ ВИЗУАЛЬНОЙ СТУДИИ (2015 г. и т. Д.)

    Если вы не можете синхронизировать в Visual Studio, так как вам не разрешено нажимать на ветвь, как «разработка», то насколько я пробовал, в Visual Studio НИКОГДА не работал REVERT NOR RESET (жесткий или мягкий).

    За ответ с ТОННЫМИ ГОЛОСОВ:

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

     git reset --hard HEAD~1
     

    Резервное копирование или zip-файлы на всякий случай, если вы не хотите потерять работу и т. Д.

    ответ дан Tom Stickel, с репутацией 11724, 26.04.2016
  • 33 рейтинг

    Я получил идентификатор фиксации от bitbucket а затем сделал:

     git checkout commitID .
     

    Пример:

     git checkout 7991072 .
     

    И он вернул его обратно к этой рабочей копии этого сообщения.

    ответ дан ioopl, с репутацией 1274, 16.03.2016
  • 32 рейтинг

    Вам нужно сделать легкий и быстрый

         git commit --amend
     

    если это частный филиал или

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

    если это общий или публичный филиал.

    ответ дан Yahs Hef, с репутацией 693, 24.05.2015
  • 30 рейтинг

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

    Сначала нам нужно исправить наше местное репо, вернувшись к желанию, которое мы хотим:

     git reset --hard <previous good commit id where you want local repo to go>
     

    Теперь мы принудительно нажимаем эту хорошую фиксацию на удаленном репо, используя эту команду:

     git push --force-with-lease
     

    Версия опции force with the-lease предотвратит случайное удаление новых коммитов, о которых вы не знаете (т. Е. Из другого источника с момента последнего нажатия).

    ответ дан KawaiKx, с репутацией 3614, 7.05.2017
  • 27 рейтинг

    У вас есть несколько вариантов отмены последнего фиксации. Вот некоторые из ваших вариантов суммировать в один ответ с фрагментами кода

    Прежде всего вам нужно определить, какие «неправильные» фиксации вы хотите отбросить. Мы будем использовать git reflog чтобы найти его.


    git reflog

    Вы всегда можете использовать и reflog .
    git reflog будет отображаться любое изменение, которое обновило HEAD и проверив нужную запись reflog, вернет HEAD к этой фиксации.

    Каждый раз , когда голова модифицирована будет новый вход в reflog .
    reflog похож на команду истории unix и хранится локально на вашем компьютере.

     git reflog
    git checkout HEAD@{...}
    # or
    git checkout <sha-1>
     

    Используя кассу, вы можете вернуться к любой желаемой фиксации, и вы можете создать ветку или любые другие параметры, которые git checkout позволит вам сделать.

    введите описание изображения здесь


    git reset HEAD --hard <commit_id>

    «Переместите» свою голову назад к желаемому фиксации.
    Сброс Git проверяет требуемый контент фиксации на вашу промежуточную область и /или на ваш рабочий каталог на основе значения --hard/--soft/--mixed вы выбираете. --hard будет обновлять как сцену, так и рабочий каталог с данным контентом и «отделить» любые другие коммиты за пределами этой точки вашего локального филиала.

    Если эти коммиты не являются частью какой-либо другой ветки, они станут «болтаться».
    Содержимое «болтаться» означает, что в вашем локальном репозитории существует недопустимый контент, который не является частью какой-либо другой ветки и может быть удален или будет удален gc .

     # This will destroy any local modifications.
    # Don't do it if you have uncommitted work you want to keep.
    git reset --hard 0d1d7fc32
    
    # Alternatively, if there's work to keep:
    git stash
    git reset --hard 0d1d7fc32
    git stash pop
    # This saves the modifications, then reapplies that patch after resetting.
    # You could get merge conflicts, if you've modified things which were
    # changed since the commit you reset to.
     

    Эта схема иллюстрирует, какая команда выполняет что.
    Как вы можете видеть там reset && checkout измените HEAD .

    введите описание изображения здесь

    ответ дан CodeWizard, с репутацией 46220, 28.01.2017
  • 27 рейтинг

    Используйте эту команду:

     git checkout -b old-state number_commit
     
    ответ дан Fadid, с репутацией 568, 27.12.2016
  • 27 рейтинг

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

    В той же ветке, которую вы совершили и нажали, если вы наберете «git status», вы не увидите ничего нового, потому что вы совершили и нажали, теперь введите:

    git reset --soft HEAD~1

    Это вернет все ваши изменения (файлы) обратно в область сцены, теперь, чтобы вернуть их в рабочий каталог (нестатический), который вы просто набираете:

     git reset FILE
     

    Где «Файл» - это файл, который вы хотите снова зафиксировать. Теперь этот ФАЙЛ должен находиться в рабочем каталоге (нестационарный) со всеми изменениями, которые вы сделали. Теперь вы можете перейти к любой ветви, которую хотите, и зафиксировать изменения в этой ветке. Надеюсь, это поможет другим людям совершить ту же ошибку, что и я. Конечно, начальная ветвь, которую вы совершили, все еще существует со всеми изменениями, но в моем случае это было нормально, если она не для вас, вы можете искать способы вернуть это сообщение в этой ветке.

    ответ дан FraK, с репутацией 224, 11.08.2015
  • 26 рейтинг

    Используйте эту команду

     git checkout -b old-state 0d1d7fc32
     
    ответ дан Jishnu Sukumaran, с репутацией 46, 6.07.2015