Pycharm как откатить изменения
Перейти к содержимому

Pycharm как откатить изменения

  • автор:

2.4 Основы Git — Операции отмены

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

Отмена может потребоваться, если вы сделали коммит слишком рано, например, забыв добавить какие-то файлы или комментарий к коммиту. Если вы хотите переделать коммит — внесите необходимые изменения, добавьте их в индекс и сделайте коммит ещё раз, указав параметр —amend :

$ git commit --amend

Эта команда использует область подготовки (индекс) для внесения правок в коммит. Если вы ничего не меняли с момента последнего коммита (например, команда запущена сразу после предыдущего коммита), то снимок состояния останется в точности таким же, а всё что вы сможете изменить — это ваше сообщение к коммиту.

Запустится тот же редактор, только он уже будет содержать сообщение предыдущего коммита. Вы можете редактировать сообщение как обычно, однако, оно заменит сообщение предыдущего коммита.

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

$ git commit -m 'Initial commit' $ git add forgotten_file $ git commit --amend

В итоге получится единый коммит — второй коммит заменит результаты первого.

Примечание

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

Очевидно, смысл изменения коммитов в добавлении незначительных правок в последние коммиты и, при этом, в избежании засорения истории сообщениями вида «Ой, забыл добавить файл» или «Исправление грамматической ошибки».

Отмена индексации файла

Следующие два раздела демонстрируют как работать с индексом и изменениями в рабочем каталоге. Радует, что команда, которой вы определяете состояние этих областей, также подсказывает вам как отменять изменения в них. Например, вы изменили два файла и хотите добавить их в разные коммиты, но случайно выполнили команду git add * и добавили в индекс оба. Как исключить из индекса один из них? Команда git status напомнит вам:

$ git add * $ git status On branch master Changes to be committed: (use "git reset HEAD . " to unstage) renamed: README.md -> README modified: CONTRIBUTING.md

Прямо под текстом «Changes to be committed» говорится: используйте git reset HEAD …​ для исключения из индекса. Давайте последуем этому совету и отменим индексирование файла CONTRIBUTING.md :

$ git reset HEAD CONTRIBUTING.md Unstaged changes after reset: M CONTRIBUTING.md $ git status On branch master Changes to be committed: (use "git reset HEAD . " to unstage) renamed: README.md -> README Changes not staged for commit: (use "git add . " to update what will be committed) (use "git checkout -- . " to discard changes in working directory) modified: CONTRIBUTING.md

Команда выглядит несколько странно, но — работает! Файл CONTRIBUTING.md изменен, но больше не добавлен в индекс.

Примечание

Команда git reset может быть опасной если вызвать её с параметром —hard . В приведённом примере файл не был затронут, следовательно команда относительно безопасна.

На текущий момент этот магический вызов — всё, что вам нужно знать о команде git reset . Мы рассмотрим в деталях что именно делает reset и как с её помощью делать действительно интересные вещи в разделе Раскрытие тайн reset главы 7.

Отмена изменений в файле

Что делать, если вы поняли, что не хотите сохранять свои изменения файла CONTRIBUTING.md ? Как можно просто отменить изменения в нём — вернуть к тому состоянию, которое было в последнем коммите (или к начальному после клонирования, или ещё как-то полученному)? Нам повезло, что git status подсказывает и это тоже.

В выводе команды из последнего примера список изменений выглядит примерно так:

Changes not staged for commit: (use "git add . " to update what will be committed) (use "git checkout -- . " to discard changes in working directory) modified: CONTRIBUTING.md

Здесь явно сказано как отменить существующие изменения. Давайте так и сделаем:

$ git checkout -- CONTRIBUTING.md $ git status On branch master Changes to be committed: (use "git reset HEAD . " to unstage) renamed: README.md -> README

Как видите, откат изменений выполнен.

Важно понимать, что git checkout — — опасная команда. Все локальные изменения в файле пропадут — Git просто заменит его версией из последнего коммита. Ни в коем случае не используйте эту команду, если вы не уверены, что изменения в файле вам не нужны.

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

Помните, всё что попало в коммит почти всегда Git может восстановить. Можно восстановить даже коммиты из веток, которые были удалены, или коммиты, перезаписанные параметром —amend (см. Восстановление данных). Но всё, что не было включено в коммит и потеряно — скорее всего, потеряно навсегда.

Отмена действий с помощью git restore

Git версии 2.23.0 представил новую команду: git restore . По сути, это альтернатива git reset, которую мы только что рассмотрели. Начиная с версии 2.23.0, Git будет использовать git restore вместо git reset для многих операций отмены.

