Sourcetree как отменить коммит

от admin

Sourcetree — undo unpushed commits

I am using Sourcetree for Windows for a git-repository and would like to undo an unpushed commit.

Is that possible? If I do «revert commit», it creates a second commit which reverts the first commit, but I don’t want the first commit to appear at all in my source control.

I could also delete my local repository and pull it again without my local commit, but maybe there’s another way?

4 Answers 4

  1. Right click on the commit you like to reset to (not the one you like to delete!)
  2. Select «Reset master to this commit»
  3. Select «Soft» reset.

A soft reset will keep your local changes.

Edit

About git revert : This command creates a new commit which will undo other commits. E.g. if you have a commit which adds a new file, git revert could be used to make a commit which will delete the new file.

About applying a soft reset: Assume you have the commits A to E ( A—B—C—D—E ) and you like to delete the last commit ( E ). Then you can do a soft reset to commit D . With a soft reset commit E will be deleted from git but the local changes will be kept. There are more examples in the git reset documentation.

Отмена коммитов и изменений

В этом разделе мы обсудим доступные стратегии и команды Git для выполнения отмены изменений. Прежде всего необходимо отметить, что в Git не существует традиционной системы отмены, как в текстовых редакторах. Лучше воздержаться от сопоставления операций Git с какой бы то ни было традиционной концепцией отмены изменений. Кроме того, Git имеет собственную систему терминов для операций отмены, и в обсуждении лучше всего использовать их. В числе таких терминов — сброс (reset), возврат (revert), переключение (checkout), очистка (clean) и другие.

Git можно рассматривать как инструмент для управления временной шкалой. Коммиты — это снимки моментов времени или точек интереса на временной шкале истории проекта. Кроме того, с помощью веток можно управлять несколькими временными шкалами. Когда вы выполняете операцию отмены в Git, вы, как правило, перемещаетесь назад во времени или на другую временную шкалу, где ошибок не было.

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

Поиск утерянного: просмотр старых коммитов

В основе любой системы управления версиями лежит идея хранения «безопасных» копий проекта, чтобы у разработчиков не возникало опасений безвозвратно испортить базу кода. Когда в проекте сохранена история коммитов, можно повторно оценивать и анализировать любые ранее выполненные коммиты. Один из лучших инструментов для просмотра истории репозитория Git — команда git log . В примере ниже мы используем команду git log для получения последних коммитов популярной графической библиотеки с открытым исходным кодом.

Каждый коммит имеет уникальный идентифицирующий хеш SHA-1. Эти идентификаторы используются для перемещения по временной шкале коммитов и возвращения к коммитам. По умолчанию git log показывает только коммиты текущей выбранной ветки. Но не исключено, что искомый коммит находится в другой ветке. Для просмотра всех коммитов во всех ветках используется команда git log —branches=* . Команда git branch используется для просмотра и посещения других веток. Так, команда git branch -a возвращает список имен всех известных веток. Просмотреть весь журнал коммитов одной из этих веток можно с помощью команды git log .

После того как вы нашли ссылку на нужный коммит в истории, для перехода к нему можно использовать команду git checkout . Команда git checkout — это простой способ «загрузить» любой из этих сохраненных снимков на компьютер разработчика. При стандартном процессе разработки указатель HEAD обычно указывает на главную ветку main или другую локальную ветку. Но при переключении на предыдущий коммит HEAD указывает уже не на ветку, а непосредственно на сам коммит. Такая ситуация называется состоянием открепленного указателя HEAD , и ее можно представить так:

Переход к старой версии файла не перемещает указатель HEAD . Он остается в той же ветке и в том же коммите, что позволяет избежать открепления указателя HEAD. После этого можно выполнить коммит старой версии файла в новый снимок состояния, как и в случае других изменений. Соответственно, такое использование команды git checkout применительно к файлу позволяет откатиться к прежней версии отдельного файла. Для получения дополнительной информации об этих двух режимах посетите страницу команды git checkout .

Просмотр старых версий

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

Допустим, история вашего проекта выглядит примерно так:

Для просмотра коммита «Make some important changes to hello.txt» можно использовать команду git checkout в следующем виде:

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

