Visual studio отменить commit

Обновлено: 05.07.2024

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Важно понимать, что git checkout -- <file> — опасная команда. Все локальные изменения в файле пропадут — 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 напоминает вам:

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

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

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

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

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

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

Не только разработчикам-новичкам, но и ярым профессионалам приходится прибегать к отмене каких-либо изменений. И тогда, первое, что приходит на ум, — это команда git revert , как самый безопасный способ. И тут есть подводные камни, про которые я хочу рассказать.

Возьмем простую ситуацию: разработчик решает реализовать математические функции. Но на половине пути понимает, что данную задачу было бы хорошо декомпозировать, допустим, на две подзадачи:

  • Реализовать арифметические операции (сложение, вычитание, деление и т.д.)
  • Реализовать числовые операции (максимальное значение, минимальное значение, модуль числа и т.д.)

Проверять будет проще да и тестировать. Но он уже начал ее реализовывать, коммиты уже созданы, и что же делать? Не переписывать же!


Рассмотрим дерево коммитов. Видим, что наш разработчик создал ветку functions , класс Arithmetic, отвечающий за реализацию арифметических операций (коммит А), и класс Numerical, отвечающий за реализацию числовых операций (коммит N). Итого два класса и два коммита.


git revert

Решено, дабы ничего не переписывать, наследоваться от functions и создать две ветки numerical и arithmetic . И соответственно отменить ненужные коммиты. То есть выполнить git revert N в ветке arithmetic и git revert A в ветке numerical. Гениально и просто!


Работа кипит и осталось дело за малым — смерджить мастер с данными ветками.


И что же мы получили? Ни класса Arithmetic, ни класса Numerical!
А все дело в том, что команда git revert создает новый коммит с отменой изменений и не удаляет из истории коммиты. И в нашем случае после слияния веток получается 4 коммита:

То есть вариант с отменой изменений с помощью команды revert вышел нам боком.

git reset

И тут мы вспоминаем, что есть такая команда как reset , вот она в отличии от revert точно удаляет коммиты из истории. Но есть одно НО… она сбрасывает все коммиты до указанного. Такое поведение нам не подходит, так как мы хотим выбрать какие коммиты удалить.

git rebase

Есть еще одно решение — использовать команду git rebase для отмены изменений.
Вернемся к моменту создания двух веток numerical и arithmetic и выполним

Теперь на уровне каждого коммита, который мы хотим отменить заменим pick на drop. И тогда выбранные нами коммиты сбросятся из истории. Например в ветке numerical :


Тогда в истории у нас останутся только нужные нам коммиты.
Теперь при слиянии веток в master получим оба класса.


Данный метод рабочий, только при условии работы в частной ветке, но если эти манипуляции провести в общей ветке, то при публикации ( git push ) git сообщает, что ветка устарела, так как в ней отсутствуют коммиты и отменяет публикацию.

Чтобы не бороться с git, старайтесь декомпозировать задачи заранее, а то можете словить сюрприз. Сталкивались ли вы с такими ситуациям, и если да, то как выходили из них?

Боюсь, я уже знаю ответ, но все равно все идет .. Я случайно нажал «Отменить все изменения» в VS Code (OSX), и теперь трудоемкость за месяц ушла. Poof'd . Дело в том, что у меня не было должной настройки GIT, поэтому я еще не делал коммитов. Могу ли я вернуть свою работу? Прямо сейчас мой рабочий каталог так же хорош, как пустой ..

Резюме: Ваша работа потеряна и не может быть восстановлена.

Параметр Очистить все (отменить все изменения) в коде VS по существу выполняется:

Так что все в руках git, может ли git clean -fd отменить отмененные изменения. К сожалению, изменения не сохраняются в git, поскольку они не зафиксированы, поэтому после выполнения git clean -fd git принудительно удалит неотслеживаемые файлы.

После выполнения команды git checkout -- . git извлечет все измененные файлы в git в качестве версии последнего коммита.

Если вы не можете использовать Ctrl + Z или Command + Z для отмены или не можете найти свои файлы в корзине / корзине, вы можете восстановить с помощью программного обеспечения для восстановления файлов. Мне удалось использовать бесплатную версию Recuva от Piriform, чтобы восстановить изменения, которые я случайно отменил.

После того, как случайно нажали сбросить btn на неверный файл, и я оказался здесь) Не найдя способа восстановить, я попробовал простые CMD + Z (CTRL + Z) в этом файле и boom - все вернулось, так что не сдаться и попробовать это :) Очень приятно