Давайте проследим наши шаги и отменим действия с помощью git restore вместо git reset .

Отмена индексации файла с помощью git restore

В следующих двух разделах показано, как работать с индексом и изменениями рабочей копии с помощью git restore . Приятно то, что команда, которую вы используете для определения состояния этих двух областей, также напоминает вам, как отменить изменения в них. Например, предположим, что вы изменили два файла и хотите зафиксировать их как два отдельных изменения, но случайно набираете git add * и индексируете их оба. Как вы можете убрать из индекса один из двух? Команда git status напоминает вам:

$ git add * $ git status On branch master Changes to be committed: (use "git restore --staged . " to unstage) modified: CONTRIBUTING.md renamed: README.md -> README

Прямо под текстом «Changes to be committed», написано использовать git restore —staged …​ для отмены индексации файла. Итак, давайте воспользуемся этим советом, чтобы убрать из индекса файл CONTRIBUTING.md :

$ git restore --staged CONTRIBUTING.md $ git status On branch master Changes to be committed: (use "git restore --staged . " to unstage) renamed: README.md -> README Changes not staged for commit: (use "git add . " to update what will be committed) (use "git restore . " to discard changes in working directory) modified: CONTRIBUTING.md

Файл CONTRIBUTING.md изменен, но снова не индексирован.

Откат изменённого файла с помощью git restore

Что, если вы поймете, что не хотите сохранять изменения в файле CONTRIBUTING.md ? Как легко его откатить — вернуть обратно к тому, как он выглядел при последнем коммите (или изначально клонирован, или каким-либо образом помещён в рабочий каталог)? К счастью, git status тоже говорит, как это сделать. В выводе последнего примера, неиндексированная область выглядит следующим образом:

Changes not staged for commit: (use "git add . " to update what will be committed) (use "git restore . " to discard changes in working directory) modified: CONTRIBUTING.md

Он довольно недвусмысленно говорит, как отменить сделанные вами изменения. Давайте сделаем то, что написано:

$ git restore CONTRIBUTING.md $ git status On branch master Changes to be committed: (use "git restore --staged . " to unstage) renamed: README.md -> README

Важно понимать, что git restore — опасная команда. Любые локальные изменения, внесённые в этот файл, исчезнут — Git просто заменит файл последней зафиксированной версией. Никогда не используйте эту команду, если точно не знаете, нужны ли вам эти несохранённые локальные изменения.

Undo changes in Git repository

You can always undo the changes you’ve made locally before you commit them:

  • In the Commit tool window Alt+0 , select one or more files that you want to revert, and select Rollback from the context menu, or press Control+Alt+Z .

All changes made to the selected files since the last commit will be discarded, and they will disappear from the active changelist.

Unstage files

