Инструменты пользователя

Инструменты сайта


prog:git-start

Начало работы с GIT

Visual Studio Code https://code.visualstudio.com/

Смотрим версию

alexey@es15:~/jsrc/git-course$ git --version
git version 2.34.1

Инициализируем репозиторий

alexey@es15:~/jsrc/git-course$ git init
подсказка: Using 'master' as the name for the initial branch. This default branch name
подсказка: is subject to change. To configure the initial branch name to use in all
подсказка: of your new repositories, which will suppress this warning, call:
подсказка: 
подсказка: 	git config --global init.defaultBranch <name>
подсказка: 
подсказка: Names commonly chosen instead of 'master' are 'main', 'trunk' and
подсказка: 'development'. The just-created branch can be renamed via this command:
подсказка: 
подсказка: 	git branch -m <name>
Инициализирован пустой репозиторий Git в /home/alexey/jsrc/git-course/.git/

STATUS Посмотрим что происходит??? Перед этим, мы поместили пару файлов в каталог проекта

alexey@es15:~/jsrc/git-course$ git status 
На ветке master

Еще нет коммитов

Неотслеживаемые файлы:
  (используйте «git add <файл>…», чтобы добавить в то, что будет включено в коммит)
	git.txt
	index.html

ничего не добавлено в коммит, но есть неотслеживаемые файлы (используйте «git add», чтобы отслеживать их)

Добавляем все файлы

        
alexey@es15:~/jsrc/git-course$ git add .

Посмотрим СТАТУС

alexey@es15:~/jsrc/git-course$ git status
На ветке master

Еще нет коммитов

Изменения, которые будут включены в коммит:
  (используйте «git rm --cached <файл>…», чтобы убрать из индекса)
	новый файл:    git.txt
	новый файл:    index.html

Можно убрать из отслеживания файл git.txt так:

alexey@es15:~/jsrc/git-course$ git rm --cached git.txt 
error: следующие файлы содержат проиндексированные изменения отличающиеся и от файла, и от HEAD:
    git.txt
(используйте опцию «-f» для принудительного удаления)

Посмотрим на СТАТУС

        
alexey@es15:~/jsrc/git-course$ git status
На ветке master

Еще нет коммитов

Изменения, которые будут включены в коммит:
  (используйте «git rm --cached <файл>…», чтобы убрать из индекса)
	новый файл:    git.txt
	новый файл:    index.html

Изменения, которые не в индексе для коммита:
  (используйте «git add <файл>…», чтобы добавить файл в индекс)
  (используйте «git restore <файл>…», чтобы отменить изменения в рабочем каталоге)
	изменено:      git.txt

Добавим файл git.txt обратно в отслеживаемые

alexey@es15:~/jsrc/git-course$ git add git.txt

Посмотрим на СТАТУС

alexey@es15:~/jsrc/git-course$ git status
На ветке master

Еще нет коммитов

Изменения, которые будут включены в коммит:
  (используйте «git rm --cached <файл>…», чтобы убрать из индекса)
	новый файл:    git.txt
	новый файл:    index.html

Создал новый файл script.js и немного изменил существующие Посмотрим СТАТУС

alexey@es15:~/jsrc/git-course$ git status
На ветке master

Еще нет коммитов

Изменения, которые будут включены в коммит:
  (используйте «git rm --cached <файл>…», чтобы убрать из индекса)
	новый файл:    git.txt
	новый файл:    index.html

Изменения, которые не в индексе для коммита:
  (используйте «git add <файл>…», чтобы добавить файл в индекс)
  (используйте «git restore <файл>…», чтобы отменить изменения в рабочем каталоге)
	изменено:      git.txt
	изменено:      index.html

Неотслеживаемые файлы:
  (используйте «git add <файл>…», чтобы добавить в то, что будет включено в коммит)
	script.js

Добавим все файлы и посмотрим статус

alexey@es15:~/jsrc/git-course$ git add .
alexey@es15:~/jsrc/git-course$ git status
На ветке master

Еще нет коммитов

Изменения, которые будут включены в коммит:
  (используйте «git rm --cached <файл>…», чтобы убрать из индекса)
	новый файл:    git.txt
	новый файл:    index.html
	новый файл:    script.js

Изменим пару файликов (git.txt, index.html) и посмотрим статус

alexey@es15:~/jsrc/git-course$ git status
На ветке master

Еще нет коммитов