Предположим, вы ведете разработку в главной ветке main по умолчанию. При каждом возвращении в ветку main можно использовать команду git revert или git reset для отмены нежелательных изменений.

Отмена коммита снимка

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

Займемся отменой коммита 872fa7e Try something crazy . Возможно, безумный эксперимент зашел слишком далеко.

Отмена коммита с помощью git checkout

С помощью команды git checkout мы можем перейти к предыдущему коммиту , a1e8fb5, и вернуть репозиторий в состояние, предшествовавшее этому безумному коммиту. Переход к отдельному коммиту переведет репозиторий в состояние открепленного указателя HEAD . Работа при этом перестает принадлежать какой-либо из веток. При открепленном указателе HEAD все новые коммиты будут оставаться без родителя, пока вы не вернете ветки в положенное состояние. «Сборщик мусора» в Git удаляет коммиты без родителя. Этот сервис работает с определенными интервалами и удаляет такие коммиты без возможности восстановления. Чтобы такие коммиты не были удалены «сборщиком мусора», перед их выполнением нужно убедиться, что мы работаем в ветке.

При наличии открепленного указателя HEAD можно выполнить команду git checkout -b new_branch_without_crazy_commit . Она создаст новую ветку с именем new_branch_without_crazy_commit и совершит переход в это состояние. Теперь репозиторий находится на новой временной шкале, где коммита 872fa7e не существует. На этом этапе мы можем продолжить работу в новой ветке, где коммита 872fa7e не существует и его можно считать «отмененным». К сожалению, если вам нужна предыдущая ветка (возможно, это главная ветка main ), такая стратегия не подходит. Поэтому рассмотрим другие стратегии отмены. Более детальную информацию и примеры см. в нашей подробной статье о git checkout .

Отмена публичного коммита с помощью git revert

Предположим, мы вернулись к исходному примеру истории коммитов. Истории, в которую входит коммит 872fa7e . В этот раз попробуем отмену путем обратной операции. При исполнении команды git revert HEAD Git создаст новый коммит с операцией, обратной последнему коммиту. В текущую историю ветки будет добавлен новый коммит, и она будет выглядеть следующим образом:

На этом этапе мы снова технически «отменили» коммит 872fa7e . Хотя коммит 872fa7e по-прежнему существует в истории, новый коммит e2f9a78 отменил изменения 872fa7e . В отличие от нашей предыдущей стратегии переключения с помощью команды checkout, мы можем продолжить работать с этой же веткой, поэтому данная стратегия является удовлетворительной. Это идеальный способ отмены при работе в открытых общих репозиториях, однако если у вас есть требование вести минимальную «очищенную» историю Git, эта стратегия может не подойти.

Отмена коммита с помощью git reset

Рассмотрение этой стратегии отмены мы продолжим на нашем рабочем примере. Команда git reset — это расширяемая команда с разнообразными функциями и вариантами использования. Если мы выполним команду git reset —hard a1e8fb5 , история коммитов будет сброшена до указанного коммита. Просмотр истории коммитов с помощью команды git log теперь будет выглядеть так:

Вывод команды log показывает, что коммиты e2f9a78 и 872fa7e больше не существуют в истории. На этом этапе мы можем продолжить работу и создавать новые коммиты так, словно «безумных» коммитов никогда не было. Этот метод отмены изменений оставляет историю максимально чистой. Отмена с помощью команды reset отлично подходит для локальных изменений, но при работе в общем удаленном репозитории создает сложности. Если у нас есть общий удаленный репозиторий, в котором с помощью команды push опубликован коммит 872fa7e , и мы попытаемся выполнить команду git push для ветки, в которой с помощью команды reset была сброшена история, система Git обнаружит это и выдаст ошибку. Git будет считать, что публикуемая ветка не была обновлена, поскольку в ней отсутствуют коммиты. В таких случаях лучше использовать отмену с помощью команды git revert .

Отмена последнего коммита

