Как стать автором
Обновить

Git — вездесущий

Прошу сильно не пинать, за мое первое авторство здесь. Речь об использовании гита на примере СЭД 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. Надеюсь было интересно.

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.