Изменения, которые будут включены в коммит:
  (используйте «git rm --cached <файл>…», чтобы убрать из индекса)
	новый файл:    git.txt
	новый файл:    index.html
	новый файл:    script.js

Изменения, которые не в индексе для коммита:
  (используйте «git add <файл>…», чтобы добавить файл в индекс)
  (используйте «git restore <файл>…», чтобы отменить изменения в рабочем каталоге)
	изменено:      git.txt
	изменено:      index.html

Видим, что есть изменения. Добавляем…

alexey@es15:~/jsrc/git-course$ git add .
alexey@es15:~/jsrc/git-course$ git status
На ветке master

Еще нет коммитов

Изменения, которые будут включены в коммит:
  (используйте «git rm --cached <файл>…», чтобы убрать из индекса)
	новый файл:    git.txt
	новый файл:    index.html
	новый файл:    script.js

Все изменения зафиксированы. Делаем первый «коммит»

alexey@es15:~/jsrc/git-course$ git commit -m "First commit"
[master (корневой коммит) d41013d] First commit
 3 files changed, 211 insertions(+)
 create mode 100644 git.txt
 create mode 100644 index.html
 create mode 100644 script.js

На этом этапе у нас появился файл errors.err который мы не хотим включать в отслеживаемые. Он не нужен. Это просто файл с ошибками нашей системы. Посмотрим статус

alexey@es15:~/jsrc/git-course$ git status 
На ветке master
Изменения, которые будут включены в коммит:
  (используйте «git restore --staged <файл>…», чтобы убрать из индекса)
	новый файл:    .gitignore
	изменено:      git.txt

Неотслеживаемые файлы:
  (используйте «git add <файл>…», чтобы добавить в то, что будет включено в коммит)
	errors.err

Включаем этот файл в специальный файл игнорирования .gitignore, после этого смотрим статус. Сам файл игнора тоже нужно добавить в индекс.

alexey@es15:~/jsrc/git-course$ git status 
На ветке master
Изменения, которые будут включены в коммит:
  (используйте «git restore --staged <файл>…», чтобы убрать из индекса)
	новый файл:    .gitignore
	изменено:      git.txt

На этом этапе создадим каталог logs/ в котором будут храниться логи. Содержимое эттого каталога и сам каталог не нужны в индексе Посмотрим статус

alexey@es15:~/jsrc/git-course$ git status 
На ветке master
Изменения, которые будут включены в коммит:
  (используйте «git restore --staged <файл>…», чтобы убрать из индекса)
	новый файл:    .gitignore
	изменено:      git.txt

Неотслеживаемые файлы:
  (используйте «git add <файл>…», чтобы добавить в то, что будет включено в коммит)
	logs/

Добавим не нужный каталог в .gitignore и посмотрим статус Видим, что каталог и его содержимое больше не отслеживается, но изменился сам .gitignore Его нужно добавить в индекс обязательно И файлик описания в котором это все написано…

alexey@es15:~/jsrc/git-course$ git status 
На ветке master
Изменения, которые будут включены в коммит:
  (используйте «git restore --staged <файл>…», чтобы убрать из индекса)
	новый файл:    .gitignore
	изменено:      git.txt

Изменения, которые не в индексе для коммита:
  (используйте «git add <файл>…», чтобы добавить файл в индекс)
  (используйте «git restore <файл>…», чтобы отменить изменения в рабочем каталоге)
	изменено:      .gitignore
	изменено:      git.txt

alexey@es15:~/jsrc/git-course$ git add .
alexey@es15:~/jsrc/git-course$ git status 
На ветке master
Изменения, которые будут включены в коммит:
  (используйте «git restore --staged <файл>…», чтобы убрать из индекса)
	новый файл:    .gitignore
	изменено:      git.txt

Сделаем коммит

alexey@es15:~/jsrc/git-course$ git commit -m "Add .gitignore"
[master ffc8f01] Add .gitignore
 2 files changed, 79 insertions(+)
 create mode 100644 .gitignore

Посмотрим лог… Видим два коммита

alexey@es15:~/jsrc/git-course$ git log
commit ffc8f0170c2acc2bb8923c2e8053117546434613 (HEAD -> master)
Author: aleonchik <aleonchik@gmail.com>
Date:   Sat Nov 19 11:25:03 2022 +1000

    Add .gitignore

