Разница между Git и SVN, которую должен знать внешний интерфейс

внешний интерфейс Git
Разница между Git и SVN, которую должен знать внешний интерфейс

предисловие

И Git, и SVN являются системами управления версиями, но они
За разницей команд последует простое сравнение, разберем его с принципиальной точки зрения.

4. команды git и svn

Давайте сначала рассмотрим команду Ha

эффект git svn
Инициализация репозитория git init svn create
clone git clone svn co (оформить заказ)
add git добавить (.remove .gitignore, *все файлы) svn add
commit git commit svn commit
pull git pull svn update
push git push -
Посмотреть статус задания git status svn status
создать ветку git ветка svn cp
удалить ветку git branch -d svn rm
слияние ветвей git слить svn merge
Различия в рабочем пространстве git отличается (-кэш/голова) svn diff
Обновление до исторической версии git checkout svn update -r
тег переключения git checkout svn switch
переключить ветку git checkout branch svn switch branch
восстановить файлы git checkout - path svn revert path
Удалить файлы git rm path svn rm path
переместить файлы git mv path svn mv path
Удалить неотслеживаемые файлы git clean svn status sed -e
## 1. Разница в хранении
Подумайте, почему мы обычно используем git для управления кодом, а SVN — для создания диаграмм прототипов и высокоточного управления?

1. git распределен, с локальным и удаленным репозиторием, а SVN централизован, только с одним удаленным репозиторием;
2. Содержимое git хранится в виде метаданных, все файлы управления находятся в .git, svn обрабатывается по файлам, а все файлы управления ресурсами — в .svn;
3. Ветка svn — это каталог, git — нет;
4. git не имеет глобального номера версии, он есть у svn;
5. Хранилище контента git использует хэш-алгоритм SHA-1 для обеспечения целостности кода;
6. У git есть рабочая область, промежуточная область и удаленный репозиторий: git add отправляет код в промежуточную область, commit отправляет его в локальный репозиторий, а push отправляет его в удаленный репозиторий. svn — это коммит добавления в промежуточную стадию, коммит — это коммит в удаленный репозиторий.

存贮1.png

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

2. Разница между файлами .svn и .git

1..svn директория

Просто откройте каталог .svn, чтобы увидеть структуру:
Если вы не можете просмотреть .svn, компьютер Windows - нажмите View - проверить скрытые файлы;
mac напрямую shift + command + .

├── pristine 各个版本纪录,这个文件一般较大
├── tmp 
├── entries 当前版本号
├── format 文本文件, 放了一个整数,当前版本号
├── wc.db 二进制文件
├── wc.db-journal 二进制文件

2..git структура каталогов

Вы можете быть незнакомы с этими структурами каталогов, это не имеет значения, просто введите git help gitrepository-layout в терминале и нажмите Enter, вы обнаружите, что браузер откроет html-файл, который на самом деле откроет html-документ под установка гита

├── hooks 钩子文件
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── fsmonitor-watchman.sample
│   ├── fsmonitor-watchman.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample commit时会触发这个钩子
│   ├── pre-push.sample push触发
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   ├── prepare-commit-msg.sample
│   ├── update.sample update触发
├── info
│   ├── exclude 忽略的文件
├── object git数据对象,包括commit,trees,二进制对象,标签等
├── COMMIT_EDITMSG 上一次提交的注释信息
├── log 各个refs的历史信息
├── refs 每个分支指向那个提交
├── config 本项目配置信息,包括仓库地址,分支,用户账号等
├── description 项目描述
├── HEAD 当前分支的最后一次提交
├── index 索引文件,存贮git add把要添加的项
├── packed-refs 分支标识文件

Итак, видно, что git более мощный, чем svn в обработке кода.

3..git динамический анализ файла

3.1 добавить этап

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

2. Создайте новый test.txt, напишите что-нибудь небрежно и выполните git status

On branch master  // 默认一个master 分支

No commits yet

Untracked files: // 未提交的文件
  (use "git add <file>..." to include in what will be committed)

	test.txt

nothing added to commit but untracked files present (use "git add" to track)

беги найди .-тип f

./config
./HEAD
./info/exclude
./description
./hooks/commit-msg.sample
./hooks/pre-rebase.sample
./hooks/pre-commit.sample
./hooks/applypatch-msg.sample
./hooks/fsmonitor-watchman.sample
./hooks/pre-receive.sample
./hooks/prepare-commit-msg.sample
./hooks/post-update.sample
./hooks/pre-applypatch.sample
./hooks/pre-push.sample
./hooks/update.sample
./index

3. Выполните git add text.txt для отображения

On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

	new file:   test.txt

беги найди .-тип f

./config
./objects/61/de0edff4ebeeff225da34006cbe6427638fadc  # 比之前多了一个文件
./HEAD
./info/exclude
./description
./hooks/commit-msg.sample
./hooks/pre-rebase.sample
./hooks/pre-commit.sample
./hooks/applypatch-msg.sample
./hooks/fsmonitor-watchman.sample
./hooks/pre-receive.sample
./hooks/prepare-commit-msg.sample
./hooks/post-update.sample
./hooks/pre-applypatch.sample
./hooks/pre-push.sample
./hooks/update.sample
./index