У меня только что была эта проблема. Я нажал стрелку «отменить изменения» рядом с неправильным файлом в VS Code (перед добавлением и фиксацией). Мой предыдущий файл не был в мусорном баке, и после исследования, CTRL + Z / CMD + Z был единственным путем. Если вы уже закрыли файл, то, к сожалению, вам не повезло.

Я сделал то же самое на моем ПК с Windows прямо сейчас в GitHub Desktop клиент. Я думал, что это вернет то, что НЕКОММЕДИЛЬНО, но решил все это вернуть. Эхх .

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

Не уверен, что MacOS также перемещает их в корзину. Двойная проверка, вам может повезти;)

В моем случае я ошибочно отбрасываю изменения из ветки. Этот код был на коммите bat не выдвинут. Я иду в .git/logs/refs/heads/ и нахожу файл с веткой. В этом файле я нахожу список заголовков. Затем в консоли я использую git reset для отмены фиксации.

Это ужасно, но мне повезло!

Мне удалось восстановить файлы, по которым я щелкнул, discard all changes . Без сомнения, git не имеет возможности восстановить эти потерянные изменения, кроме нашей системы (и VScode имеет).

  1. Я просто снова открыл эти файлы в VScode, используя ctrl+p .
  2. Открыв, я нажал ctrl+z , чтобы попытаться отменить свои изменения, и угадайте, что, буфер обмена моей системы поможет мне восстановить все мои точные изменения.

Если вы работали над новым файлом, он теперь удален и не имеет места. Тем не менее, вы можете восстановить файл, просто нажав ctrl+p , поскольку файл coz уже был открыт в VScode с меткой (deleted) .

Короче говоря, вы можете восстановить свои изменения, если вы не перезапустили свой VScode. Если это решение также работает для вас, не стесняйтесь высказать мой ответ. Спасибо !!

У меня есть коммит, выполненный разработчиком в удаленном репозитории Git, размещенном в VSTS, который необходимо откатить. Начиная с Visual Studio, не заходя в командную строку или как отменить фиксацию(коммит)?

Я хочу отменить фиксацию(коммит) через Visual Studio без использования командной строки.

2 ответа

Когда я пытаюсь отменить фиксацию(коммит) слияния с помощью EGit 4.1.1, я получаю следующую ошибку: Используя Git на bash, я могу сделать следующее git revert -m 1 f28ce5817da19f61110a3b794dcde50ea72341e9 , и это прекрасно работает.

Откройте вкладку "Changes" в команде Explorer. Выберите "Actions", затем "View History", чтобы просмотреть историю хранилища. Определите фиксацию(коммит), которую вы хотите отменить, щелкните ее правой кнопкой мыши и выберите "Revert" в контекстном меню.

Revert

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

Похожие вопросы:

Возможный Дубликат : Subversion: Уберите Случайную Проверку Как отменить фиксацию(коммит) файла в SVN?

С SVN легко отменить-merge фиксацию(коммит), но как это сделать с Git?

Я забыл добавить файлы перед фиксацией(коммитом), поэтому я сделал git commit перед git add. Как я могу вернуться? С git log я получаю : commit 606da2c2e5fb34cf0d971dce2930c4c9d921a46f Author: Name.

Я проверяю ветку с сервера и добавляю еще файлы, но не замечаю, что там нет .gitignore, и выполняю: git add ./* git commit xx Есть .class файл(и другие файлы) , которые мне не нужны? теперь я.

Когда я пытаюсь отменить фиксацию(коммит) слияния с помощью EGit 4.1.1, я получаю следующую ошибку: Используя Git на bash, я могу сделать следующее git revert -m 1.

Я не вижу возможности отменить фиксацию(коммит) в моей панели git Bluemix

Я сделал следующие комментарии git add /file1/path git rm /file/path git commit -m message как отменить последнюю фиксацию(коммит) с помощью git? Как будто я не хочу, чтобы эти файлы были.

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

Я хочу отменить выбранную фиксацию(коммит). Потому что моя команда толкает разные файлы и много коммитов. Что я сделал, так это вытащил удаленные файлы. теперь и мои файлы пропали. Я попробовал это.

Как я могу отменить фиксацию(коммит), но поместить изменения, но на сцену, чтобы я мог редактировать фиксацию(коммит) до тех пор, пока это не будет то, что я хочу. Раньше я был знаком с TFS, где.

Читайте также: