Как отменить коммит в pycharm
Перейти к содержимому

Как отменить коммит в pycharm

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 Ctrl+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.

If you are more used to the staging concept, select the Enable staging area option in the Version Control | Git page of the IDE settings Ctrl+Alt+S .

Also, by default PyCharm suggests adding each newly created file under version control. You can change this behavior in Settings/Preferences | 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 Ctrl+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.

Open the Git tool window Alt+9 and switch to the Log tab.

Select the last commit in the current branch and choose Undo Commit from the context menu.

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).

Select the Set active option if you want to make the changelist with the changes you are about to discard the active changelist.

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, project history is preserved, as the original commit remains intact.

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.

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.

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.

In the Log view select the commit containing the changes you want to discard.

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 Ctrl+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).

Open the Version Control tool window Alt+9 and switch to the Log tab.

Select the commit that you want to move HEAD onto and select Reset Current Branch to Here from the context menu.

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 Local 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:

Select the required file in any view (in the Project tool window, in the editor, in the Local Changes view, and so on).

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.

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 для начинающих. Часть 9. Как удалить коммит в git?

Рассмотрим довольно важный вопрос: как удалить коммит в git? Начнем с вопроса отмены изменений в рабочей директории, после этого перейдем к репозиторию. В рамках этой темы изучим вопросы удаления и замены последнего коммита, работу с отдельными файлами и использование команд git revert и git reset.

Отмена изменений в файлах в рабочей директории

Если вы сделали какие-то изменения в файле и хотите вернуть предыдущий вариант, то для этого следует обратиться к репозиторию и взять из него файл, с которым вы работаете. Таким образом, в вашу рабочую директорию будет скопирован файл из репозитория с заменой. Например, вы работаете с файлом main.c и внесли в него какие-то изменения. Для того чтобы вернуться к предыдущей версии (последней отправленной в репозиторий) воспользуйтесь командой git checkout.

Ключ “- -” означает, что нас интересует файл в текущем бранче (ветке).

Отмена коммитов в git

Работа с последним коммитом

Для демонстранции возможностей git создадим новый каталог и инициализируем в нем репозиторий.

Добавим в каталог файл main.c.

Отправим изменения в репозиторий.

Внесем изменения в файл.

И сделаем еще один коммит.

В репозиторий, на данный момент, было сделано два коммита.

Теперь удалим последний коммит и вместо него отправим другой. Предварительно изменим содержимое файла main.c.

Отправим изменения в репозиторий с заметой последнего коммита.

Как вы можете видеть: из репозитория пропал коммит с id=d142679, вместо него теперь коммит с id=18411fd.

Отмена изменений в файле в выбранном коммите

Сделаем ещё несколько изменений в нашем файле main.c, каждое из которых будет фиксироваться коммитом в репозиторий.

Помните, что в предыдущем разделе мы поменяли коммит с сообщением “second commit” на “third commit”, поэтому он идет сразу после “first commit”.

Представим ситуацию, что два последних коммита были неправильными, и нам нужно вернуться к версии 18411fd и внести изменения именно в нее. В нашем примере, мы работаем только с одним файлом, но в реальном проекте файлов будет много, и после коммитов, в рамках которых вы внесли изменения в интересующий вас файл, может быть ещё довольно много коммитов, фиксирующих изменения в других файлах. Просто так взять и удалить коммиты из середины ветки не получится – это нарушит связность, что идет в разрез с идеологией git. Одни из возможных вариантов – это получить версию файла из нужного нам коммита, внести в него изменения и сделать новый коммит. Для начала посмотрим на содержимое файла main.c из последнего, на текущий момент, коммита.

Для просмотра содержимого файла в коммите с id=18411fd воспользуемся правилами работы с tree-ish (об этом подробно написано здесь)

Переместим в рабочую директорию файл main.c из репозитория с коммитом id=18411fd.

Мы видим, что теперь содержимое файла main.c соответствует тому, что было на момент создания коммита с id=18411fd. Сделаем коммит в репозиторий и в сообщении укажем, что он отменяет два предыдущих.

Таким образом мы вернулись к предыдущей версии файла main.c и при этом сохранили всю историю изменений.

Использование git revert для быстрой отмены изменений

Рассмотрим ещё одни способ отмены коммитов, на этот раз воспользуемся командой git revert.

