Прошу сильно не пинать, за мое первое авторство здесь. Речь об использовании гита на примере СЭД Directum RX
, где всем правит GUI
. Чтобы все это не выглядело, как призыв работать в папках локального репозитория Directum RX
- Base
и Work
, примеры будут на "вымышленной" директории. Но с системными репо Directum RX
можно работать так же. В статье код выполняется в ОС Windows, в Linux все будет работать так же.
Сразу по существу, если создать произвольную тестовую папку C:\gitest
и выполнить из консоли, в этой папке следующее:
C:\gitest>git status
fatal: not a git repository (or any of the parent directories): .git
то увидим ожидаемое, никакого локального репозитория здесь нет конечно.
Но его можно создать:
C:\gitest>git init
Initialized empty Git repository in C:/gitest/.git/
C:\gitest>git branch
Проверяем результат:
C:\gitest>git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
Теперь репозиторий с веткой master есть, но пока пустой. Наполним его чем-нибудь, создадим текстовик C:\gitest\gitdoc.txt
C:\gitest>git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
gitdoc.txt
nothing added to commit but untracked files present (use "git add" to track)
Git
видит появление нового файла, проиндексируем его и проверим статус:
C:\gitest>git add *
C:\gitest>git status
On branch master
No commits yet
Changes to be committed:
(use "git rm —cached <file>..." to unstage)
new file: gitdoc.txt
Теперь git
будет отслеживать этот файл. Коммитим изменения, смотрим статус, проверяем ветки:
C:\gitest>git commit -m "test repo for gitea"
[master (root-commit) db21be9] test repo for gitea
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 gitdoc.txt
C:\gitest>git status
On branch master
nothing to commit, working tree clean
C:\gitest>git branch -v
* master db21be9 test repo for gitea
В ветке master
появился наш коммит, с комментом о себе. Идем дальше, ближе к Directum RX.
.
Локальный репозиторий это конечно хорошо, его мы можем создать для любых файлов (директорий, папок). Но можно и нужно, все наше добро хранить дополнительно в удаленном репозитории. Здесь будет на примере Gitea
, но для Github
и др. все аналогично..
Проверим наши удаленные репозитории, которых пока нет. Подключим в качестве удаленного репо Work
, созданный в Gitea
для DirectumRX
. Проверим снова наши удаленные репо:
C:\gitest>git remote -v
C:\gitest>git remote add origin http://localhost:3000/directum/Work.git
C:\gitest>git remote -v
origin http://localhost:3000/directum/Work.git (fetch)
origin http://localhost:3000/directum/Work.git (push)
Подключились. Теперь пушим наш коммит в удаленный репо Work:
C:\gitest>git push -f origin master
git: 'credential-manager' is not a git command. See 'git —help'.
The most similar command is
credential-manager-core
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 214 bytes | 214.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: . Processing 1 references
remote: Processed 1 references in total
To http://localhost:3000/directum/Work.git
+ 2877238...db21be9 master -> master (forced update)
Проверяем в Gitea
. Наш коммит с файлом там.. Идем дальше..
Форкним нашу ветку master
, создадим ветку slave
и переключимся на нее:
C:\gitest>git checkout -b slave
Switched to a new branch 'slave'
Проверим где мы:
C:\gitest>git branch -v
master db21be9 test repo for gitea
* slave db21be9 test repo for gitea
Внесем в наш текстовик gitdoc.txt
любую строку с данными и посмотрим статус:
C:\gitest>git status
On branch slave
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: gitdoc.txt
no changes added to commit (use "git add" and/or "git commit -a")
Индексируем и коммитим изменения:
C:\gitest>git add *
C:\gitest>git commit -m "fork for tests"
[slave 8c05bab] fork for tests
1 file changed, 1 insertion(+)
Пушим новую ветку slave
в удаленный репо Work
:
C:\gitest>git push -f origin slave
git: 'credential-manager' is not a git command. See 'git --help'.
The most similar command is
credential-manager-core
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 254 bytes | 254.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote:
remote: Create a new pull request for 'slave':
remote: http://localhost:3000/directum/Work/compare/master...slave
remote:
remote: . Processing 1 references
remote: Processed 1 references in total
To http://localhost:3000/directum/Work.git
* [new branch] slave -> slave
Наверное так не надо было делать, но это только для примера. Проверяем в Gitea
. Ветка с нашим коммитом там. Откроем его на редактирование прямо в Gitea
, добавим любую строку и сохраним.
Здесь мы, для примера внесли изменения непосредственно в удаленный репо, делать так не хорошо. Локальный репо пока не знает об этих изменениях. Пуллим эти изменения в локальный репо:
C:\gitest>git pull origin slave --allow-unrelated-histories
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 290 bytes | 19.00 KiB/s, done.
From http://localhost:3000/directum/Work
* branch slave -> FETCH_HEAD
8c05bab..24c145b slave -> origin/slave
Updating 8c05bab..24c145b
Fast-forward
gitdoc.txt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
Проверим текстовик gitdoc.txt
локально, строка данных появилась. Проверим статус локального репо:
C:\gitest>git status
On branch slave
nothing to commit, working tree clean
Все верно, изменений в локальной ветке нет, т.к. данные получены из удаленного головного репозитория. Теперь сделаем как надо было. Локально в наш текстовик, добавим строку.
Проверяем статус, видим есть изменения, коммент у ветки другой после пулла с удаленного репо, его можно поправить при следующем локальном коммите. Пробуем переключиться на ветку master:
C:\gitest>git status
On branch slave
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: gitdoc.txt
no changes added to commit (use "git add" and/or "git commit -a")
C:\gitest>git branch -v
master db21be9 test repo for gitea
* slave 24c145b Изменил(а) на 'gitdoc.txt'
C:\gitest>git checkout master
error: Your local changes to the following files would be overwritten by checkout:
gitdoc.txt
Please commit your changes or stash them before you switch branches.
Aborting
И.. облом, все верно git
предлагает сначала зафиксировать или припрятать изменения.
Припрячем наши изменения и посмотрим что припрятано:
C:\gitest>git stash
Saved working directory and index state WIP on slave: 24c145b Изменил(а) на 'gitdoc.txt'
C:\gitest>git stash list
stash@{0}: WIP on slave: 24c145b Изменил(а) на 'gitdoc.txt'
Изменения ветки slave
припрятаны, смотрим статус и пробуем снова переключиться на ветку master
, проверяем где мы:
C:\gitest>git status
On branch slave
nothing to commit, working tree clean
C:\gitest>git checkout master
Switched to branch 'master'
C:\gitest>git branch -v
* master db21be9 test repo for gitea
slave 24c145b Изменил(а) на 'gitdoc.txt'
Все получилось. Переключимся обратно на ветку slave
:
C:\gitest>git checkout slave
Switched to branch 'slave'
C:\gitest>git branch -v
master db21be9 test repo for gitea
* slave 24c145b Изменил(а) на 'gitdoc.txt'
Есть два варианта, как достать наши припрятанные изменения. Достать конкретно указанное изменение из нескольких:
C:\gitest>git stash list
stash@{0}: WIP on slave: 24c145b Изменил(а) на 'gitdoc.txt'
C:\gitest>git stash apply stash@{0}
On branch slave
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: gitdoc.txt
no changes added to commit (use "git add" and/or "git commit -a")
Или достать самое последнее припрятанное изменение, не указывая конкретное:
C:\gitest>git stash apply
error: Your local changes to the following files would be overwritten by merge:
gitdoc.txt
Please commit your changes or stash them before you merge.
Aborting
On branch slave
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: gitdoc.txt
no changes added to commit (use "git add" and/or "git commit -a")
Далее соответственно коммитим и сливаем ветку slave
с веткой master
:
C:\gitest>git commit -m "fork for tests"
[slave 128fe22] fork for tests
1 file changed, 3 insertions(+), 1 deletion(-)
C:\gitest>git branch -v
master db21be9 test repo for gitea
* slave 128fe22 fork for tests
C:\gitest>git checkout master
Switched to branch 'master'
C:\gitest>git merge slave
Updating db21be9..128fe22
Fast-forward
gitdoc.txt | 4 ++++
1 file changed, 4 insertions(+)
Ветку slave
можно удалить:
C:\gitest>git branch -d slave
Deleted branch slave (was 128fe22).
Пушим общие изменения ветки master
в Gitea
:
C:\gitest>git push -f origin master
git: 'credential-manager' is not a git command. See 'git --help'.
The most similar command is
credential-manager-core
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 299 bytes | 299.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: . Processing 1 references
remote: Processed 1 references in total
To http://localhost:3000/directum/Work.git
db21be9..128fe22 master -> master
Проверяем в Gitea
, все наши изменения в репо.
Напоследок отменим регистрацию удаленного репозитория, на локальном:
C:\gitest>git remote -v
origin http://localhost:3000/directum/Work.git (fetch)
origin http://localhost:3000/directum/Work.git (push)
C:\gitest>git remote rm origin
C:\gitest>git remote -v
C:\gitest>git status
On branch master
nothing to commit, working tree clean
Наш репо снова работает локально, ничего не зная о Gitea
.
Конечно это все капля из того что может Git
. Приведенный функционал достаточен для ознакомления и базового понимания этой технологии, помогает в работе, без него не обойтись при работе с Github
. Надеюсь было интересно.