Git-Source Control на предприятии: предлагаемые инструменты и практики? - PullRequest
120 голосов
/ 05 марта 2010

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

Но теперь он обязателен на работе, и, честно говоря, у нас проблемы.

Из коробки «git», кажется, не очень хорошо подходит для централизованной разработки в большой (более 20 разработчиков) организации с разработчиками различных способностей и уровней сложности git - особенно по сравнению с другими системами контроля версий, такими как Perforce или Subversion, которые нацелены на такую ​​среду. (Да, я знаю, Линус никогда не предназначал это для этого.)

Но - по политическим причинам - мы застряли с git, даже если он отстой от того, что мы пытаемся с ним сделать.

Вот некоторые вещи, которые мы видим:

  • Инструменты с графическим интерфейсом не развиты
  • Используя инструменты командной строки, очень легко испортить слияние и уничтожить чужие изменения
  • Он не предоставляет разрешения для репозитория для каждого пользователя, кроме глобальных прав доступа только для чтения или чтения-записи
  • Если у вас есть разрешение на ЛЮБУЮ часть репозитория, вы можете сделать то же самое для КАЖДОЙ части репозитория, так что вы не можете сделать что-то вроде создания небольшой группы отслеживания на центральном сервере, которая бы выполнялась другими людьми. не могу связываться с.
  • Трудно поощрять рабочие процессы, отличные от «что-то идет» или «доброжелательный диктатор», не говоря уже о применении
  • Неясно, лучше ли использовать один большой репозиторий (который позволяет всем связываться со всем) или множество репозиториев для каждого компонента (которые создают головную боль при попытке синхронизировать версии).
  • С несколькими хранилищами также неясно, как скопировать все источники, которые есть у кого-то другого, извлекая из центрального хранилища, или сделать что-то вроде получения всего по состоянию на 4:30 вчера днем.

Однако я слышал, что люди успешно используют git в крупных организациях по разработке.

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

Кстати, я уже задавал версию этого вопроса в LinkedIn, и не получил никаких реальных ответов, но много «черт возьми, я бы тоже хотел это знать!»

ОБНОВЛЕНИЕ: Позвольте мне уточнить ...

Там, где я работаю, мы не можем использовать НИЧЕГО, кроме git . Это не вариант. Мы застряли с этим. Мы не можем использовать mercurial, svn, bitkeeper, Visual Source Safe, ClearCase, PVCS, SCCS, RCS, базар, Darcs, monotone, Perforce, Fossil, AccuRev, CVS или даже хороший добрый проектор Apple, который я использовал в 1987 году. Поэтому, пока вы можете обсуждать другие варианты, вы не получите награду, если не будете обсуждать git.

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

Ответы [ 16 ]

65 голосов
/ 09 марта 2010

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

DVCS против CVCS в контексте предприятия:

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

Еще одно измерение в контексте дисциплины - поощрение ветвления и экспериментов. Вот цитата из недавней записи Мартина Фаулера в bliki об инструментах контроля версий , он нашел очень краткое описание этого явления.

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

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

Workflows:

Ларри Остерман (разработчик Microsoft, работающий в команде Windows) имеет отличное сообщение в блоге о рабочем процессе, который они используют в команде Windows. В частности, они имеют:

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

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

Hierachical Repositories

(Картинка украдена у Джоэла Спольски hginit.com .)

Однако на данный момент остается сказать следующее: - хотя DVCS предоставляет отличные возможности слияния, никогда не заменит использование Continuous Integration. Даже в этот момент у вас есть большая гибкость: CI для репо ствола, CI для репо команды, репо Q & A и т. Д.

Git в контексте предприятия:

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

  • Все еще несколько незрелая поддержка в Windows (пожалуйста, исправьте меня, если это изменилось недавно) Теперь в Windows есть клиент github для Windows , tortoisegit , SourceTree от atlassian
  • Отсутствие зрелых инструментов с графическим интерфейсом, отсутствие интеграции с VDIFF / инструментом слияния для первого класса
  • Несовместимый интерфейс с очень низким уровнем абстракций поверх его внутренней работы
  • Очень крутая кривая обучения для пользователей SVN
  • Git очень мощный и позволяет легко изменять историю, очень опасно, если вы не знаете, что делаете (и иногда будете, даже если думали, что знаете)
  • Коммерческая поддержка недоступна