В нашем примере, отменим коммит с id=cffc5ad. После того как вы введете команду git revert (см. ниже), система git выдаст сообщение в текстовом редакторе, если вы согласны с тем, что будет написано в открытом файле, то просто сохраните его и закройте. В результате изменения будут применены, и автоматически сформируется и отправится в репозиторий коммит.

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

Обратите внимание, что в этом случае будут изменены настройки для текущего репозитория. Более подробно об изменении настроек смотрите в “Git для начинающих. Часть 3. Настройка Git”

Проверим, применялась ли настройка.

Посмотрим на список коммитов в репозитории.

Содержимое файла вернулось к тому, что было сделано в рамках коммита с >

Отмена группы коммитов

ВНИМАНИЕ! Используйте эту команду очень аккуратно!

Если вы не знакомы с концепцией указателя HEAD, то обязательно прочитайте статью “ Git для начинающих. Часть 7. Поговорим о HEAD и tree-ish“. HEAD указывает на коммит в репозитории, с которого будет вестись дальнейшая запись, т.е. на родителя следующего коммита. Существует три опции, которые можно использовать с командой git reset для изменения положения HEAD и управления состоянием stage и рабочей директории, сейчас мы все это подробно разберем.

Удаление коммитов из репозитория (без изменения рабочей директории) (ключ –soft)

Для изменения положения указателя HEAD в репозитории, без оказания влияния рабочую директорию (в stage, при этом, будет зафиксированно отличие рабочей директории от репозитория), используйте ключ –soft. Посмотрим ещё раз на наш репозиторий.

Содержимое файла main.с в рабочей директории.

Содержимое файла main.с в репозитории.

Теперь переместим HEAD в репозитории на коммит с id=dcf7253.

Получим следующий список коммитов.

Содержимое файла main.c в репозитории выглядит так.

В рабочей директории файл main.c остался прежним (эти изменения отправлены в stage).

Для того, чтобы зафиксировать в репозитории последнее состояние файла main.c сделаем коммит.

Посмотрим на список коммитов.

Как видите из репозитория пропали следующие коммиты:

Удаление коммитов из репозитория и очистка stage (без изменения рабочей директории) (ключ –mixed)

Если использовать команду git reset с аргументом –mixed, то в репозитории указатель HEAD переместится на нужный коммит, а также будет сброшено содержимое stage. Отменим последний коммит.

В результате изменилось содержимое репозитория.

Содержимое файла main.c в последнем коммите выглядит так.

Файл main.c в рабочей директории не изменился.

Отправим изменения вначале в stage, а потом в репозиторий.

Удаление коммитов из репозитория, очистка stage и внесение изменений в рабочую директорию (ключ –hard)

Если вы воспользуетесь ключем –hard, то обратного пути уже не будет. Вы не сможете восстановить данные из рабочей директории. Все компоненты git (репозиторий, stage и рабочая директория) будут приведены к одному виду в соответствии с коммитом, на который будет перенесен указатель HEAD.

Текущее содержимое репозитория выглядит так.

Посмотрим на содержимое файла main.c в каталоге и репозитории.

Содержимое файлов идентично.

Удалим все коммиты до самого первого с id=86f1495.

Состояние рабочей директории и stage.

Содержимое файла main.c в репозитории и в рабочей директории.

Т.к. мы воспользовались командой git reset с ключем –hard, то восстановить прежнее состояние нам не получится.

БУДЬТЕ ОЧЕНЬ АККУРАТНЫ С ЭТОЙ КОМАНДОЙ!

Отличный курс по git делают ребята из GeekBrains , найдите в разделе “Курсы” курс “Git. Быстрый старт” , он бесплатный!

Git для начинающих. Часть 9. Как удалить коммит в git? : 2 комментария

Работа с последним коммитом:
git commit –amend -m “third commit”

Это отменяет последний коммит, но не возвращает файл в исходное состояние.
А в какой задаче это может быть полезно?

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

А в какой задаче это может быть полезно?

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

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

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

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

Теперь хочу удалить все лишние коммиты, как это сделать через pycharm не используя консоль?

Коммиты еще не отправлены на сервер. Использую PyCharm 2016.3.1 и Debian 8

user avatar

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

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

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

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

Теперь мы вернём ветку к предыдущему коммиту.

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

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

Обратите внимание, в этот раз reset без параметра —soft !

Теперь можно делать новый коммит.

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

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

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