Откат коммита Git в Intellij Idea
Есть проект над которым работаю только я. Через идею расшарил проект на гитхабе. После некоторых изменений пушу весь проект на гитхаб. К примеру у меня есть 5 коммитов на гитхабе, но я что-то напортачил и точно знаю, что это произошло с 4го коммита. Как мне откатить в идее весь проект до 3го коммита?
Отслеживать
задан 23 ноя 2017 в 13:05
289 1 1 золотой знак 5 5 серебряных знаков 19 19 бронзовых знаков
revert не подходит? или хочется именно снести коммиты (что плохо). И хочется это сделать по нормальному или неправильно (через idea)?
23 ноя 2017 в 13:34
Те коммиты, которые следуют за 3м(т.е к примеру 3й коммит был удачной версией) не нужны. Смысл в том, чтобы не тратить время на изменение неудачного кода, а с помощью гита быстро вернуть всё в необходимое состояние, т.е в определённый коммит.
23 ноя 2017 в 14:23
Вам нужен git revert. В принципе, он есть прямо с gui
23 ноя 2017 в 14:23
Почти, но не то. git revert в идее откатывает изменения пошагово и использует локальные данные. Мне же необходимо использовать именно коммиты из удалённого репозитория. Что-то вроде pull, только с возможностью выбора определенного коммита.
23 ноя 2017 в 15:10
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Если я правильно понял вопрос, то сначала клонируете проект с гитхаба, в Idea — VCS — Git — Сlone, затем идете на вкладку Version control, в ней вкладка log, в логе становитесь на нужный коммит, ПКМ — Reset Current Branch to Here — ну а там уже выбираете нужные варианты, самый жесткий/опасный, не оставляющий следов — hard.
Как отменить последний коммит git
Тут нужно понять, что именно необходимо сделать. Потому что под отменой часто понимают удаление последнего коммита. Удалить последний коммит можно очень просто с помощью команды git reset . Причём можно как сохранить изменения в рабочей директории, так и полностью удалить все изменения сделанные в последнем коммите.
# удаляем только коммит git reset --hard HEAD~ # удаляем коммит и изменения
А вот отменить изменения сделанные в последнем коммите можно с помощью команды git revert . Она делает еще один коммит, но с противоположными изменениями.
# нужно передать ей хеш коммита, который мы отменяем
28 декабря 2022
Обратите внимание, что команда git reset может быть опасна, поскольку она изменяет историю репозитория. Поэтому важно следить за тем, что вы делаете, и убедиться, что вы работаете над локальным репозиторием, а не с удаленным репозиторием, так как при изменении истории удаленного репозитория у других участников могут возникнуть проблемы с синхронизацией своих локальных репозиториев.
15. Удаление коммитов из ветки
revert из предыдущего раздела является мощной командой, которая позволяет отменить любые коммиты в репозиторий. Однако, и оригинальный и «отмененный» коммиты видны в истории ветки (при использовании команды git log ).
Часто мы делаем коммит, и сразу понимаем, что это была ошибка. Было бы неплохо иметь команду «возврата», которая позволила бы нам сделать вид, что неправильного коммита никогда и не было. Команда «возврата» даже предотвратила бы появление нежелательного коммита в истории git log .
01 Команда reset
Мы уже видели команду reset и использовали ее для согласования области подготовки с выбранным коммитом (в предыдущем уроке мы использовали коммит HEAD ).
Если выполнить команду reset с указанием ссылки на коммит (т.е. метки HEAD , имени ветки или тега, хеша коммита), то команда.
- Изменит текущую ветку, чтобы она указывала на указанный коммит.
- Опционально сбросит область подготовки до соответствия с указанным коммитом.
- Опционально сбросит рабочую директорию до соответствия с указанным коммитом.
02 Проверьте нашу историю
Давайте сделаем быструю проверку нашей истории коммитов.
Выполните
git log
Результат
$ git log 86364a1 2023-11-28 | Revert "Oops, we didn't want this commit" (HEAD -> main) [Alexander Shvets] 6a44bec 2023-11-28 | Oops, we didn't want this commit [Alexander Shvets] b7614c1 2023-11-28 | Added HTML header (tag: v1) [Alexander Shvets] 46afaff 2023-11-28 | Added standard HTML page tags (tag: v1-beta) [Alexander Shvets] 78433de 2023-11-28 | Added h1 tag [Alexander Shvets] 5836970 2023-11-28 | Initial commit [Alexander Shvets]
Мы видим, что два последних коммита в этой ветке — «Oops» и «Revert Oops». Давайте удалим их с помощью сброса.
03 Для начала отметьте эту ветку
Но прежде чем удалить коммиты, давайте отметим последний коммит тегом, чтобы потом можно было его найти.
Выполните
git tag oops
Результат
$ git log 86364a1 2023-11-28 | Revert "Oops, we didn't want this commit" (HEAD -> main, tag: oops) [Alexander Shvets] 6a44bec 2023-11-28 | Oops, we didn't want this commit [Alexander Shvets] b7614c1 2023-11-28 | Added HTML header (tag: v1) [Alexander Shvets] 46afaff 2023-11-28 | Added standard HTML page tags (tag: v1-beta) [Alexander Shvets] 78433de 2023-11-28 | Added h1 tag [Alexander Shvets] 5836970 2023-11-28 | Initial commit [Alexander Shvets]
04 Сброс к коммиту, предшествующему oops
Глядя на историю лога (см. выше), мы видим, что коммит с тегом v1 является коммитом, предшествующим ошибочному коммиту. Давайте сбросим ветку до этой точки. Поскольку ветка имеет тег, мы можем использовать имя тега в команде сброса reset (если она не имеет тега, мы можем использовать хеш коммита).
Выполните
git reset --hard v1 git log
Результат
$ git reset --hard v1 HEAD is now at b7614c1 Added HTML header $ git log b7614c1 2023-11-28 | Added HTML header (HEAD -> main, tag: v1) [Alexander Shvets] 46afaff 2023-11-28 | Added standard HTML page tags (tag: v1-beta) [Alexander Shvets] 78433de 2023-11-28 | Added h1 tag [Alexander Shvets] 5836970 2023-11-28 | Initial commit [Alexander Shvets]
Наша ветка main теперь указывает на коммит v1 , а коммитов «Revert Oops» и «Oops» в ветке уже нет. Параметр —hard указывает, что рабочая директория должна быть приведена к тому состоянию, которое соответствует HEAD -коммиту ветки.
05 Ничего никогда не теряется
Что же случается с ошибочными коммитами? Оказывается, что коммиты все еще находятся в репозитории. На самом деле, мы все еще можем на них ссылаться. Помните, в начале этого урока мы создали для отмененного коммита тег oops ? Давайте посмотрим на все коммиты.
Выполните
git log --all
Результат
$ git log --all b7614c1 2023-11-28 | Added HTML header (HEAD -> main, tag: v1) [Alexander Shvets] 86364a1 2023-11-28 | Revert "Oops, we didn't want this commit" (tag: oops) [Alexander Shvets] 46afaff 2023-11-28 | Added standard HTML page tags (tag: v1-beta) [Alexander Shvets] 6a44bec 2023-11-28 | Oops, we didn't want this commit [Alexander Shvets] 78433de 2023-11-28 | Added h1 tag [Alexander Shvets] 5836970 2023-11-28 | Initial commit [Alexander Shvets]
Мы видим, что ошибочные коммиты не исчезли. Они все еще находятся в репозитории. Просто они отсутствуют в ветке main . Если бы мы не отметили их тегами, они по-прежнему находились бы в репозитории, но не было бы никакой возможности ссылаться на них, кроме как при помощи хешей этих коммитов. Коммиты, на которые нет ссылок, остаются в репозитории до тех пор, пока не будет запущен сборщик мусора.
06 Опасность сброса
Сброс в локальных ветках, как правило, безопасен. Последствия любой «аварии» как правило, можно восстановить простым сбросом с помощью нужного коммита.
Однако, если ветка уже стала общедоступной на удаленных репозиториях, сброс может сбить с толку других пользователей ветки.
Intellij Idea – Контроль версий
IntelliJ поддерживает различные системы контроля версий, такие как Git, Subversion, Mercurial, CVS, GitHub и TFS. Вы можете выполнять действия, связанные с контролем версий, из самой IDE.
В этой главе мы обсудим Git и Subversion (далее именуемые SVN). Мы предполагаем, что читатель знаком с инструментом Git и SVN и его терминологией.
Гит
В этом разделе мы узнаем, как работать с Git.
клон
Чтобы клонировать существующее хранилище Git –
- Перейдите в Файл-> Новый-> Проект из контроля версий-> Git.
- Введите URL хранилища, Родительский каталог и Имя каталога.
- Нажмите на кнопку клона, чтобы продолжить.
Перейдите в Файл-> Новый-> Проект из контроля версий-> Git.
Введите URL хранилища, Родительский каталог и Имя каталога.
Нажмите на кнопку клона, чтобы продолжить.

