Обновить элемент до ревизии против возврата к ревизии

161

Я начал использовать Subversion с TortoiseSVN. Если я открою журнал и щелкну правой кнопкой мыши на старой ревизии, я увижу две опции, которые звучат так, будто они возвращаются к более старой версии: «Обновить элемент до ревизии» и «Вернуться к этой ревизии».

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

Итак, скажите, что ревизия HEAD равна 100, и я вернусь обратно к 95. Она вернет мое объединение рабочей копии обратно к 95. Затем я могу зафиксировать это изменение в репозитории, что создаст правильную ревизию 101? Как это отличается, если я должен был вернуться к ревизии 95? Разве это все еще не отменяет изменения по сравнению с последними ревизиями? Я не понимаю, как меняется состояние моей рабочей копии после возврата или обновления до более старой версии.

Эрик Анастас
источник

Ответы:

205

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

Возврат к этой ревизии приведет к отмене всех изменений в вашей рабочей копии, которые были сделаны после выбранной ревизии (в вашем примере рев. 96,97,98,99,100). Ваша рабочая копия теперь находится в измененном состоянии .

Содержимое файла в обоих сценариях одинаково, однако в первом случае у вас есть немодифицированная рабочая копия, и вы не можете зафиксировать свои изменения (поскольку ваша рабочая копия не указывает на HEAD rev 100), во втором случае у вас есть измененная рабочая копия, указывающая на голову и Вы можете продолжать работать и совершать

Питер Паркер
источник
1
Хорошо, так сказать, я обновляю до ревизии, и моя рабочая копия не содержит данных. Ничто не мешает мне изменить файлы. Что, если я изменю один из файлов и попытаюсь зафиксировать его. Я предполагаю, что Subversion увидит конфликт и заставит меня объединить последнюю версию в репозитории с моей измененной рабочей копией, прежде чем я отправлю ее.
Эрик Анастас
5
Если вы попытаетесь зафиксировать элемент с более старой BASE-версией, чем HEAD, вы получите «фиксация не удалась: ваша рабочая копия, вероятно, устарела»
Питер Паркер,
как лечить update toи revert to/fromобрабатывать локальные изменения (незафиксированные изменения)?
BaltoStar
Оба метода сохраняют локальные изменения без изменений, однако локальные изменения могут вызывать конфликты в обоих случаях, а в обратном случае изменения откатывания смешиваются со всеми локальными изменениями всех других пользователей. Так что хотя бы сохраните патч своих модификаций или зафиксируйте в ветке.
Питер Паркер
31

Чтобы понять, как состояние вашей рабочей копии отличается в обоих сценариях, вы должны понять концепцию BASE-редакции :

ОСНОВАНИЕ

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

Ваша рабочая копия содержит снимок каждого файла (скрытого в папке .svn) в этой редакции BASE, то есть, как это было при последнем извлечении из хранилища . Это объясняет, почему рабочие копии занимают в 2 раза больше места, и как возможно, что вы можете просматривать и даже отменять локальные изменения без подключения к сети.

Обновление элемента до ревизии изменяет эту базовую ревизию, делая BASE устаревшим. Когда вы попытаетесь зафиксировать локальные изменения, SVN заметит, что ваш BASE не соответствует HEAD хранилища. В фиксации будет отказано, пока вы не сделаете обновление (и, возможно, объединение), чтобы это исправить.

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

Вим Коенен
источник
Из принятого ответа «Содержимое файла обоих сценариев одинаково». Так зачем? Этот ответ объясняет окончательное различие и объясняет, почему «обновление» против «возврата» вызывает другое поведение при попытке фиксации.
радаробоб
как лечить update toи revert to/fromобрабатывать локальные изменения (незафиксированные изменения)?
BaltoStar
5

После этого файлы в вашей рабочей копии могут выглядеть точно так же, но они по-прежнему очень разные действия - хранилище находится в совершенно другом состоянии, и после возврата вам будут доступны другие параметры, чем «обновление» до старой версии ,

Вкратце, «обновление до» влияет только на вашу рабочую копию, но «обратное объединение и фиксация» повлияет на хранилище.

Если вы «обновите» старую ревизию, то хранилище не изменилось: в вашем примере ревизия HEAD по-прежнему равна 100. Вам не нужно ничего фиксировать, поскольку вы просто возитесь с вашей рабочей копией. Если вы внесете изменения в свою рабочую копию и попытаетесь зафиксировать ее, вам сообщат, что ваша рабочая копия устарела, и вам потребуется обновить ее, прежде чем вы сможете выполнить фиксацию. Если кто-то еще работает в том же хранилище, выполняет «обновление» или если вы извлекаете вторую рабочую копию, это будет r100.

Однако, если вы «отмените слияние» со старой ревизией, тогда ваша рабочая копия по-прежнему будет основана на HEAD (при условии, что вы обновлены), но вы создаете новую ревизию, чтобы заменить нежелательные изменения. Вы должны зафиксировать эти изменения, так как вы меняете хранилище. После того, как все обновления или новые рабочие копии, основанные на HEAD, будут отображаться как r101, с содержанием, которое вы только что зафиксировали.

Зак Томпсон
источник
5

Обновите вашу рабочую копию до выбранной ревизии. Полезно, если вы хотите, чтобы ваша рабочая копия отражала время в прошлом, или если в хранилище были зафиксированы дальнейшие коммиты, и вы хотите обновлять свою рабочую копию по одному шагу за раз. Лучше всего обновить весь каталог в вашей рабочей копии, а не только один файл, иначе ваша рабочая копия может быть несовместимой. Это используется для проверки конкретной цели оборотов. Если тест уже завершен, вы можете использовать эту команду для проверки другого оборота или использовать SVN Update для получения HEAD

Если вы хотите навсегда отменить предыдущее изменение, используйте вместо этого Вернуть к этой ревизии .

- из ТСВН, помогите доку

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

prime23
источник
2

Текст из ссылки Черепаха:

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

Если вы хотите навсегда отменить предыдущее изменение, используйте вместо этого Вернуть к этой ревизии.

Возврат к этой ревизии Возврат к более ранней ревизии. Если вы внесли несколько изменений, а затем решили, что действительно хотите вернуться к тому, что было в редакции N, эта команда вам нужна. Изменения отменены в вашей рабочей копии, поэтому эта операция не влияет на хранилище, пока вы не подтвердите изменения. Обратите внимание, что это отменит все изменения, сделанные после выбранной ревизии, заменив файл / папку более ранней версией.

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

Внутри происходит то, что Subversion выполняет обратное объединение всех изменений, внесенных после выбранной ревизии, отменяя эффект этих предыдущих фиксаций.

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

Если вы просто хотите посмотреть, как файл или папка выглядели в более ранней ревизии, используйте «Обновить до ревизии» или «Сохранить ревизию как ...».

Liker777
источник