commit d41013ddfa9b9f770bf88207abb20cfa18be1990
Author: aleonchik <aleonchik@gmail.com>
Date:   Sat Nov 19 10:59:41 2022 +1000

    First commit

Посмотрим на какой ветке мы находимся

alexey@es15:~/jsrc/git-course$ git branch 
* master

Создадим новую ветку test и посмотрим на ветки вообще, звездочка указывает на какой ветке мы находимся

alexey@es15:~/jsrc/git-course$ git branch test
alexey@es15:~/jsrc/git-course$ git branch 
* master
  test

Теперь удалим ветку test

alexey@es15:~/jsrc/git-course$ git branch -D test 
Ветка test удалена (была ffc8f01).

Создадим ветку readme

alexey@es15:~/jsrc/git-course$ git branch 
* master
  readme

Мы все еще находимся на ветке master. Переключимся на ветку readme

alexey@es15:~/jsrc/git-course$ git checkout readme 
M	git.txt
Переключено на ветку «readme»
alexey@es15:~/jsrc/git-course$ git branch 
  master
* readme

Создадим новую ветку new и сразу переключимся на нее

alexey@es15:~/jsrc/git-course$ git checkout -b new
Переключено на новую ветку «new»
alexey@es15:~/jsrc/git-course$ git branch 
  master
* new
  readme

Переключимся на ветку readme и удалим ветку new

alexey@es15:~/jsrc/git-course$ git checkout readme 
M	git.txt
Переключено на ветку «readme»
alexey@es15:~/jsrc/git-course$ git branch -D new 
Ветка new удалена (была ffc8f01).
alexey@es15:~/jsrc/git-course$ git branch 
  master
* readme

Находясь в новой ветке (readme) создали файл README.md и смотрим статус

alexey@es15:~/jsrc/git-course$ git status 
На ветке readme
Изменения, которые будут включены в коммит:
  (используйте «git restore --staged <файл>…», чтобы убрать из индекса)
	изменено:      git.txt

Изменения, которые не в индексе для коммита:
  (используйте «git add <файл>…», чтобы добавить файл в индекс)
  (используйте «git restore <файл>…», чтобы отменить изменения в рабочем каталоге)
	изменено:      git.txt

Неотслеживаемые файлы:
  (используйте «git add <файл>…», чтобы добавить в то, что будет включено в коммит)
	README.md

Добавим и проверим статус

alexey@es15:~/jsrc/git-course$ git add .
alexey@es15:~/jsrc/git-course$ git status 
На ветке readme
Изменения, которые будут включены в коммит:
  (используйте «git restore --staged <файл>…», чтобы убрать из индекса)
	новый файл:    README.md
	изменено:      git.txt

Сделаем коммит

alexey@es15:~/jsrc/git-course$ git commit -m "Created file README.md"
[readme 92b0fdc] Created file README.md
 2 files changed, 97 insertions(+)
 create mode 100644 README.md

Смотрим статус

alexey@es15:~/jsrc/git-course$ git status 
На ветке readme
Изменения, которые не в индексе для коммита:
  (используйте «git add <файл>…», чтобы добавить файл в индекс)
  (используйте «git restore <файл>…», чтобы отменить изменения в рабочем каталоге)
	изменено:      git.txt

нет изменений добавленных для коммита
(используйте «git add» и/или «git commit -a»)

Находясь на ветке readme видим, что в ней есть файл README.md

alexey@es15:~/jsrc/git-course$ git branch 
  master
* readme
alexey@es15:~/jsrc/git-course$ ll
итого 36K
drwxrwxr-x 2 alexey 4,0K ноя 19 11:17 logs/
-rw-rw-r-- 1 alexey  109 ноя 19 11:03 errors.err
-rw-rw-r-- 1 alexey  16K ноя 19 12:09 git.txt
-rw-rw-r-- 1 alexey 1,4K ноя 19 10:52 index.html
-rw-rw-r-- 1 alexey   45 ноя 19 12:09 README.md
-rw-rw-r-- 1 alexey   61 ноя 19 10:43 script.js

Переключимся на ветку master и посмотрим на листинг. Видим, что файла README.md в этой ветке нет.

alexey@es15:~/jsrc/git-course$ git checkout master 
Переключено на ветку «master»
alexey@es15:~/jsrc/git-course$ git branch 
* master
  readme