- После успешного выполнения вышеуказанных шагов, хранилище будет клонировано.
После успешного выполнения вышеуказанных шагов, хранилище будет клонировано.
Отслеживать изменения
Git будет отслеживать изменения, которые вы делаете в репозитории. Давайте изменим любой файл из репозитория и сравним его с репозиторием.
- Перейдите к VCS → Git → Сравнить с последней версией репозитория.
- Вышеуказанный шаг откроет окно diff.
- Вы можете видеть, что есть новая линия на правой стороне с зеленым цветом фона.
- Git показывает это зеленым цветом, так как мы добавили новое содержимое. Если мы удалим какое-либо содержимое, оно будет показано красным цветом.
Перейдите к VCS → Git → Сравнить с последней версией репозитория.
Вышеуказанный шаг откроет окно diff.
Вы можете видеть, что есть новая линия на правой стороне с зеленым цветом фона.
Git показывает это зеленым цветом, так как мы добавили новое содержимое. Если мы удалим какое-либо содержимое, оно будет показано красным цветом.

Отменить локальные изменения
Выполните следующие действия, чтобы отменить локальные изменения.
- Перейдите к опции VCS → Git → Revert .
- Он запросит подтверждение и удалит ваши изменения.
Перейдите к опции VCS → Git → Revert .
Он запросит подтверждение и удалит ваши изменения.

