[Перевод] Git — сравнение Visual Studio 2022 с MeGit/EGit и SourceTree

4e8f09ee58a75df4d06f7e669ca91047.png


В этой статье мы сравним функциональность Git в IDE Visual Studio 2022 и в других клиентах Git с GUI. Git внутри VS2022 имеет упрощённый интерфейс по сравнению с некоторыми другими GUI-клиентами наподобие MeGit/EGit и SourceTree. Это привлекает многих разработчиков к платформе VS2022/Git, однако опытным пользователям дополнительно потребуются и другие инструменты.

1. Введение


Git интегрирован в IDE Visual Studio, начиная с версии 2019, а в версии 2022 он получил ещё больше возможностей и постепенно становится любимым инструментом для контроля версий в Visual Studio/Microsoft. В этой статье мы планируем рассмотреть базовые функции GUI-инструментов Git в VS2022.

▍ 1.1. GUI-клиент Git MeGit/EGit для сравнения


Я считаю, что автономный GUI-клиент Git MeGit/EGit [1] — это «правильный Git». Это GUI-инструмент Git, но из всех виденных мной GUI-инструментов Git он ближе всего к «философии и терминологии Git», а ещё мне нравится его поведение и внешний вид. Поэтому я буду использовать его как пример, чтобы лучше показать, как могут выглядеть GUI-опции по сравнению с GUI VS2022. Разумеется, настоящим примером должен быть интерфейс командной строки Git, но мне кажется, что в рамках этой статьи сравнивать с ним было бы слишком сложно. Правда в том, что ни один GUI-инструмент Git не может предоставить всех опций, имеющихся у интерфейса командной строки Git. Но справедливо и то, что пользователю, вероятно не потребуются все эти опции для повседневной работы. Например, я уже много лет работаю с TFS и делаю всё из GUI; при этом мне ни разу не приходилось использовать командную строку TFS [2].

58332752ce7401cf9d831773bf35270f.png

▍ 1.2. Философия Git в VS2022


Изучив GUI-интерфейс Git в VS2022, я пришёл к выводу, что его разработчики имели собственное мнение о том, как должен выглядеть Git. Похоже, они не хотели следовать философии Git во всех подробностях как, например, разработчики MeGit/EGit. Кажется, они думали, что все грязные подробности Git следует максимально скрыть от разработчиков; интерфейс пользователя упростился настолько, чтобы разработчики без знаний Git, имеющие лишь базовые знания концепции контроля версий, могли пользоваться им и коммитить свою работу локально и на сервер контроля версий. Возможно, это был умный подход, благодаря простоте изучения быстро привлёкший к платформе VS2022/Git множество пользователей/разработчиков. Однако некоторым опытным пользователям Git может не хватать некоторых инструментов/опций или может показаться, что Git реализован неправильно.

a5a4621d4ffd3db359c60890b2d143ad.png

▍ 1.3 GUI-клиент Git SourceTree для сравнения


Приложение Atlassian SourceTree [3] — это ещё один популярный GUI-клиент Git. Мы покажем, как его панели выглядят по сравнению с VS2022 в одних и тех же операциях. Мы считаем, что MeGit/EGit чуть более мощен и больше соответствует «философии работы Git». Разработчики SourceTree, аналогично разработчикам VS2022, решили сокрыть часть «внутренностей Git», например, информацию HEAD и Refs. Тем не менее, приложение отображает больше информации, чем VS2022.

8773f7fc8fe9cc65a9fb95c9e08d081f.png

▍ 1.4 Git не интуитивен для обучения


Я уверен, что многие разработчики попробуют «проложить себе дорогу к Git», просто осваивая GUI-опции Git в VS2022, особенно те, кто пришли с других систем контроля версий, например TFS. И до определённого уровня это сработает, поскольку VS2022 намеренно скрывает некоторые концепции Git, например, staging файлов (обычно пользователи TFS задаются вопросом: что такое staging и зачем он нужен?). Но я считаю, что рано или поздно вам придётся прочитать какую-нибудь книгу по Git, потому что он имеет собственную терминологию и философию, и если у вас когда-нибудь возникнет нерешаемая проблема с Git, то вам нужно будет точно знать, что делать и как правильно решить её. Если вы учитесь при помощи освоения GUI-инструментов, то для изучения Git я рекомендую поэкспериментировать с MeGit/EGit, поскольку так вы увидите больше подробностей, которые намеренно скрывает от вас VS2022.

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