4. Резюме: видно, что test.txt помечен как поэтапный после добавления git, а объект имеет дополнительный файл 61/de0edff, поэтому объект может хранить содержимое хранилища git и хранить его в двоичном режиме.

5. Можем проверить источник файла

git cat-file -p 61de0edf
打印 test

6. Как git управляет файлами и архивирует их
Наши распространенные файловые системы (NTFS, FAT, FAT32) извлекают файлы на основе адресного метода, то есть сначала дают конкретный адрес, а затем считывают содержимое файла из единицы хранения, соответствующей номеру адреса, в то время как git основан на содержимом извлечение, которое представляет собой весь контент. Извлечение, получение реального места хранения, похожее на хэш-карту.

3.2 Стадия фиксации

1. Выполните git commit -m 'добавить тест'

1 file changed, 1 insertion(+)
create mode 100644 test.txt

2. Запустите find.-type f

./test.txt
./.git/config
./.git/objects/61/de0edff4ebeeff225da34006cbe6427638fadc
./.git/objects/ed/fd7e903f8f622f9a52542adfa077552608202d
./.git/objects/26/ef8e81bc27b4a67f251145a4f83782364fa9fa
./.git/HEAD
./.git/info/exclude
./.git/logs/HEAD
./.git/logs/refs/heads/master
./.git/description
./.git/hooks/commit-msg.sample
./.git/hooks/pre-rebase.sample
./.git/hooks/pre-commit.sample
./.git/hooks/applypatch-msg.sample
./.git/hooks/fsmonitor-watchman.sample
./.git/hooks/pre-receive.sample
./.git/hooks/prepare-commit-msg.sample
./.git/hooks/post-update.sample
./.git/hooks/pre-applypatch.sample
./.git/hooks/pre-push.sample
./.git/hooks/update.sample
./.git/refs/heads/master
./.git/index
./.git/COMMIT_EDITMSG

Видно, что после коммита в объекте на основе добавления есть еще два файла ed/fd7e90 и 26/ef8e8.Из пути к архиву и имени файла видно, что git использует SHA-1 алгоритм проверки содержимого файла

Есть еще один COMMIT_EDITMSG, который представляет собой информацию о комментарии последней отправки.

3. Используйте git cat-file для просмотра исходного кода

git cat-file -t edfd7e90
// 终端输出tree

git cat-file -t 26ef8e8
// 终端输出commit

git cat-file -p edfd7e90
// 终端输出 100644 blob 61de0edff4ebeeff225da34006cbe6427638fadc	test.txt

git cat-file -p 26ef8e8
// 终端输出 tree edfd7e903f8f622f9a52542adfa077552608202d
author 信息  1612668900 +0800
committer author 信息  1612668900 +0800

ed/fd7e90 — объект фиксации, атрибут дерева указывает на 26/ef8e8, который записывает информацию об операции с файлом, авторе и отправителе;
26/ef8e8 — объект дерева, атрибут blob указывает на объект blob 61/de0edf, который записывает имя файла;
61/de0edf — это объект большого двоичного объекта, который записывает содержимое файла.

Три файловых отношения:

文件关系.jpgИтак, теперь вы знаете, почему объектный файл такой большой.

3.3 branch

git ветка получить список веток
Список сохраняется в папке refs/heads/master

3.4 Объектная модель git

Из анализа 3.2 выше мы знаем, что в системе git есть четыре типа удерживаемых объектов:
1. commit: указать дерево, в котором записаны операции с файлами, информация об авторе и отправителе;
2. дерево: дерево отношений объектов, управляет отношениями между деревом и большим двоичным объектом;
3.blob: сохранить содержимое файла;
4.tag: отправка тега.

Хуки жизненного цикла 3.5 git

1. Инициализация хука:
Перехватчики, упомянутые выше, являются сценариями жизненного цикла.Инициализация репозитория (git init) или git clone инициализирует файл .git;

2. Хук локальный, потому что он не будет отправлен в репозиторий кода, но будет инициализирован при клонировании;

3. Классификация крючков:

имя хука эффект
pre-commit Запускается перед каждым коммитом git, очень распространенным приложением является проверка кода eslint в package.json в сочетании с husky и lint-staged.
prepare-commit-msg В pre-commit вызывается сгенерированная информация о коммите в текстовом редакторе, что удобно для модификации автоматически сгенерированных коммитов squash и merge
commit-msg Пользователь вводит информацию об отправке и вызывается, что является информацией об отправке после commit -m, которую можно использовать для стандартизации информации об отправке.
post-commit Выполнить после commit-msg, уведомить о результате git commit
post-checkout git checkout называется
pre-rebase запустить git rebase перед изменениями
pre-receive Выполняется после git push, существует на удаленном складе, удаленный хук на сервере
update Вызывается после предварительного приема
post-receive push вызывается после успешного нажатия, уведомляя пользователя push

Эпилог

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