By default, PyCharm uses the changelists concept where modified files are staged automatically.

  • If a file is already under version control, and you do not want to commit it, you can:
    • Remove it from the commit: do not select it in the Changes area of the Commit tool window.
    • Move it to another changelist.

    Also, by default PyCharm suggests adding each newly created file under version control. You can change this behavior in Settings | Version Control | Confirmation using When files are created and When files are deleted settings respectively.

    Undo the last commit

    PyCharm allows you to undo the last commit in the current branch.

    You cannot undo a commit if it was pushed to a protected branch, that is a branch to which force —push is not allowed (configure protected branches in the Version Control | Git page of the IDE settings Control+Alt+S ) Note that if a branch is marked as protected on GitHub, PyCharm will automatically mark it as protected when you check it out.

    1. Open the Git tool window Alt+9 and switch to the Log tab.
    2. Select the last commit in the current branch and choose Undo Commit from the context menu.
    3. In the dialog that opens, select a changelist where the changes you are going to discard will be moved. You can either select an existing changelist from the Name list, or specify the name of a new changelist (the commit message is used by default).
    4. Select the Set active option if you want to make the changelist with the changes you are about to discard the active changelist.
    5. Select the Track context option if you want PyCharm to remember your context and reload currently opened files in the editor when this changelist becomes active.

    Revert a pushed commit

    If you notice an error in a specific commit that has already been pushed, you can revert that commit. This operation results in a new commit that reverses the effect of the commit you want to undo. Thus, the project history is preserved, as the original commit remains intact.

    1. Locate the commit you want to revert in the Log tab of the Git tool window Alt+9 , right-click it and select Revert Commit from the context menu. This option is also available from the context menu of a commit in the file History view. The Commit Changes dialog will open with an automatically generated commit message. If you apply this action to multiple commits selected in the Log view, a separate commit will be created to revert each of them.
    2. If the selected commit contains several files, and you only need to revert some of them, deselect the files you do not want to touch.
    3. Click Commit to commit a changeset that reverts the changes to the selected files in this particular commit.

    Revert selected changes

    PyCharm lets you undo selected changes from a pushed commit if this commit contains multiple files and you only need to revert some of them.

    1. In the Log view select the commit containing the changes you want to discard.
    2. In the Changed Files pane, right-click the file that you want to revert and select Revert Selected Changes from the context menu. This results in a new commit that reverses the changes you want to undo.

    Drop a commit

    Unlike reverting a commit, which is reflected in the branch history, you can discard a pushed commit in the current branch without leaving any traces of the operation.

    Like any operation that rewrites a branch history, dropping a commit requires a —force push and cannot be performed in protected branches (these can be configured in the Version Control | Git page of the IDE settings Control+Alt+S .

    • Select a commit you want to discard in the Log view and choose Drop Commit from the context menu.

    Reset a branch to a specific commit

    If you notice an error in a set of recent commits and want to redo that part, you can roll back your repository to a specific state. This is done by resetting the current branch HEAD to a specified commit (and optionally resetting the index and working tree if you prefer not to reflect the undo in the history).

    1. Open the Version Control tool window Alt+9 and switch to the Log tab.
    2. Select the commit that you want to move HEAD onto and select Reset Current Branch to Here from the context menu.
    3. In the Git Reset dialog that opens, select how you want your working tree and the index to be updated and click Reset :
      • Soft : all changes from commits that were made after the selected commit will be staged (that means they will be moved to the Changes view so that you can review them and commit later if necessary).
      • Mixed : changes made after the selected commit will be preserved but will not be staged for commit.
      • Hard : all changes made after the selected commit will be discarded (both staged and committed).
      • Keep : committed changes made after the selected commit will be discarded, but local changes will be kept intact.

    Get a previous revision of a file

    If you need to revert a single file instead of discarding a whole commit that includes changes to several files, you can return to a particular version of that file:

    1. Select the necessary file in any view (the Project tool window, the editor, the Changes view, and so on).
    2. Select Git | Show History from the main VCS menu or from the context menu of the selection. The History tab is added to the Git tool window showing the history for the selected file and allowing you to review and compare its revisions.
    3. When you’ve identified the revision you want to roll back to, select it in the list and choose Get from the context menu.

    Как удалить git commit через pycharm

    Через pycharm сделал коммит, понял, что случайно зацепил в коммит файл, которого не должно быть в коммите. Попробовал исправить, создал еще пару новых коммитов. Теперь хочу удалить все лишние коммиты, как это сделать через pycharm не используя консоль? Коммиты еще не отправлены на сервер. Использую PyCharm 2016.3.1 и Debian 8

    Отслеживать
    33.9k 25 25 золотых знаков 130 130 серебряных знаков 222 222 бронзовых знака
    задан 24 янв 2017 в 15:08
    579 1 1 золотой знак 11 11 серебряных знаков 27 27 бронзовых знаков
    Воспользоваться консолью.
    24 янв 2017 в 15:10

    @Qwertiy если без консоли никак, то так и сделаю. Пишу git hist и выводит git: ‘hist’ is not a git command. See ‘git —help’.

    24 янв 2017 в 15:16
    @EmptyMan правильно, нет такой команды. Алиас может быть )
    24 янв 2017 в 15:20
    git rebase -i и в гугл.
    24 янв 2017 в 15:27
    @NickVolynkin не понимаю.
    24 янв 2017 в 15:28

    3 ответа 3

    Сортировка: Сброс на вариант по умолчанию

    Попробовал исправить, создал еще пару новых коммитов

    Вы же разработчик, используйте консоль. Это интерпретатор языка программирования Bash. По мощности и функциональности превосходит GUI настолько же, насколько программирование клавиатурой превосходит программирование мышкой.

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

    git log 
    git reset --soft a1ds23^ 
    git reset path/to/file 
    git commit 
    # ОСТОРОЖНО, это удаляет несохранённые изменения git reset --hard 

    Как откатиться к первоначальному варианту проекта?

    В проекте на гитхабе есть три ветки, основная и две для разработки. Я сделал изменения в одной из веток у себя локально, на гитхаб я эти изменения не выкладывал, как теперь мне все вернуть к первоначальному состоянию локально? Разработку веду в Pycharm.

    • Вопрос задан более трёх лет назад
    • 2072 просмотра

    1 комментарий

    Простой 1 комментарий

    Maksclub

    1. Можешь удалить локальную ветку и снова скачать с репо
    2. Если нужна твоя работа, просто нужно в старом коммите чего поправить — можешь через rebase -i сделать

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

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