2. VS2022 против MeGit


▍ 2.1. Методология тестирования


Мы рассмотрим один и тот же репозиторий Git из четырёх инструментов: VS2022, MeGIt, SourceTree и GitBash.

Мы локально создали проект простого приложения на C# и выбрали в качестве удалённого репозитория GitHub.

c278625ba5de1dbc2ec3b7cb8e56fe09.png


Тестирование выполнялось со следующей версией Visual Studio:

4e266d0ba1ca30742a7689892c1c83a9.png

▍ 2.2. Просмотр истории коммитов в репозиторий


Одна из базовых и важных функций: просмотр пользователями содержимого их репозитория.

❒ 2.2.1. История из GitBash


Команда Git git log отображает лог всех коммитов.

Вот все коммиты текущей ветки master.

728b3a90f1e8fa245830a01583bbc067.png


Вот коммиты всех веток с текущей веткой master.

ab75f8be67a8f9a625bfc80e2010ebcb.png


Вот «граф», который может создавать GitBash — все коммиты всех веток с текущей веткой master.

3fb3dca5b0116b3b38ba8aa9f6e0fddc.png

❒ 2.2.2. История из MeGit


Вот соответствующий граф, создаваемый MeGit. Это красивая графическая визуализация.

43ef2b478a0e7b04e63a2cf6dd53b08e.png


Она выглядит аналогично «графу», создаваемому GitBash. Обратите внимание, что в графе GitBash содержалась дополнительная информация — местоположение создания «хранилища» (stash), коммит ac95254. MeGit может показать это местоположение, но только по запросу (при нажатии на конкретный stash).

❒ 2.2.3. История из VS2022


Я нашёл в VS2022 три графа истории, и все они были хуже, чем даже граф Git командной строки. Похоже, разработчики не особо беспокоились о его реализации. Панель History VS2022 фильтрует и отображает коммиты, только относящиеся к текущей выбранной ветке.

Первый граф для той же структуры репозитория с текущей веткой master выглядит так:

bbacb752167f4e0f668378008a38a7f8.png


Есть и ещё более простая версия, без других веток:

ae161ef0baadc0d8adb9f9b4721c37f0.png


Также существует ещё одна версия, с показанными ссылками на ветки:

3b1037ace7adfafa2434e0129b68abab.png


Я считаю, что графы истории VS2022 хуже, чем граф истории MeGit, но опытному пользователю они могут оказаться полезными. В них можно удобно просмотреть изменения в репозитории.

Часто люди в Интернете задают вопрос: зачем вообще нужен красивый граф? Для меня ответ прост: интерфейс пользователя называется графическим, поэтому здорово иметь качественный граф, сравнимый, например, с графом истории MeGit.

К сожалению, стоит заметить, что VS2022 не показывает в графе местоположение ссылки HEAD, хотя и GitBash, и MeGit чётко отображают ссылку HEAD. Похоже, разработчики VS решили, что терминология Git наподобие ссылок HEAD должна быть скрыта от пользователей. Не уверен, что на самом деле возможно компетентно использовать Git в течение длительного времени, не зная, что такое ссылка HEAD.

❒ 2.2.2. История из SourceTree


Вот соответствующий граф, создаваемый SourceTree. Он имеет красивый графический вид.

76d9e8bff2cc92c93e1a9dd5a33caa69.png


Но разработчики SourceTree тоже решили скрыть от пользователя концепции наподобие HEAD и ссылок.

▍ 2.3. Просмотр веток, тегов, ссылок


❒ 2.3.1. Ветки, теги, ссылки в MeGit


Ветки, теги и ссылки в проекте/репозитории заметить очень легко:

870ffd39e7aeeca20ae8cd4e4be6ee9a.png


Обратите внимание, что помечена текущая checkout-ветка master. Также вы видите, что ссылка HEAD ref указывает на последний локальный коммит ec56b90 ветки master.

Чтобы выполнить checkout ветки Feature1, нужно нажать на нужную ветку правой клавишей мыши и выбрать в контекстном меню опцию.

c9c108dead83bc19dde8b69a4a6022c6.png

❒ 2.3.2. Ветки, теги, ссылки в VS2022


В VS2022 отображается более скромная информация:

35af6266d75acddab44818ac2547a326.png


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

Обратите внимание, что текущая checkout-ветка master выделена жирным шрифтом. Кроме того, текущую checkout-ветку можно увидеть в правом нижнем углу.

