Я пользователь SVN и сейчас изучаю GIT.
Добро пожаловать в банду!
SVN перевоспитание
В SVN я обычно [...]
Подожди немного. Хотя CVS и SVN и другие традиционные (то есть централизованные) системы контроля версий выполняют (в основном) ту же цель, что и современные (то есть распределенные) системы контроля версий, такие как Mercurial и Git, вам будет гораздо лучше изучать Git с нуля, а не пытаясь перенести рабочий процесс SVN в Git.
http://hginit.com ( вид на archive.org ) Джоэл Спольски (один из самых основателей Stack Exchange) представляет собой учебник для ртутного, не Git, но это ноль-й главы, «Subversion перевоспитания» является полезно для людей , переключающих от SVN к любой распределенной системе управления версий, так как она говорит вам , что SVN понятия вы должны (временно) ООН -Узнайте (или stash
далеко , так как пользователи Git могли бы сказать) , чтобы быть в состоянии обернуть вокруг головы распределенного концепции системы контроля версий и идиоматические рабочие процессы, созданные для работы с ними.
Таким образом, вы можете прочитать эту нулевую главу и в основном просто заменить слово «ртутный» на «Git» и тем самым должным образом подготовить себя и свой разум к Git.
Мелкий шрифт
(Вы можете пропустить это сейчас.) В то время как ртутный и Git гораздо больше похожи друг на друга , чем SVN, есть есть некоторые концептуальные различия между ними, так что некоторые из заявлений и рекомендаций в «Subversion перевоспитания» станет технически неправильно при замене "mercurial" на "Git":
- В то время как Mercurial внутренне отслеживает и хранит наборы изменений, Git внутренне отслеживает и сохраняет ревизии (то есть состояния содержимого дерева каталогов), как это делает Subversion. Но кроме Subversion Git выполняет слияния, просматривая различия между каждой участвующей ветвью соответственно и ревизией общего предка (истинное 3-точечное слияние), поэтому результат почти такой же, как и для Mercurial: слияние намного проще и меньше ошибок Чаще, чем в SVN.
- Хотя вы можете выполнять ветвление в Git путем клонирования репозитория (как это принято в Mercurial), гораздо чаще встречается создание новой ветки в репозитории Git. (Это потому, что ветки Git просто (перемещают) указатели на ревизии, тогда как ртутные ветки - это постоянные метки, применяемые к каждой ревизии. Эти постоянные метки обычно нежелательны, поэтому ртутные рабочие процессы обычно работают путем клонирования полного хранилища для отклонения разработки).
В SVN все является каталогом (но вы не обязательно должны обращаться с ним как с таковым)
Но я тебя перебиваю. Ты говорил?
В SVN я обычно оформляю репо на своей локальной машине, который включает все ветви в моем проекте, и я обычно выбирал папку для своей ветки, которая мне интересна, и работал там.
Если под этим вы имеете в виду, что вы извлекли корневую папку репозитория SVN (или любую другую папку, соответствующую более чем trunk
одной ветке или более, например, в обычном макете репозитория SVN branches
папку, содержащую все не магистральные ветви), тогда Я осмелюсь сказать, что вы, вероятно, неправильно использовали SVN (ish) или, по крайней мере, немного злоупотребили тем фактом, что ствол, ветви и теги все складываются в единое (хотя и иерархическое) пространство имен вместе с каталогами в пределах revisions / codebase.
Хотя может быть заманчиво менять несколько веток SVN параллельно, но это AFAIK, а не то, как SVN предназначен для использования. (Хотя я не уверен в том, какие конкретные недостатки могут работать, как это.)
В Git только каталоги являются каталогами
Каждый клон репозитория Git сам по себе является репозиторием Git: по умолчанию он получает полную копию истории исходного репозитория, включая все ревизии, ветви и теги. Но он сохранит все, что вам нужно: Git хранит его в своей базе данных на основе файлов, расположенной в скрытой .git/
подпапке корневой папки хранилища .
Но какие скрытые файлы вы видите в папке хранилища?
Когда вы git clone
хранилище, Git делает несколько вещей. Грубо говоря:
- Создает целевую папку , а в ней -
.git/
подпапку с «базой данных».
- Он передает ссылки (теги, ветви и т. Д.) В базу данных исходного репозитория и создает их копию в новой базе данных, давая им слегка измененное имя, помечающее их как «удаленные» ссылки.
- Он переносит все ревизии (то есть состояния файлового дерева), на которые указывают эти ссылки, а также все ревизии, на которые эти ревизии указывают напрямую или транзитивно (их родители и предки), в новую базу данных и сохраняет их, так что новые удаленные ссылки фактически указать на то, что доступно в новом хранилище.
- Он создает локальную ветку, отслеживающую удаленную ревизию, соответствующую ветви по умолчанию исходного хранилища (обычно
master
).
- Это проверяет это местное отделение.
Этот последний шаг означает, что Git ищет ревизию, на которую указывает эта ветвь, и распаковывает сохраненное там файловое дерево (база данных использует некоторые средства сжатия и дедупликации) в корневую папку хранилища. Эта корневая папка и все ее подпапки (кроме специальной .git
подпапки) называются «рабочей копией» вашего репозитория. Вот где вы взаимодействуете с содержимым текущей проверенной ревизии / ветки. Это просто обычные папки и файлы. Однако для взаимодействия с самим хранилищем («база данных» ревизий и ссылок) вы используете git
команды.
Просмотр веток Git и взаимодействие с ветками Git
В настоящее время я клонирую репо и клонирую конкретную ветку, используя gitk.
Версия, которую gitk
я получил, не может клонировать репозитории. Он может только просматривать историю репо и создавать филиалы и проверять филиалы. Также нет «клонирования» ветки. Вы можете только клонировать репозитории.
Вы имели в виду, что вы клонируете репо, используя, git clone ...
а затем, используя gitk
, проверяете ветку?
Папка проекта содержит только содержимое этой ветви, и я не вижу все ветви, как в SVN, что немного смущает меня.
[...]
- Я хотел бы знать, является ли описанный мною процесс git «стандартным», а некоторые - насколько правильным [...]
Да, это довольно стандартно:
- Клонировать репозиторий, используя
git clone ...
- Проверьте ветку, с которой вы хотите работать,
git checkout ...
или используйте графический инструмент, такой какgikt
Я не могу найти простой способ увидеть все ветви в моем локальном репозитории с помощью GIT.
- [...] или я скучаю по smt.
Может быть:
Как работать с несколькими ветками параллельно
- Также я хотел бы знать, как обрабатывать процесс, в котором мне нужно работать над двумя ветвями одновременно, например, в случае, если мне нужно сделать исправление на главном сервере, но также сохранить содержимое другой ветки.
Здесь есть разные сценарии:
Новое (еще не созданное) изменение необходимо применить к нескольким веткам
Используйте этот рабочий процесс:
- Создайте новую ветку
c
из ревизии, которая уже находится в предке всех этих ветвей (например, ревизия, которая внесла ошибку, когда изменение будет исправлено), или из ревизии, которая (включая всех ее предков) приемлема для введения в все эти ветви.
- Сделайте и передайте изменения в этой новой ветви
c
.
Для каждой ветви, b
которая нуждается в изменении:
Проверьте b
:
git checkout b
Объединить c
в b
:
git merge c
Удалить ветку c
:
git branch --delete c
Существующее изменение необходимо в другой ветке
(... но без других изменений, внесенных в то место, где находится это изменение)
- Проверьте ветку, где необходимо изменение
- Cherry-выберите ревизию (ы), вносящие изменения, в порядке
В одной ветви a
вы хотите изменить один или несколько файлов на точное состояние, которое они имеют в другой ветвиb
- Проверять, выписываться
a
Получить содержимое файла из ветки b
:
git checkout b -- path/to/a/file.txt path/to/another/file.cpp or/even/a/complete/directory/ ...
(За исключением git checkout
случаев без передачи путей, это не переключит на ветвь b
, а только получит оттуда запрошенное содержимое файла. Эти файлы могут существовать или не существовать a
. Если они есть, они перезаписываются с включенным содержимым b
.)
Работая над одной веткой, вы хотите посмотреть, как обстоят дела в другой ветке
Проверьте ветку, над которой вы хотите работать.
Затем, чтобы посмотреть на другую ветку,
- либо используйте графические инструменты, которые позволяют просматривать содержимое не проверенных в настоящий момент ревизий (например, при
gitk
попытке переключить переключатели с «патча» на «дерево»)
- или клонировать репозиторий во временный каталог и проверить там другую ветку
- или используйте
git worktree
для создания отдельного рабочего каталога того же хранилища (то есть, также используя базу данных в .git/
каталоге вашего текущего локального хранилища), где вы можете проверить эту другую ветку