суббота, 11 мая 2024 г.

Git локальный репозиторий

https://git-scm.com/book/en/v2 
Нужно читать от начала и до конца




Система контроля версий: 
  • Хранение 
  • Версионирование 
    • Файлов/объектов
    • Состояний всего корпуса кода
  • История изменений 
    • Возможно, нелинейная (орграф, точнее — сеть)
  • Создание информационного пространства вокруг исходного текста


mkdir newrepo
git init
в рабочей копии нет ни одного файла (вообще), но есть каталог .git, который является локальным полноценным git хранилищем

cal > cal.txt
git status
git нам скажет что у нас в каталоге среди рабочей копии появился файл и он Untracked. 

git add cal.txt (git add -A)

git status

скажет нам что файл добавлен к отслеживанию (changes to be committed)  

git commit -m "new calendar file"

git status

говорит что нет незакоммиченых изменений. Фактически мы будем воспроизводить цикл синхронизация - изменение - коммит 

git log 

отобразит commit id и commit message

git config core.editor 'ваш любимый редактор'
может поменять редактор

git config --list

отобразит список настроек которые могут быть local и global. git config --local ... // git config --global ... // git config --local --unset --user.name

echo "change file" >>  cal.txt

git status

знает что этот файл уже был добавлен в отслеживание и что он сейчас изменен но пока not staged for commit. Мы можем выбирать какие изменения в файле добавить в коммит. пока добавим все

git add cal.txt

git commit -m "new changes"

до этого момента мы делали модификацию своего собственного локального репозитория. чтобы опубликовать изменения нужно сделать git push



Историю коммитов можно посмотреть командой git log. Для того, чтобы отключить постраничный просмотр, используйте git -P log.

Все объекты имеют уникальный ID (это SHA-1 хеш). Объект с ID, допустим, 8dccc7a1d248ea923156b2e762e576b44e07886a, хранятся в файле с именем .git/objects/8d/ccc7a1d248ea923156b2e762e576b44e07886a
Посмотреть содержимое объектов можно (но непонятно, зачем ☺), например, так:

python3 -c "import sys; import zlib; print(zlib.decompress(sys.stdin.buffer.read()))" < .git/objects/8d/ccc7a1d248ea923156b2e762e576b44e07886a

В этих объектах мы найдем:
  • blob - это собственно наш файл в репозитории. Состояние файла на какой-то момент это не кусок файла не патч это именно файл целиком
  • состояния файлов на какой-то момент объединяются в дерево tree. Дерево говорит, в вашей ветке разработки на данный момент присутствовали вот такие файлы (размер, права, имя файла и id)
  • и собственно commit. Идентификатор дерева, id родительского коммита, имя автора и commit message

Эти три объекта создаются при каждом новом коммите. На каждый файл создается новый blob.
История разработки выглядит как цепочка коммитов.


  • для просмотра веток удобен qgit (или git log --graph --pretty=oneline --abbrev-commit --all)
  • не обязательно складывать в один коммит все что нахакали, можно разделить на разные

Для того чтобы сбросить коммиты (по правилу хорошего тона, те что не опубликовали чтобы избежать  git push --force) можно использовать git reset [commit id]. Эта команда откатит коммиты, но оставит рабочую копию не тронутой (изменения сохранятся).


Как разбить одну большую пачку изменений в несколько коммитов

git diff
смотрим все изменения

 git commit --patch 

показывает нам по одному hunk и спрашивает  Stage this hunk? Таким образом можно разбить изменения на разные коммиты

git status

покажет нам какие изменения еще остались, которые можно посмотреть с помощью git diff


еще есть  git add --interactive 

Комментариев нет:

Отправить комментарий