Я не хочу начинать git и hg flamewar, вы уже сделали правильный шаг, переключившись на DVCS. Mercurial рассматривает некоторые из вышеперечисленных пунктов, и я думаю, что он лучше подходит для корпоративного контекста:

  • Поддерживаются все платформы, на которых работает python
  • Великолепные инструменты GUI на всех основных платформах (win / linux / OS X), первоклассная интеграция инструментов слияния / vdiff
  • Очень согласованный интерфейс, простой переход для пользователей SVN
  • Может делать большинство вещей, которые может делать git, но обеспечивает более чистую абстракцию. Опасные операции всегда являются явными. Расширенные функции предоставляются через расширения, которые должны быть явно включены.
  • Коммерческая поддержка доступна от selenic.

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


Уменьшение трения:

Хорошо, поскольку вы, похоже, действительно застряли в ситуации, осталось два варианта ИМХО. Там нет инструмента, чтобы сделать Git менее сложным; мерзавец сложен . Либо вы сталкиваетесь с этим, либо работаете с git: -

  1. Получите вводный курс для всей команды. Это должно включать только основы и некоторые упражнения (важно!).
  2. Конвертируйте мастер репо в svn и позвольте "молодым звездам" git-svn . Это дает большинству разработчиков простой в использовании интерфейс и может компенсировать отсутствие дисциплины в вашей команде, в то время как молодые звезды могут продолжать использовать git для своих собственных репозиториев.

Если честно, я думаю, что у вас действительно есть проблема с людьми, а не проблема с инструментом. Что можно сделать, чтобы улучшить ситуацию?

  • Вы должны четко дать понять, что, по вашему мнению, ваш текущий процесс закончится поддержкой кода.
  • Инвестируйте некоторое время в непрерывную интеграцию. Как я уже говорил выше, независимо от того, какой тип VCS вы используете, CI никогда не заменится. Вы заявили, что есть люди, которые вставляют дерьмо в мастер-репо: пусть они исправят свое дерьмо, когда горит красный сигнал тревоги и обвиняет их в том, что они нарушили сборку (или не соответствуют метрике качества или что-то в этом роде).
27 голосов
/ 05 марта 2010

Я инженер SCM для довольно крупной организации разработки, и мы перешли на git из svn за последний год или около того. Мы используем его централизованно.

Мы используем gitosis для размещения репозиториев. Мы разбили наши монолитные svn-репозитории на множество меньших git-репозиториев, поскольку ветвь git является в основном репозиторием. (Есть способы обойти это, но они неудобны.) Если вам нужны виды контроля доступа для каждой ветви, лучше подойдет gitolite . Существует также версия GitHub внутри брандмауэра, если вы хотите потратить деньги. Для наших целей хорошо подходит gitosis, потому что у нас довольно открытые разрешения на наши репозитории. (У нас есть группы людей, которые имеют доступ на запись к группам репозиториев, и каждый имеет доступ на чтение ко всем репозиториям.) Мы используем gitweb для веб-интерфейса.

Что касается некоторых ваших конкретных проблем:

  • слияния: вы можете использовать визуальный инструмент слияния по вашему выбору; в разных местах есть инструкции по настройке. Тот факт, что вы можете выполнить слияние и полностью проверить его достоверность в локальном репо, на мой взгляд, является большим плюсом для git; Вы можете проверить слияние, прежде чем что-то нажимать.
  • GUI: у нас есть несколько человек, использующих TortoiseGit, но я не очень рекомендую это; кажется, странным образом взаимодействует с командной строкой. Я должен согласиться, что это область, которая нуждается в улучшении. (Тем не менее, я не фанат GUI для контроля версий в целом.)
  • ветви отслеживания небольших групп: если вы используете что-то, что обеспечивает более детализированные ACL, такие как gitolite, это достаточно просто сделать, но вы также можете создать общую ветку, подключив локальные репозитории различных разработчиков - репозиторий git несколько пультов.

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

26 голосов
/ 05 марта 2010

Да, я знаю, Линус никогда не предназначал это для этого.

На самом деле, Линус утверждает, что централизованные системы просто не могут работать.

А что не так с рабочим процессом диктатора и лейтенантов?

diagram

Помните, что git - это распределенная система; не пытайтесь использовать его как центральный.

(обновлено)

Большинство ваших проблем исчезнет, ​​если вы не попытаетесь использовать git, как если бы он был "svn on стероидами" (потому что это не так).

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

Обычно эти люди должны быть руководителями команды: каждый лидер объединяет работу своей команды и переносит ее в благословенное хранилище.

Еще лучше, кто-то еще (то есть диктатор) извлекает из лидеров команд и интегрирует их изменения в благословенное хранилище.

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

Если у интеграторов нет времени на просмотр кода, это нормально, но вам все равно нужны люди, которые объединяют слияния всех.

Выполнение мерзавцев не занимает много времени.