В предыдущем разделе мы рассмотрели различные стратегии отмены коммитов. Эти стратегии также можно применять и к последнему коммиту. Однако иногда последний коммит можно не удалять и не сбрасывать. Например, если вы просто сделали коммит преждевременно. В этом случае его можно исправить. После того как вы внесете дополнительные изменения в рабочий каталог и добавите их в раздел проиндексированных файлов с помощью команды git add , выполните команду git commit —amend . При этом Git откроет настроенный системный редактор, где вы сможете изменить комментарий к последнему коммиту. Новые изменения будут добавлены в исправленный коммит.

Отмена неотправленных изменений

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

Рабочий каталог

Рабочий каталог обычно синхронизируется с локальной файловой системой. Чтобы отменить изменения в рабочем каталоге, можно просто отредактировать файлы с помощью привычного редактора. Git имеет два инструмента для управления рабочим каталогом. Это команда git clean — удобная утилита для отмены изменений в рабочем каталоге, и команда git reset , которую можно вызвать с параметрами —mixed или —hard , чтобы сбросить изменения в рабочем каталоге.

Раздел проиндексированных файлов

Команда git add используется для добавления изменений в раздел проиндексированных файлов. Команда git reset предназначена главным образом для отмены изменений в разделе проиндексированных файлов. Команда reset с параметром —mixed перемещает все ожидающие изменения из раздела проиндексированных файлов обратно в рабочий каталог.

Отмена публичных изменений

При командной работе в удаленных репозиториях необходимо подходить к отмене изменений с особой осторожностью. Команда git reset , как правило, считается методом локальной отмены. Ее следует использовать для отмены изменений в частной ветке. Она безопасно изолирует удаление коммитов от других веток, которые могут использоваться другими разработчиками. Проблемы возникают, когда команда reset выполняется в общей ветке и затем эта ветка удаленно публикуется с помощью команды git push . В этом случае Git блокирует выполнение команды push и сообщает, что публикуемая ветка устарела, поскольку в ней отсутствуют коммиты, которые есть в удаленной ветке.

Читать:
Как включить лебедку в spin tires

Предпочтительная команда для отмены общей истории коммитов — git revert . Команда revert безопаснее, чем reset, так как она не удаляет коммиты из общей истории. Команда revert сохраняет отменяемые вами коммиты и создает новый коммит с операцией, обратной последнему коммиту. Этот метод можно безопасно применять в общих распределенных рабочих средах, так как удаленный разработчик может выполнить пул ветки и получить новый коммит, который отменяет его нежелательный коммит.

Резюме

Мы рассмотрели множество общих стратегий отмены изменений в Git. Важно помнить, что отменить изменения в проекте Git можно несколькими способами. Кроме того, здесь были затронуты и более сложные темы, которые подробно рассматриваются на страницах, посвященных соответствующим командам Git. Наиболее часто используемые инструменты для отмены — это команды git checkout, git revert и git reset . Вот несколько ключевых моментов, о которых следует помнить.

  • Обычно после коммита внесенные изменения отменить невозможно
  • Используйте git checkout для переходов и просмотра истории коммитов
  • Команда git revert — лучший инструмент для отмены общих публичных изменений.
  • Команду git reset лучше всего использовать для отмены локальных частных изменений.

Помимо основных команд отмены, мы рассмотрели другие команды Git: git log для поиска потерянных коммитов, git clean для отмены изменений, не подтвержденных коммитами, и git add для изменения индексирования.

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

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

Совсем не редки ситуации (а их даже большинство), когда над кодом какой-то программы работает не один человек, а несколько. Для того, чтобы работа нескольких разработчиков над одной и той же программой стала возможной, используются системы контроля версий (например, GIT). Код программы хранится в master-ветке, откуда каждый разработчик может создать себе копию этого кода и работать над ним не боясь помешать своим коллегам. После того как код будет отлажен, разработчик может добавить свои изменения в ветку master, то есть изменить основной код программы. И уже этот изменённый код в дальнейшем будут копировать себе все разработчики перед реализацией очередной задачи.

При таком варианте разработки всегда есть шанс, что два разработчика работая над разными задачами изменят код в одних и тех же файлах. Вполне вероятно, что они изменят одни и те же строки. Рассмотрим пример:

У нас есть команда разработчиков, работающих над одним продуктом. В работе они используют Bitbucket и SourceTree. Мы сейчас будем играть роль одного из разработчиков команды. SourceTree у нас скачан и подключен наш проект. Также у нас создана отдельная ветка, в которой у нас уже есть изменения в файле «Original.txt». Другой разработчик также редактировал этот файл и уже влил изменения в ветку master.

