====== Начало работы с 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 подсказка: подсказка: Names commonly chosen instead of 'master' are 'main', 'trunk' and подсказка: 'development'. The just-created branch can be renamed via this command: подсказка: подсказка: git branch -m Инициализирован пустой репозиторий 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 Date: Sat Nov 19 11:25:03 2022 +1000 Add .gitignore commit d41013ddfa9b9f770bf88207abb20cfa18be1990 Author: aleonchik 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 В истории (на сайте или используя 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 последних коммита.