git pull A
git pull B
git pull C

мерзавец заменяет человеческое время и внимание; вот почему это было написано в первую очередь.

  • Инструменты GUI не развиты

Инструменты графического интерфейса могут справляться с основными вещами довольно хорошо.

Для сложных операций требуется кодер / всезнайка (например, мне удобно работать из командной строки). Понять понятия нужно немного времени, но это не так сложно.

  • Используя инструменты командной строки, очень легко испортить слияние и уничтожить чужие изменения

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

Но если вы настроите свой рабочий процесс так, чтобы только несколько человек (интеграторы) писали в «благословенный» репозиторий, это не будет проблемой.

Git не позволяет легко испортить слияния.

Когда возникают конфликты слияния, git четко помечает конфликтующие строки, чтобы вы знали, какие изменения у вас, а какие нет.

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

И поскольку эти инструменты не знают, как объединять, вам всегда приходится объединять вещи вручную. Например, как только кто-то сделает коммит на файл, который вы редактируете локально, он будет помечен как конфликт, который необходимо разрешить вручную; теперь - кошмар обслуживания.

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

Если кто-то уничтожает изменения других людей при разрешении конфликта слиянием, это не будет ошибкой: это будет либо потому, что это было необходимо для разрешения конфликта, либо потому, что они не знают, что делают.

  • Он не предоставляет разрешений для репозитория для каждого пользователя, кроме глобальных прав доступа только для чтения или чтения-записи

  • Если у вас есть разрешение на ЛЮБУЮ часть репозитория, вы можете сделать то же самое для КАЖДОЙ части репозитория, поэтому вы не можете сделать что-то вроде создания небольшой группы отслеживания на центральном сервере. с которыми другие люди не могут связываться.

  • Трудно поощрять рабочие процессы, отличные от "что-нибудь идет" или "доброжелательный диктатор", не говоря уже о применении

Эти проблемы исчезнут, когда вы перестанете пытаться использовать git, как если бы это была централизованная система.

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

Судебный звонок.

Какие у вас проекты?

Например: зависит ли версия xy проекта A от конкретной версии wz проекта B, так что каждый раз, когда вы проверяете xy проекта A, вы также должны извлекать wz проекта B, иначе он выиграет ' т строить? Если так, то я поместил бы и проект A, и проект B в один и тот же репозиторий, поскольку они, очевидно, являются двумя частями одного проекта.

Лучшая практика здесь - использовать свой мозг

  • С несколькими хранилищами также неясно, как скопировать все источники, которые есть у кого-то другого, извлекая из центрального хранилища, или сделать что-то вроде получения всего по состоянию на 4:30 вчерашнего дня.

Я не уверен, что вы имеете в виду.

6 голосов
/ 19 февраля 2011

Я настоятельно рекомендую http://code.google.com/p/gerrit/ для работы на предприятии. Это дает вам контроль доступа плюс встроенный рабочий процесс на основе обзора. Он аутентифицируется против любой системы LDAP. Вы можете подключить его к Hudson с помощью http://wiki.hudson -ci.org / display / HUDSON / Gerrit + Plugin , что позволит вам создавать и тестировать изменения, пока они еще находятся на рассмотрении; это действительно впечатляющая установка.

Если вы решите использовать gerrit, я рекомендую стараться вести довольно линейную историю, а не ветвистую историю, как некоторые парни из открытого исходного кода любят. Геррит формулирует это как «разрешить только быстрые изменения вперед». Тогда вы можете использовать ветвление и слияние в большей степени, чем вы привыкли, для выпусков и так далее.

5 голосов
/ 05 апреля 2012

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

У вас здесь совершенно другой набор проблем:

  • рабочие процессы
  • клиентские инструменты
  • контроль доступа к серверу и интеграция

* Рабочие процессы 1014 *

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

Клиентские инструменты

Теперь доступно несколько вариантов, теперь это очень людное место. Многие разработчики успешно используют IntelliJ Idea и Eclipse с плагином Git , без каких-либо других вещей. Также большинство разработчиков Linux без проблем используют git-клиент CLI. Некоторые разработчики Mac успешно используют Tower Git . Обратите внимание, что ни один из этих клиентов не может помешать пользователю "запутаться" с центральным хранилищем: необходим механизм управления на стороне сервера

Контроль доступа к серверу и интеграция