Добавить файл в хранилище
Чтобы добавить файл в хранилище, перейдите к VCS → Git → Добавить опцию . Это действие похоже на действие git add .
Зафиксируйте изменения
Операция Commit создаст локальный коммит. Это похоже на действие git commit . Выполнить коммит –
- Перейдите к опции VCS → Git → Commit File .
- Выберите файлы для фиксации.
- Введите сообщение о коммите и нажмите кнопку «Фиксация».
Перейдите к опции VCS → Git → Commit File .
Выберите файлы для фиксации.
Введите сообщение о коммите и нажмите кнопку «Фиксация».

Нажмите изменения в удаленном хранилище
Действие Push отправит локальные изменения в удаленный репозиторий. Чтобы подтолкнуть изменения –
- Перейдите к опции VCS → Git → Push .
- Окно появится. Здесь вы можете увидеть комиты, которые нужно нажать.
- Подтвердите фиксацию и нажмите кнопку Push, чтобы опубликовать ваши изменения.
Перейдите к опции VCS → Git → Push .
Окно появится. Здесь вы можете увидеть комиты, которые нужно нажать.
Подтвердите фиксацию и нажмите кнопку Push, чтобы опубликовать ваши изменения.

Просмотр истории или журналов
Чтобы показать историю, перейдите к VCS → Git → Показать историю . Это действие похоже на команду git log . Это покажет историю следующим образом –

