Отслеживание изменений SVN и Git

Во время просмотра учебника на Lynda.com, посвященного распределенным системам управления версиями и централизованным системам управления версиями, я наткнулся на текст, который смутил меня о том, что Git отслеживает иначе, чем централизованные системы управления версиями. Я всегда думал, что упомянутая VCS отслеживает изменения, и при фиксации вы сохраняете моментальный снимок этих изменений в репозиторий, который используется для перехода от версии к версии. Но почему-то в следующем тексте утверждается, что Git так не работает.

Может ли кто-нибудь попытаться объяснить и прояснить это для меня?

In Git the changes are stored as change sets or patches, and we're focused on tracking changes not the versions of the document. Now that's a subtle difference, you may think, well, CVS and SVN those track changes too, they don't. They track the changes that it takes to get from version-to-version of each of the different files or the different states of a directory. Git doesn't work that way, Git really focuses on these change sets in encapsulating a change set as a discrete unit and then those change sets can be exchanged between repositories. We're not trying to keep up-to-date with the latest version of something instead the question is, do we have a change set applied or not?

Вы можете прочитать Глава 10 из Pro Git, в котором объясняется, как Git на самом деле хранит файлы. Короче говоря, каждая версия файла целиком хранится как «большой двоичный объект», а фиксация - это просто набор указателей на большие двоичные объекты, представляющие файлы в определенный момент времени. Две фиксации могут ссылаться на один и тот же большой двоичный объект, если файл не изменяется между фиксациями. Иногда для экономии места старые коммиты «упаковываются», и тогда коммит действительно представляет собой просто набор различий между файлами.

chepner 26.11.2018 15:47

Я бы сказал, что большие различия - это централизованная и децентрализованная, линейная история и история графиков DAG, отслеживание на уровне файлов и отслеживание на уровне репо. Те, кто уделяет большое внимание «отслеживанию состояния репозитория» и «отслеживанию изменений» (например, различия между способами сохранения изменений / состояния в Mercurial и git), спорят о семантике и мелких деталях, о которых большинству людей даже не нужно думать о.

Mort 09.12.2018 04:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
571
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В CVCS изменения синхронизируются вокруг единого центрального репозитория. Итак, фиксируя изменение, пользователь создает одну версию в этом репозитории для других.

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

... и, в конце концов, вам все равно придется фиксировать / синхронизировать изменения в централизованном репозитории Git / DVCS в большинстве случаев.

bahrep 26.11.2018 14:33

@bahrep Как правило да, и вы не обязаны синхронизировать только место, когда вы хотите сохранить / поделиться своими изменениями.

kan 09.01.2019 16:14
Ответ принят как подходящий

Это руководство ужасно неверно:

  1. Git не сохраняет наборы изменений. Git вычисляет ревизии, динамически, по запросу. (Git действительно выполняет дельта-сжатие внутри файлов пакетов, но файлы пакетов довольно хорошо скрыты по сравнению с моделью хранилища объектов Git, которая намеренно раскрывается через хеш-идентификаторы.)
  2. Это бесполезное различие при обсуждении распределенного и централизованного. (См. Также Кан ответ.)

Вот что я могу сказать о распределении и централизации в моей собственной книге:

The key difference between these two kinds of systems is that a centralized VCS has a designated master repository. There may be multiple copies of the master, or even multiple masters with some kind of synchronization protocol (e.g., ClearCase MultiSite), but there is only one master. Their design assumes this single-master-ship and thus is allowed to depend on it.

With a distributed VCS, there is no designated master repository. Users generally have a complete, private copy of each repository. Communications between these private copies are, at least in principle, peer-to-peer operations: neither repository is any more masterful, and conflicts—situations where both Alice and Bob have made changes to the same regions of the same files—can and do occur and require some kind of resolution.

It’s always possible to use a distributed VCS in a centralized manner: you simply designate one particular repository as the master version, and coordinate updates to it. However, centralized systems often provide features like locking source files or directories, restricting access (for read and/or write, to particular files, directories, and/or branches), and so on. With a typical DVCS it’s more difficult (though not technically impossible) to provide these, and Git and Mercurial simply don’t, at least not without add-ons. With CVCSes that provide locking, users may lock files (typically just one specific version ID) to prevent other users from making conflicting changes. This is conceptually easier, but of course it can prohibit parallel work.

Другие вопросы по теме