Я користувач SVN, і зараз я вивчаю GIT.
Ласкаво просимо до банди!
Перевиховання СВН
У SVN я зазвичай [...]
Затримайтеся на хвилину. Хоча CVS та SVN та інші традиційні (тобто централізовані) системи управління версіями виконують (здебільшого) ту саму мету, що і сучасні (тобто розподілені) системи управління версіями, такі як mercurial і Git, вам буде набагато краще вивчити Git з нуля замість намагаючись перенести робочий процес SVN в Git.
http://hginit.com ( погляд на archive.org ) Джоел Спольський (один із самих засновників Stack Exchange) - це навчальний посібник для меркуріалу, а не Git, але це нульовий розділ, "Підвищення субверсії" - це корисно для людей, які переходять із SVN на будь-яку розповсюджену систему контролю версій, оскільки вона розповідає про те, які SVN-концепції потрібно (тимчасово) скасувати (або stash
вдалині , як можуть сказати користувачі Git), щоб можна було обернути голову навколо розподіленої Концепції системи управління версіями та ідіоматичні робочі процеси, створені для роботи з ними.
Тож ви можете прочитати цю нульову главу і здебільшого просто замінити слово "меркурій" на "Git" і тим самим належним чином підготувати себе та свій розум до Git.
Дрібний шрифт
(Ви можете пропустити це зараз.) У той час як ртутний і Git набагато більше схожі один на одного , ніж SVN, є є деякі концептуальні відмінності між ними, так що деякі із заяв і рекомендацій в «Subversion перевиховання» стане технічно неправильно при заміні "mercurial" на "Git":
- У той час як внутрішній обмін відстежує і зберігає набори змін, Git внутрішньо відстежує і зберігає зміни (тобто стани вмісту дерева каталогів), як і Subversion. Але крім Subversion Git виконує злиття, переглядаючи різницю між кожною залученою гілкою відповідно та звичайним переглядом предків (справжнє 3-кратне злиття), тому результат є майже таким же, як і для меркуріального: Об'єднання набагато простіше і менше помилок -прон, ніж у СВН.
- Хоча ви можете розгалужувати Git, клонувавши сховище (як це прийнято в меркуріалі), набагато частіше створювати нову гілку у сховищі Git. (Це тому, що гілки Git - це просто (рухаються) покажчики на версії, тоді як меркуріальні гілки - це постійні мітки, застосовані до кожної редакції. Ці постійні мітки зазвичай небажані, тому робочі потоки меркуріалу зазвичай працюють шляхом клонування повного сховища для розбіжних розробок.)
У SVN все є каталогом (але не слід обов'язково ставитися до цього як до такого)
Але я тебе перебивав. Ви говорили?
У SVN я зазвичай оформлюю репо на своїй локальній машині, яка включає всі відділення в моєму проекті, і я вибирав папку для своєї філії, яка мені цікава, і там працюю.
Якщо, маючи на увазі, ви маєте на увазі, що ви перевірили кореневу папку репозиторію SVN (або будь-яку іншу папку, що відповідає більше ніж trunk
одній гілці або, наприклад, у звичайній компоновці репортажу SVN branches
папка, що містить усі гілки без стволів), то Смію сказати, що ви, мабуть, неправильно використовували SVN (ish), або принаймні трохи зловживали тим фактом, що стовбур, гілки та теги всі складені в єдиний (хоча ієрархічний) простір імен разом з каталогами в редакції / базі даних коду.
Хоча можливо змінити паралельно кілька гілок SVN, тобто AFAIK не є тим, як SVN призначений для використання. (Хоча я не впевнений у тому, які конкретні недоліки можуть діяти так.)
У Git лише каталоги - це каталоги
Кожен клон сховища Git є самим сховищем Git: за замовчуванням він отримує повну копію історії сховища походження, включаючи всі редакції, гілки та теги. Але це збереже все, що нам подобається: Git зберігає його у базі даних, що базується на файлах, у прихованій .git/
підпапці кореневої папки сховища .
Але які не приховані файли ви бачите в папці репозиторію?
Коли ви git clone
сховане, Git робить кілька речей. Приблизно:
- Він створює цільову папку , а в ній
.git/
підпапку з "базою даних"
- Він передає посилання (теги, гілки тощо) бази даних сховища джерел і робить їх копію в новій базі даних, надаючи їм незначно змінене ім'я, яке позначає їх як "віддалені" посилання.
- Він передає всі версії (тобто стану дерев файлів), на які вказують ці посилання, а також усі зміни, на які ці редакції вказують прямо чи перехідно (їхні батьки та предки), до нової бази даних та зберігає їх, так що нові віддалені посилання фактично вкажіть на щось, що доступне в новому сховищі.
- Він створює локальну гілку, що відстежує віддалену редакцію, відповідну гілці за замовчуванням сховища походження (зазвичай
master
).
- Він перевіряє цю місцеву філію.
Останній крок означає, що Git шукає версію, на яку вказує ця гілка, і розпаковує збережене там дерево файлів (база даних використовує деякі засоби стиснення та дедуплікації) у кореневу папку репозиторію. Ця коренева папка та всі її папки (крім спеціальної .git
підпапки) відомі як "робоча копія" вашого сховища. Ось де ви взаємодієте зі змістом поточної перевіреної редакції / відділення. Вони просто звичайні папки та файли. Однак, для взаємодії з сховищем per se se ("база даних" версій та посилань) ви використовуєте git
команди.
Бачити гілки Git та взаємодіяти з гілками Git
В даний час я клоную репо і клоную конкретну гілку за допомогою gitk.
Версія, яку gitk
я отримав, не може клонувати сховища. Він може лише переглядати історію репо, створювати гілки та перевіряти гілки. Крім того, немає "клонування" гілки. Ви можете клонувати лише сховища.
Ви мали на увазі клонування репо, використовуючи, git clone ...
а потім, використовуючи gitk
, перевірити філію?
Папка проекту містить лише вміст цієї гілки, і я не бачу всіх гілок, як у SVN, що для мене трохи заплутано.
[...]
- Мені хотілося б знати, чи описаний я процес git є "стандартним" і наскільки правильно [...]
Так, це досить стандартно:
- Клоніруйте сховище за допомогою
git clone ...
- Ознайомтеся з галуззю, з якою ви хочете працювати,
git checkout ...
або використовуючи графічний інструмент, як-отgikt
Я не можу знайти простий спосіб переглянути всі гілки в моєму локальному сховищі за допомогою GIT.
- [...] або я пропускаю смт.
Може бути:
Як паралельно працювати з декількома гілками
- Також я хотів би знати, як керувати процесом, коли мені потрібно працювати над двома гілками одночасно, якщо, наприклад, мені потрібно зробити виправлення для master, але зберегти вміст іншої гілки.
Тут різні сценарії:
До декількох гілок потрібно застосувати нову (ще не створену) зміну
Використовуйте цей робочий процес:
- Створіть нову гілку
c
з ревізії, яка вже є в родині всіх цих гілок (наприклад, редакція, яка ввела помилку, коли зміна буде помилкою) або з версії, яка (включаючи всіх її предків) прийнятна для введення в всі ці гілки.
- Внесіть і внесіть зміни в цю нову гілку
c
.
Для кожної гілки, b
яка потребує змін:
Перевірте b
:
git checkout b
Об’єднайтесь c
у b
:
git merge c
Видалити відділення c
:
git branch --delete c
Наявні зміни потрібні в іншій галузі
(... але без інших змін, внесених до місця перебування цієї зміни)
- Ознайомтеся з відділенням, де потрібні зміни
- Вишні виберіть редакцію, яка вносить зміни, в порядку
На одній гілці 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/
каталозі вашого поточного сховища), де ви можете перевірити цю іншу гілку