Мы добавили свой код и теперь пытаемся выполнить слияние нашей ветки с веткой master. При попытке создании pull request в Bitbucket у нас возникает ошибка. Возник конфликт, который нам требуется разрешить.

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

Без разрешения конфликта слияние не выполнить. Также конфликт невозможно решить средствами Bitbucket. Придётся решать конфликт вручную.

Добавление сторонней программы для разрешения конфликтов в SourceTree

Стандартные средства SourceTree, возможно, и предоставляют возможность разрешения конфликтов при слиянии, но мне не удалось разобраться как это делать. Поэтому я подключила внешнюю программу TortoiseMerge для удобного разрешения конфликтов. Как это сделать:
1. Установить TortoiseMerge на компьютер.
2. Открыть SourceTree.
3. В SourceTree в меню Инструменты выбрать пункт Настройки.

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

4. В разделе Общие установить чек-бокс Разрешить SourceTree изменять глобальные настройки Git и Mercurial. Без включения этой настройки мы не сможем подключить внешнюю программу для сравнения и слияния кода.

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

5. Открыть раздел Сравнение
6. В блоке Внешняя утилита сравнения / слияния в выпадающих списках Внешняя утилита сравнения и Инструмент слияния выбрать значение TortoiseMerge:

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

В полях Команда сравнения и Команда слияния нужно указать путь к исполняемому файлу TortoiseGitMerge.exe. Поля Параметры будут заполнены автоматически.

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

7. Нажать на кнопку Ок для сохранения изменений. Всё, внешняя программа для разрешения конфликтов подключена. Также при необходимости можно подключить любую другую программу из списка и даже не из списка, воспользовавшись пунктом Пользовательский.

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

Разрешение конфликтов с помощью внешней утилиты сравнения

Мы остановились на том, что Bitbucket сообщил нам о конфликте. Нам нужно его решить. Теперь, когда у нас есть программа для сравнения мы можем это сделать:

1. В SourceTree нажимаем на кнопку Слияние:

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

2. В открывшемся окне выбрать кликом ветку, с которой требуется провести слияние и нажать на кнопку ОК.

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

3. У нас появится сообщение о том, что существуют конфликты слияния:

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

4. Нажимаем на кнопку Закрыть и открываем в разделе Workspace пункт Состояния файлов:

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

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

5. В этом разделе у нас отображаются все текущие состояния файлов. С помощью выпадающего списка вверху формы при необходимости можно отфильтровать файлы по состояниям:

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

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

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

8. У нас открывается программа TortoiseGitMerge и в ней открывается наш файл, в котором требуется разрешить конфликт. Слева отображается наша версия файла, справа отображается версия файла из master-ветки. Жёлтым подсвечивается код, который был добавлен другим разработчиком. Также отображаются служебные теги, которые нужно будет удалить, если вы не хотите поломать свой код. Тег Head (1) указывает на изменения выполненные нами. На конец блока наших изменений указывает тег состоящий из символов = (2). Соответственно, master (3) указывает на изменения, которые находятся в ветке master:

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

9. Для того, чтобы иметь возможность редактировать файл (удалять, изменять текст вручную) убедитесь, что в меню активирована настройка Enable Edit

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

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

Если нам не нужно ничего менять в блоке, ничего не меняем.
Если нужно заменить какие-то блоки и использовать «нашу» версию (из файла слева), то кликаем по соответстующему блоку (в правом файле) правой кнопкой мыши и выбираем пункт Use other text block (использовать другой текстовый блок из левого файла) или в левом файле кликаем правой кнопкой мыши и выбираем пункт Use this text block (использовать этот текстовый блок).

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

Также обратите внимание и на другие варианты: можно использовать оба блока и указать какой должен идти первым, а какой вторым.

11. Переключаться между конфликтующими блоками в файле можно с помощью навигационных стрелок в меню Previous difference и Next difference:

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

