====== Начало работы с 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 последних коммита.