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 последних коммита.