alexey@es15:~/jsrc/git-course$ ll
итого 28K
drwxrwxr-x 2 alexey 4,0K ноя 19 11:17 logs/
-rw-rw-r-- 1 alexey  109 ноя 19 11:03 errors.err
-rw-rw-r-- 1 alexey  11K ноя 19 12:12 git.txt
-rw-rw-r-- 1 alexey 1,4K ноя 19 10:52 index.html
-rw-rw-r-- 1 alexey   61 ноя 19 10:43 script.js

Находясь на ветке master мы хотим объединить код с ветки readme

alexey@es15:~/jsrc/git-course$ git branch 
* master
  readme
alexey@es15:~/jsrc/git-course$ git merge readme 
Обновление ffc8f01..21763a1
Fast-forward
 README.md |   3 +++
 git.txt   | 122 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 125 insertions(+)
 create mode 100644 README.md

Удалим ветку readme - больше не нужна

alexey@es15:~/jsrc/git-course$ git branch -D readme 
Ветка readme удалена (была 21763a1).
alexey@es15:~/jsrc/git-course$ git branch
* master
alexey@es15:~/jsrc/git-course$ git status 
На ветке master
нечего коммитить, нет изменений в рабочем каталоге

Команды без параметров выводят тукущие данные

alexey@es15:~/jsrc/git-course$ git config --global user.name
aleonchik
alexey@es15:~/jsrc/git-course$ git config --global user.email
aleonchik@gmail.com

Добавляем удаленный репозиторий на сервере и заливаем туда наш проект. Не забываем, что мы не переименовали git branch -M main Наш master в main как просил GIT

alexey@es15:~/jsrc/git-course$ git remote add origin https://github.com/aleonchik/git-course.git
alexey@es15:~/jsrc/git-course$ git push -u origin master
Перечисление объектов: 16, готово.
Подсчет объектов: 100% (16/16), готово.
При сжатии изменений используется до 4 потоков
Сжатие объектов: 100% (14/14), готово.
Запись объектов: 100% (16/16), 4.52 КиБ | 578.00 КиБ/с, готово.
Всего 16 (изменений 5), повторно использовано 0 (изменений 0), повторно использовано пакетов 0
remote: Resolving deltas: 100% (5/5), done.
To https://github.com/aleonchik/git-course.git
 * [new branch]      master -> master
Ветка «master» отслеживает внешнюю ветку «master» из «origin».

Посмотрим на удаленные репозитории для нашего проекта

alexey@es15:~/jsrc/git-course$ git remote 
origin
alexey@es15:~/jsrc/git-course$ git remote -v
origin	https://github.com/aleonchik/git-course.git (fetch)
origin	https://github.com/aleonchik/git-course.git (push)

Изменили файл script.js Смотрим статус, добавляем и делаем коммит и проверяем статус

lexey@es15:~/jsrc/git-course$ git status 
На ветке master
Ваша ветка обновлена в соответствии с «origin/master».

Изменения, которые не в индексе для коммита:
  (используйте «git add <файл>…», чтобы добавить файл в индекс)
  (используйте «git restore <файл>…», чтобы отменить изменения в рабочем каталоге)
	изменено:      script.js

нет изменений добавленных для коммита
(используйте «git add» и/или «git commit -a»)

alexey@es15:~/jsrc/git-course$ git add script.js 

alexey@es15:~/jsrc/git-course$ git status 
На ветке master
Ваша ветка обновлена в соответствии с «origin/master».

Изменения, которые будут включены в коммит:
  (используйте «git restore --staged <файл>…», чтобы убрать из индекса)
	изменено:      script.js

alexey@es15:~/jsrc/git-course$ git commit -m "console.log"
[master 76863a1] console.log
 1 file changed, 1 insertion(+)

alexey@es15:~/jsrc/git-course$ git status 
На ветке master
Ваша ветка опережает «origin/master» на 1 коммит.
  (используйте «git push», чтобы опубликовать ваши локальные коммиты)

нечего коммитить, нет изменений в рабочем каталоге

Теперь просто заливаем изменения на git

alexey@es15:~/jsrc/git-course$ git push
Перечисление объектов: 5, готово.
Подсчет объектов: 100% (5/5), готово.
При сжатии изменений используется до 4 потоков
Сжатие объектов: 100% (3/3), готово.
Запись объектов: 100% (3/3), 329 байтов | 329.00 КиБ/с, готово.
Всего 3 (изменений 1), повторно использовано 0 (изменений 0), повторно использовано пакетов 0
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/aleonchik/git-course.git
   21763a1..76863a1  master -> master

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