2248eb6927a8f47ba0c6855e93ae93e2.png


Чтобы выполнить checkout ветки Feature1, нужно нажать на нужной ветке правую клавишу мыши и выбрать в контекстном меню опцию.

3f9ae5f66aa1add4b22311ab399a93f6.png


Кроме того, вы можете выполнить checkout ветки во всплывающем меню в правом нижнем углу:

1177fb2e7d1cf2eec99ecbaefb39fb6d.png

❒ 2.3.3. Ветки, теги, ссылки в SourceTree


Ветки и теги проекта/репозитория легко заметны, однако ссылки в GUI не отображаются. Разработчики тоже решили скрыть подробности Git от пользователя.

64008b095ff2b148e2aec5191a5f2221.png


Обратите внимание, что текущая checkout-ветка master выделена жирным шрифтом.

Чтобы выполнить checkout ветки Feature1, нужно нажать на нужную ветку правой клавишей мыши и выбрать в контекстном меню опцию.

6cc016534a308541bd008ad7b56c96ab.png

▍ 2.4. Просмотр состояния Detached HEAD


Просмотреть состояние «Detached HEAD» легко. Достаточно выполнить checkout коммита, не находящегося на конце ветки, а затем закоммитить новые изменения. Давайте посмотрим, как отображается такое состояние.

❒ 2.4.1. Detached HEAD в MeGit


Вот как выглядит состояние Detached HEAD в панели History:

ec06156c2a037db890060fec57fc0e89.png


Как видите, HEAD указывает на коммит 40c21ff, а не на конец какой-то ветки. В терминологии Git этот коммит находится в состоянии Detached HEAD. В панели просмотра веток это представлено в следующем виде:

3a4a1cf4267e810ec5e22ee91019a9b3.png


Обратите внимание, что ни одна ветка не отмечена как выбранная, а ссылка HEAD содержит значение id этого коммита 40c21ff.

❒ 2.4.2. Detached HEAD в VS2022


Теперь взглянем на ту же ситуацию с репозиторием в VS2022. Вот как она выглядит в панели Branches:

f74d748b635e95f22bac5c6056df2ea9.png


Обратите внимание, что ни одна ветка не выделена жирным шрифтом. то есть ни одна не является checkout-веткой.

Кроме того, состояние Detached HEAD отмечено в правом нижнем углу:

e2641e56dc960314eabedd9bbc68d07b.png


Как мы видим, все упоминания ссылки HEAD в VS2022 избегаются, хотя интуитивно непонятно, что происходит с репозиторием и как устранить состояние Detached HEAD. Именно поэтому я считаю, что пользователь должен обладать реальными познаниями Git, а инструменты, скрывая от него концепции Git, не помогают ему в этом.

❒ 2.4.3. Detached HEAD в SourceTree


Вот как выглядит состояние Detached HEAD в панели History:

4113db349704d18fee6e6fa4daddd6d5.png


Как видите, HEAD указывает на последний коммит, а не на конец какой-то ветки. Хэш коммита можно увидеть в нижней панели, он равен 40c21ff. В терминологии Git этот коммит находится в состоянии Detached HEAD. Любопытно, что разработчики внезапно отображают нечто под названием HEAD, хотя до этого скрывали эту концепцию в приложении.

В панели просмотра веток это представлено в следующем виде:

ba5aa7517e5d6ac7635fafabcbaaf081.png


Обратите внимание, что ни одна ветка не помечена как выбранная.

❒ 2.4.4. Намеренное создание «висячего коммита»


Допустим, мы решили устранить состояние Detached HEAD, выполнив checkout ветки master и оставив новый коммит 40c21ff висячим. Доступ к такому коммиту невозможно получить ни по какой из ссылок и он не будет больше отображаться в History.

❒ 2.4.5. Восстановление висячего коммита/Detached HEAD в MeGit


Теперь в истории и ветках отображается checkout-ветка master, а упоминания коммита 40c21ff отсутствуют.

7c3c5d6dc7e8cf4d9844f6b30507d7eb.png


1b0534f892660a654a0ee9b39f1c1057.png


Что, если мы совершили ошибку и теперь хотим восстановить висячий коммит 40c21ff? Это возможно, мы можем найти его в панели Reflog:

741e3899e7dd70da5d754cce0d4e80c9.png


Можно нажать на него правой клавишей мыши и выбрать опции меню для его восстановления:

b3aea87e0649463a47b4fe3c0dc52fb5.png


И мы снова оказались в ситуации, когда этот коммит 40c21ff является checkout и мы можем делать всё, что угодно.

1d729e66ae5267f90599142088366273.png

❒ 2.4.6. Восстановление висячего коммита/Detached HEAD в VS2022


Вот как та же ситуация выглядит в VS2022:

4e8f09ee58a75df4d06f7e669ca91047.png


Теперь в истории и ветках отображается checkout-ветка master, а упоминания коммита 40c21ff отсутствуют. Можем ли мы выполнить восстановление коммита 40c21ff? Проблема в том, что в VS2022 нет панели Reflog.

Этот коммит 40c21ff по-прежнему находится в репозитории, однако через GUI VS2022 доступ к нему получить невозможно.

Для опытного пользователя это может быть проблемой и ему может понадобиться использовать другой инструмент для выполнения нужных действий. Разработчики VS2022 посчитали, что такие ситуации настолько редки, что среднестатистическому пользователю никогда не доведётся с ними сталкиваться.

❒ 2.4.7 Восстановление висячего коммита/Detached HEAD в SourceTree


А вот как выглядит теперь ситуация в SourceTree. Теперь в истории и ветках отображается checkout-ветка master, а упоминания коммита 40c21ff отсутствуют.

30ca3895a884ddfea9485d212202c6d9.png


Как нам восстановить коммит 40c21ff? Проблема в том, что в SourceTree нет панели Reflog. Но в нём есть значок для запуска GitBash, поэтому из командной строки мы можем получить нужную нам информацию, а именно хэш коммита:

ff7e26132d3e72e5df33f53e69d96249.png


Итак, мы можем выполнить в командной строке git reflog и получить нужный хэш:

00d7cd1a5c0a3b80e681ea88760162bb.png


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

f19b7c6813628f6e10801cfaf87503d2.png


b4c8a3068babfa419df76f0e41649776.png


ad31032ef29e5db27e4e0b6d77635856.png


После выполнения checkout этого коммита 40c21ff, на этот раз как части новой ветки, мы можем делать всё, что угодно.

▍ 2.5. Просмотр панели Unstaged-файлов/Staged-файлов/коммитов


Одна из основных функций GUI Git — выполнение коммитов работы в репозиторий.

❒ 2.5.1. Панель Unstaged-файлов/Staged-файлов/коммитов в MeGit


MeGit, в соответствии с философией Git, имеет отдельные формы Unstaged- и Staged-файлов.

Здесь вы видите, что были внесены изменения в файл ClassA.cs, а Git указывает изменения в форме Unstaged-файлов («Working directory changes»):

f219e2baca6cf74aeb2692584d81446b.png


Но чтобы выполнить коммит (обратите внимание, что кнопка Commit недоступна), необходимо использовать значок «плюс» и добавить изменения в форму Staged-файлов, после чего можно будет выполнить коммит изменений в репозиторий.

535d9129886e14a76e13b1de8c446be1.png

❒ 2.5.2. Панель Unstaged-/Staged-файлов/коммитов в VS2022


VS2022 в качестве диалогового окна коммитов по умолчанию отображает опцию выполнения коммитов файлов непосредственно из «Working directory changes» (Unstaged-файлов):

72124bbfb34d1c74e0047dc1043b1217.png


На самом деле, это соответствует правилам Git, поскольку такая команда существует в командной строке Git. Это схоже с выполнением git commit -am ".

Если вы хотите просмотреть форму «Staged files» и выбрать, для каких файлов нужно выполнить stage и коммит, нужно использовать значок «плюс» и добавить в Staged те файлы, коммит которых нужно выполнить:

521d4ecf5464b710ccb2658a0923e5d8.png


Теперь диалоговое окно коммитов выглядит как диалоговое окно MeGit.

Разработчики VS2022 решили «срезать углы», отображая непосредственный коммит в форме «Working directory changes».

Обычно пользователи задаются таким вопросом: зачем мне нужно сначала выполнять Stage файлов? Ответ прост: это необязательно, это только опция для ситуаций, когда, например, вы изменили пять файлов, а хотите закоммитить только три из них. Такую ситуацию можно разрешить, выполнив Staging этих трёх файлов и закоммитив только staged-файлы.

❒ 2.5.3. Панель Unstaged-файлов/Staged-файлов/коммитов в SourceTree


SourceTree, в соответствии с философией Git, имеет отдельные формы для Unstaged- и Staged-файлов.