Если вы хотите, чтобы разработчики не «запутали» ваш Git-репозиторий, вам действительно нужно выбрать решение, которое:

  • предоставляет достойный интерфейс веб-администратора для выполнения каждой операции
  • позволяет вам применять идентификационные данные пользователей (использование «чистого» Git-хранилища чрезвычайно легко сделать в интересах кого-то другого)
  • обеспечивает вам детальную защиту (например, вы можете запретить FORCE-PUSH и настроить некоторые ветки на чтение только для некоторых разработчиков / групп)
  • интеграция с вашей корпоративной системой аутентификации (т. Е. LDAP, Windows ActiveDirectory)
  • обеспечивает полный аудит (иногда соответствие SOX очень важно для крупных корпораций)

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

  • Gitorious : он может обеспечить базовый уровень безопасности доступа, но ему не хватает точного управления разрешениями из коробки, поэтому вам, вероятно, придется выполнить некоторое кодирование для обработки сценариев, таких как разрешения на уровне ветви. Также отсутствует интеграция с существующими механизмами корпоративной аутентификации
  • GitHub Enterprise: недавно опубликованный GitHub, в вашей компании есть GitHub. Не хватает SOX-совместимости и мелкозернистой защиты
  • Gerrit : он может обеспечить высокую степень защиты уровня доступа и интеграцию с корпоративными системами аутентификации, но ему не хватает соответствия SOX и SSO. Также некоторые операции можно выполнять только через SSH через CLI
  • GitEnterprise : он предоставляет разрешения на уровне филиала, SSO, соответствие SOX, полное веб-администрирование. Недавно он также был интегрирован с Gerrit, так что он также предоставляет вам полный экземпляр Gerrit

Надеюсь, это поможет!

3 голосов
/ 05 апреля 2012

На инструментах пользователи MacOS-X находят GitX (http://gitx.frim.nl/) очень простым и эффективным. Недостатком является то, что он не поддерживает хуки Git Client (те, что в $ GIT_ROOT / .git / hooks) .

В целом я настоятельно рекомендую выбрать инструмент, поддерживающий детализированный контроль доступа для: - ветви (для отделения веток стабильного выпуска со строгой безопасностью от веток темы, которые требуют большей гибкости и гибкости) - удостоверение личности (автор / коммиттер). Это КЛЮЧ для SOX - Git команды ограничения - аудит-след. Это КЛЮЧ для SOX

Те, которые я успешно использовал с этими функциями:

  1. Обзор кода Gerrit (http://code.google.com/p/gerrit/)
  2. GitEnterprise (http://gitenterprise.com)
  3. CollabNet TeamForge (http://www.collab.net/gotgit), использует Gerrit 2.1.8 за кулисами

P.S. Не стоит недооценивать соответствие SOX и CMMI : во многих случаях у вас есть ограниченный выбор, который диктуется вашей корпоративной политикой безопасности.

Надеюсь, это поможет.

Лука.

3 голосов
/ 20 февраля 2011

Похоже, ваша проблема в том, что вы не определились или не создали рабочий процесс.Git достаточно гибок, чтобы использовать его как svn или любую другую VCS, но он настолько мощный, что, если вы не установите правила, которым все должны следовать, вы просто получите беспорядок.Я бы порекомендовал рабочий процесс диктатора-лейтенанта, который кто-то упомянул выше, но в сочетании с моделью ветвления, описанной Vincent Driessen .Для получения дополнительной информации смотрите эти скринкасты Дэвида Бока , а эту Mark Derricutt .

2 голосов
/ 31 мая 2010

Мы недавно перешли с svn на git. Поскольку git-daemon не работает с msysgit, мы выбрали подход с центральным репозиторием на сервере Linux с gitosis.

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

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

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

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

Процесс рецензирования начинается с того, что владелец ветки отправляет diff на обзорную доску и помещает зеленую заметку на доске с названием ветки (у нас есть рабочий процесс на основе Канбана) в разделе «для рецензирования», или если он является частью Законченная пользовательская история, переместите всю карточку истории в «для просмотра» и поместите в нее сообщение. Менеджер по связям - это тот, кто перемещает карты и отправляет их в «готово к тестированию», а затем владелец продукта может выбрать, какие из них включить в следующем тестовом выпуске.

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

Когда релиз запущен в производство, тег используется как новая база для филиалов, и все существующие ветви объединяются с ним. Таким образом, все ветви имеют общего родителя, что облегчает обработку слияний.

1 голос
/ 20 июня 2012

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

1 голос
/ 23 января 2012

GUI: На данный момент TortoiseGit v1.7.6 должен подойти для большинства ежедневных операций.Журнал, фиксация, Push, Pull, Fetch, Diff, Merge, Branch, Branch, Cherry-pick, Rebase, Tag, Export, Stash, Add submodule и т. Д. ... Также поддерживает x64 изначально

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...