alexey@es15:~/jsrc/newgc$ git clone https://github.com/aleonchik/git-course.git
Клонирование в «git-course»…
remote: Enumerating objects: 19, done.
remote: Counting objects: 100% (19/19), done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 19 (delta 7), reused 18 (delta 6), pack-reused 0
Получение объектов: 100% (19/19), 4.73 КиБ | 1.58 МиБ/с, готово.
Определение изменений: 100% (7/7), готово.
alexey@es15:~/jsrc/newgc$ ll
итого 4,0K
drwxrwxr-x 3 alexey 4,0K ноя 19 12:52 git-course/
alexey@es15:~/jsrc/newgc$ ll git-course/
итого 28K
-rw-rw-r-- 1 alexey  16K ноя 19 12:52 git.txt
-rw-rw-r-- 1 alexey 1,4K ноя 19 12:52 index.html
-rw-rw-r-- 1 alexey   45 ноя 19 12:52 README.md
-rw-rw-r-- 1 alexey   82 ноя 19 12:52 script.js
alexey@es15:~/jsrc/newgc$ 

Представим себе, что основная разработка это дома а в каталоге newgc разработка на работе. Мы изменили что то на работе и запушили это на сервер.

alexey@es15:~/jsrc/newgc/git-course$ git status 
На ветке master
Ваша ветка обновлена в соответствии с «origin/master».

Изменения, которые не в индексе для коммита:
  (используйте «git add <файл>…», чтобы добавить файл в индекс)
  (используйте «git restore <файл>…», чтобы отменить изменения в рабочем каталоге)
	изменено:      script.js

нет изменений добавленных для коммита
(используйте «git add» и/или «git commit -a»)
alexey@es15:~/jsrc/newgc/git-course$ git add script.js 
alexey@es15:~/jsrc/newgc/git-course$ git status 
На ветке master
Ваша ветка обновлена в соответствии с «origin/master».

Изменения, которые будут включены в коммит:
  (используйте «git restore --staged <файл>…», чтобы убрать из индекса)
	изменено:      script.js

Делаем коммит и пушим на сервер

alexey@es15:~/jsrc/newgc/git-course$ git commit -m "Sample work on another comp"
[master 2103afe] Sample work on another comp
 1 file changed, 1 insertion(+)

alexey@es15:~/jsrc/newgc/git-course$ git push 
Перечисление объектов: 5, готово.
Подсчет объектов: 100% (5/5), готово.

Придя домой мы должны обновить наш проект, скачав с сервера свежие изменения

alexey@es15:~/jsrc/git-course$ git pull
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 3 (delta 1), pack-reused 0
Распаковка объектов: 100% (3/3), 328 байтов | 82.00 КиБ/с, готово.
Из https://github.com/aleonchik/git-course
   76863a1..2103afe  master     -> origin/master
Обновление 76863a1..2103afe
Fast-forward
 script.js | 1 +
 1 file changed, 1 insertion(+)

Перейти на нужный коммит. Клонируем репозиторий как обычно.

git clone <url>

В истории (на сайте или используя git log) находим нужный коммит или тег и переходим на него

git checkout <хеш коммита или тег>

Можно указать не полный хеш а только уникальную его часть.

Опционально. Делаем ветку и переходим на нее

git checkout -b my-fork

Удалить последний коммит.

Для отмены последнего коммита, если изменения ещё не опубликованы на сервер (не сделан git push) воспользоваться командой:

git reset --soft HEAD^

При этом изменённый код удалён не будет (будет зелёным цветом в git status). Вы можете подправить код и повторить коммит.

Это работает, если вы не опубликовали свои изменения. Если же вы уже опубликовали изменения, то не остается ничего другого, как сделать коммит, который отменяет какой-то коммит (sha1 коммита можно посмотреть командой git log), например:

git revert sha1

–soft - отменит коммит, но сохранит изменения в файлах –hard - отменит коммит и удалит изменения, сделанные коммитом.

git reset --soft HEAD~2

отменит 2 последних коммита, сохранив изменения. Будут видны в git status.

Откатиться назад на 2 коммита:

git reset --hard HEAD~2

Другими словами, отменить 2 последних коммита.

prog/git-start.txt · Последнее изменение: 2022/11/20 15:14 — Alexey Leonchik