Получать обновления
Выполните следующие шаги, чтобы получить обновления из хранилища –
- Перейдите к опции VCS → Git → Pull .
- Выберите опцию в соответствии с вашими требованиями.
- Нажмите на кнопку Pull.
Перейдите к опции VCS → Git → Pull .
Выберите опцию в соответствии с вашими требованиями.
Нажмите на кнопку Pull.

Добавить существующий проект в Git
Чтобы добавить существующий проект под Git –
- Перейдите к VCS → Импорт в Контроль версий → Создать Git- репозиторий.
- Выберите проект, просмотрев каталог.
- Нажмите на кнопку ОК.
Перейдите к VCS → Импорт в Контроль версий → Создать Git- репозиторий.
Выберите проект, просмотрев каталог.
Нажмите на кнопку ОК.

диверсия
В этом разделе мы поймем, как Subversion работает в IntelliJ. Давайте рассмотрим несколько важных действий, чтобы понять это.
Проверять, выписываться
Чтобы оформить хранилище SVN –
- Перейдите к « Файл» → «Создать» → «Проект» из «Контроль версий» → «Subversion».
- Введите URL хранилища.
- Нажмите на кнопку ОК .
Перейдите к « Файл» → «Создать» → «Проект» из «Контроль версий» → «Subversion».
Введите URL хранилища.
Нажмите на кнопку ОК .

Отслеживать изменения
SVN будет отслеживать изменения, сделанные вами в хранилище. Давайте изменим любой файл из репозитория и сравним его с репозиторием –
- Перейдите к VCS-> Subversion-> Сравните с последней версией репозитория
- Вы можете видеть, что есть новая линия на правой стороне с зеленым цветом фона.
- SVN показывает это с зеленым фоном, чтобы указать добавление нового контента. Если мы удалим какой-либо контент, он будет показан красным цветом.
Перейдите к VCS-> Subversion-> Сравните с последней версией репозитория
Вы можете видеть, что есть новая линия на правой стороне с зеленым цветом фона.
SVN показывает это с зеленым фоном, чтобы указать добавление нового контента. Если мы удалим какой-либо контент, он будет показан красным цветом.

Отменить локальные изменения
Выполните следующие действия, чтобы отменить локальные изменения, которые вы внесли –
- Перейдите к опции VCS → Subversion → Revert .
- Он запросит подтверждение и удалит ваши изменения.
Перейдите к опции VCS → Subversion → Revert .
Он запросит подтверждение и удалит ваши изменения.

Зафиксируйте изменения в удаленном хранилище
Выполните следующие шаги, чтобы зафиксировать изменения в удаленном хранилище –
- Перейдите к опции VCS → Subversion → Commit Files .
- Появится новое окно. Здесь вы можете увидеть файлы для фиксации в удаленном репозитории.
- Проверьте файлы и нажмите кнопку «Подтвердить», чтобы опубликовать изменения.
Перейдите к опции VCS → Subversion → Commit Files .
Появится новое окно. Здесь вы можете увидеть файлы для фиксации в удаленном репозитории.
Проверьте файлы и нажмите кнопку «Подтвердить», чтобы опубликовать изменения.

Просмотр истории или журналов
Чтобы показать историю, перейдите к VCS → Subverion → Показать историю . Эта опция похожа на команду svn log . Это покажет историю следующим образом –

Операция обновления
Чтобы получить последние изменения, перейдите к VCS → Subversion → Обновить файл / Обновить папку .

Добавить существующий проект в Subversion
Выполните следующие шаги, чтобы добавить существующий проект в SVN –
Перейдите к VCS → Импортировать в Контроль версий → Импортировать в Subverion .
Введите URL хранилища и нажмите кнопку «Импорт» –