12. После того как вы разобрались со всеми изменениями не забудьте удалить служебные теги head, master, символы равно и треугольные скобки. Они вам явно не пригодятся. Сохраните изменения нажав на кнопку Save. Всё. TortoiseGitMerge можно закрывать.

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

13. Если у вас не один конфликтующий файл, а несколько, то выполните шаги 6-12 для оставшихся файлов. Если все конфликты разрешены — переходите к шагу 14.

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

Отменить изменения связанные с разрешениями конфликтов можно следующим образом:

a. Нажмите на кнопку Отменить в SourceTree

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

b. В появившемся окне выберите вкладку Сбросить всё и нажмите на кнопку Сбросить всё.

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

Это отменит все локальные изменения и отменит неудавшуюся попытку слияния.

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

c. Подтвердите действие нажав на кнопку Ок в появившемся окне подтверждения:

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

d. Теперь можете повторно выполнить слияние и разрешить конфликты (шаги 1-13).

15. Мы разрешили все конфликты и теперь можем сделать коммит изменений в нашу ветку. В SourceTree программа автоматически оставила комментарий, что новый коммит — это слияние нашей ветки и ветки master. Добавляем все изменения в индекс (1) и после этого нажимаем на кнопку Закоммитить (2). Отправьте изменения в ветку, если не установили галочку Сразу отправить изменения в [имя ветки]:

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

16. Итак, все изменения отправлены в нашу ветку. Теперь мы можем делать Merge. Идём в Bitbucket, находим наш pull request и убеждаемся, что никаких конфликтов теперь нет (если страница была уже открыта, то обновите её) нажимаем на кнопку Merge:

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

17. Никаких ошибок нет, подтверждаем наше действие нажатием на кнопку Merge и радуемся жизни. Конфликты решены успешно.

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

Откат к предыдущему коммиту

Может случиться так, что в работе вам понадобится откатиться к какому-то определённому коммиту (например, вы сделали коммит, который сломал вашу ветку, и теперь вы хотите вернуться к предыдущей версии кода, до этого коммита). SourceTree позволяет это сделать. Для этого нужно выполнить следующие действия:

1. В SourceTree в разделе Hystory выбрать коммит, к которому нужно откатиться. Для этого нужно кликнуть по нему левой кнопкой мыши:

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

2. Кликнуть правой кнопкой мыши по выбранному коммиту и в контекстном меню выбрать пункт Сбросить состояние текущей ветки к этому коммиту:

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

3. В появившемся модальном окне выберите режим сброса:

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

Подробности о типах читайте в интернете.

4. Проверьте есть ли у вас файлы не в индексе (раздел «Состояния файлов»). Если есть, то выполните коммит изменений:

Разрешение конфликтов при слиянии кода в SourceTree и откат коммитов

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

Как удалить коммит из проекта Sourcetree на github

Я просто переименовал поле в своем проекте, и позже понял, что это привело к сбою моего приложения. Я хочу отменить свою фиксацию на более раннюю фиксацию и отредактировать и написать свой код оттуда. Теперь проблема в том, что когда я сбрасываю ветку до этого коммита и хочу сделать новые нажатия, это говорит мне, что я должен сначала вытащить, потому что ветка находится позади. Я не могу толкаться. Я работаю над Sourcetree в Windows. Есть идеи, как это исправить? https://i.stack.imgur.com/y08cb.jpg Я добавил изображение, чтобы лучше понять здесь. Я хочу сбросить до df .

before changed naming

2 ответа

Если вас не интересуют коммиты после df , вы можете выполнить полный сброс в SourceTree, чтобы зафиксировать df .

Щелкните правой кнопкой мыши df и выберите «сбросить текущую ветку до этой фиксации».
Обратите внимание, что это подразумевает принудительное нажатие, что нормально, если вы единственный, кто работает над этим проектом.

В SourceTree выберите последний «хороший» коммит (то есть тот, который старше того, который вы хотите удалить). Затем позвоните Repository -> Interactive Rebase. . Здесь вы можете изменить полную историю изменений. Когда закончите, нажмите и не забудьте установить флажок «Force Push» внизу диалогового окна.

Если флажок неактивен, вам необходимо сначала включить его: откройте Tools -> Options , вкладку Git . Установите флажок «Включить принудительное нажатие».

Похожие статьи