Здесь вы видите, что были внесены изменения в файл ClassA.cs, а Git указывает изменения в форме Unstaged-файлов («Working directory changes»):

Image 44


Однако для выполнения коммита (обратите внимание, что кнопка Commit недоступна) нужно использовать кнопку Stage Selected и добавить изменения в форму Staged-файлов, после чего можно будет закоммитить изменения в репозиторий.

Image 45

2.6. Просмотр Stash


В обоих инструментах есть удобные панели для просмотра «хранилищ» (stash).

❒ 2.6.1. Stash в MeGit


Список всех stash в репозитории:

Image 46


Выберем один stash, Stash с индексом [0]. Тогда мы сможем просмотреть подробности об этом stash:

Местоположение в истории, когда был сделан stash:

Image 47


Подробная информация об этом stash:

Image 48


Разница в файлах, демонстрирующая изменения по stash:

Image 49

❒ 2.6.2. Stash в VS2022


Список всех stash в репозитории:

Image 50


Выберем один stash, Stash с индексом [0]. Тогда мы сможем просмотреть подробности об этом stash:

Подробная информация об этом stash:

Image 51


Разница в файлах, демонстрирующая изменения по stash:

Image 52


VS2022 не содержит опции отображения позиции в графе истории, где был сделан stash. Похоже, кто-то из разработчиков VS2022 ненавидит графы истории Git.

Вы можете задаться вопросом: зачем вообще нужно видеть эту информацию в графе? Для меня ответ прост: он называется графическим интерфейсом пользователя, поэтому было бы здорово видеть эту информацию в графе.

❒ 2.6.3. Stash в SourceTree


Список всех stash в репозитории:

Image 53


Выберем один stash, Stash с индексом [0].

Разница в файлах, демонстрирующая изменения по stash:

Image 54

2.7. Просмотр Blame


▍ 2.7.1. Blame в MeGit


Найти функциональность Blame немного сложно, потому что на этот раз MeGit использует не термин Git «Blame», а «Revision information». Всё выглядит хорошо:

Image 55


Как вы видите, мы смотрим на файл Program.cs и на строку 12. Последний раз её изменял автор MarkPelf в коммите cef7440, а ниже показана подробная информация об этом коммите, в том числе и граф истории.

Также мы видим diff файла для этого коммита cef7440.

Image 56

▍ 2.7.2. Blame в VS2022


Для того же сценария (файл Program.cs и строка 12) VS2022 изначально показывает меньше информации, но можно нажать правой клавишей мыши, чтобы получить больше информации о том, кто и в каком коммите в последний раз менял эту строку:

Экран Blame:

Image 57


Нажмём правой клавишей мыши на интересующей нас строке кода:

Image 58


Подробности коммита cef7440:

Image 59


Граф истории для коммита cef7440:

Image 60

▍ 2.7.3 Blame в SourceTree


Для того же сценария (файл Program.cs и строка 12), SourceTree изначально показывает меньше информации, но можно нажать правой клавишей мыши, чтобы получить больше информации.

Image 61


Нажмём правой клавишей мыши на интересующей нас строке кода:

Image 62


Подробности коммита cef7440:

Image 63

3. Заключение


В этой статье я привёл краткий обзор GUI-интеграции Git в IDE VS2022 и сравнил её с GUI-клиентами Git MeGit/EGit и SourceTree. Мы показали, что UI клиента MeGit более подробен и ближе соответствует «философии и терминологии Git». Мы показали, что разработчики VS2022 решили пойти по пути упрощения UI Git для пользователя и что многие внутренности Git спрятаны от пользователя.

Это хорошо тем, что привлекает к платформе Git множество новых разработчиков и стимулирует их переходить на Git благодаря простоте UI и удобству обучения. Плохо это тем, что некоторые важные концепции Git наподобие ссылок HEAD скрыты от пользователя, а некоторые опции Git намеренно ограничены. Опытным пользователям Git могут понадобиться другие инструменты Git, например, GitBash или какой-то другой GUI-клиент Git (MeGit/EGit [1], Sourcetree [3]), чтобы лучше понимать свои репозитории и выполнять сложные операции, не поддерживаемые GUI Git в VS2022.

Ясно одно — интеграция Git в IDE VS2022 определённо повысит популярность системы контроля версий Git.

4. Ссылки


oug5kh6sjydt9llengsiebnp40w.png

© Habrahabr.ru