Основы Git

Содержание
Типичные команды пользователя
config: Задать имя пользователя Git
--local user.name: Работа от другого пользователя
init: Инициализация репозитория Git
status: Текущее состояние репозитория
add: Добавить файл в staging area
reset: Удалить файл из staging area
restore: Удалить незаписанные изменения
commit: Записать изменения
checkout -- . : Восстановить последний коммит
chechout .: Восстановить удалённый файл
diff: Изучить изменения
файл .gitignore: игнорировать определённые файлы
git hash-object
Другие статьи про Git

Кратко

Проверяем обстановку

git status

Добавляем файл который хотим закоммитить

git add index.html

Убираем файл который не хотим сейчас коммитить

git reset file.txt

Коммитим с комментарием

git commit -m 'Лучшие самоучители на сайте www.eth1.ru'

Стэйджим и коммитим с комментарием одной командой

git commit -am 'Наш любимый сайт www.HeiHei.ru'

Пушим на сервер в мастер

git push origin master

Пользователь

Задать имя активного глобавльного пользовотеля

$ git config --global user.name "Andrei"

Проверить имя активного пользовотеля

$ git config user.name

Andrei

Задать email активного пользовотеля

$ git config --global user.email "www.aolegovich.ru@eth1.ru"

Локальный пользователь

Если нужно пушить от другого пользователя можно использовать user.local для конкретного репозитория

Сперва нужно создать пару ключей и публичный ключ добавить в репозиторий.

Дадим ключу имя aogithub и будем действовать по этой инструкции

ssh-keygen

Generating public/private rsa key pair. Enter file in which to save the key (/c/Users/Andrei/.ssh/id_rsa): aogithub Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in aogithub Your public key has been saved in aogithub.pub The key fingerprint is: SHA256:cvv+vna9oR1T9tueN9pPKzS6VzINYAiYGKcUZ2uo7Ok Andrei@urnsulab The key's randomart image is: +---[RSA 3072]----+ | ==oo.. . | | ..=o. . o | | o o . . | |. . . . | | o . S . o| |. . o . = +o| | o . o ==o| |. . ..o=o@| | E .o=*=oOO| +----[SHA256]-----+

eval `ssh-agent -s`

Agent pid 2261

ssh-add ~/.ssh/aogithub

Identity added: /c/Users/Andrei/.ssh/aogithub (Andrei@urnsulab)

git clone git@github.com:AndreiOlegovich/robot_web_ui_test.git

Cloning into 'robot_web_ui_test'… warning: You appear to have cloned an empty repository.

cd robot_web_ui_test/ git config --local user.name "AndreiOlegovich" git config --local user.email "info@eth1.ru" git config --local core.sshcommand 'ssh -i ~/.ssh/aogithub -F /dev/null' git status

On branch main No commits yet nothing to commit (create/copy files and use "git add" to track)

echo "# robot_web_ui_test" >> README.md
git add README.md

warning: in the working copy of 'README.md', LF will be replaced by CRLF the next time Git touches it

git commit -m "first commit"

[main (root-commit) 05fe1fe] first commit 1 file changed, 1 insertion(+) create mode 100644 README.md

git push -u origin main

Enumerating objects: 3, done. Counting objects: 100% (3/3), done. Writing objects: 100% (3/3), 245 bytes | 245.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 To github.com:AndreiOlegovich/robot_web_ui_test.git * [new branch] main -> main branch 'main' set up to track 'origin/main'.

init

Начать отслеживать изменения - инициализаци или начало работы Git

$ git init

Initialized empty Git repository in C:/Users/aolegovich/Desktop/Sites/hello-world/.git/

По умолчанию репозиторий хранится в подкаталоге с названием «.git» в корневом каталоге рабочей копии дерева файлов, хранящегося в репозитории.

Любое файловое дерево в системе можно превратить в репозиторий git, отдав команду создания репозитория из корневого каталога этого дерева (или указав корневой каталог в параметрах программы)

Важно понимать, что инициализировать репозиторий нужно в директории с проектом.

На одном копьютере могут быть десятки проектов и каждый из них может иметь свой репозиторий, который, в свою очередь может быть подлючён к github, gilab или куда-то ещё.

Перейдя из одной директории в другую вы перемещаетесь между этими репозиториями. Благодаря файлам .gitinit git автоматически понимает, что вы уже в другом месте и работаете с другим проектом.

Можно настроить ваш терминал bash или zsh так, чтобы он показывал вам с каким именно репозиторием вы работаете и какая ветка активна.

Создать файл

$ touch index.html

status

Посмотреть свежие изменения в репозитории

$ git status

Если интересует только текущая директория

git status .

On branch master

No commits yet

Untracked files:
   (use "git add <file>..." to include in what will be committed)

        index.html

nothing added to commit but untracked files present (use "git add" to track)

Файл, в котором произошли изменения выделен красным

add

Добавить файл в группу файлов, которые Вы планируете зафиксировать (staging area)

$ git add index.html

Если файлов много и Вы хотите добавить все используйте

git add -A

Добавить все файлы из текущей директории

git add .

Посмотреть свежие изменения в репозитории

git status

On branch master

No commits yet

Changes to be committed:
   (use "git rm --cached <file>..." to unstage)

        new file: index.html

Файл, который был добавлен в staging area выделен зелёным

Удалить файл из staging area

Если вы добавили что-то лишнее

$ git reset имя_файла

restore: удалить незаписанные изменения

Если файл добавлен в staging area, и при этом все незаписанные изменения нужно отменить подойдёт команда restore

$ git restore имя_файла

Пример

touch test.txt git add test.txt echo "abc" >> test.txt cat test.txt

abc

git restore test.txt
cat test.txt

Файл вернулся в исходное состояние - стал пустым.

commit

Зафиксировать изменения - записать изменения файла в репозиторий.

$ git commit -m 'Мой первый коммит.'

[master (root-commit) e2d3195] My first commit.
1 file changed, 1 insertion(+)
create mode 100644 index.html

Вернуть файл к последнему закоммиченному состоянию

$ git checkout -- .

Восстановить удалённый файл, если он не закоммичен можно выполнив

$ git checkout .

Если нужно вернуться к какому-то коммиту и удалить всё, что появилось после

git log

commit b662b06badbbddf3b6a824ff2f360e2d4ae32734 (HEAD -> master) Author: andrei <andrei@aredel.com> Date: Tue Oct 16 20:41:27 2023 +0300 Adds all files created with new empty project

Находим нужный коммит. В данном примере он всего один - b662b06badbbddf3b6a824ff2f360e2d4ae32734

Делаем жёсткий ресет.

git reset --hard b662b06badbbddf3b6a824ff2f360e2d4ae32734

HEAD is now at b662b06 Adds all files created with new empty project

clone

Клонировать другой репозиторий

$ git clone https://github.com/Project/Project.git

Cloning into 'welcome-to-git'...
remote: Enumerating objects: 9, done.
remote: Total 9 (delta 0), reused 0 (delta 0), pack-reused 9
Unpacking objects: 100% (9/9), done.

Либо по SSH

$ git clone git@gitlab.com:Project/Project.git

Синтаксис выбирается в зависимости от типа авторизации: паролем, по ключу и т.д.

diff

Если вы внесли изменения можно изучить их командой

git diff

diff --git a/andrei/README.md b/andrei/README.md index de2ffa9..0741f41 100644 --- a/andrei/README.md +++ b/andrei/README.md @@ -69,4 +69,6 @@ URN.SU Database HeiHei.ru Database +### Git Tutorial +[git-scm](https://git-scm.com/docs/gittutorial)

Если добавить эти изменения в staging area то увидеть их той же командой уже нельзя

git add -A
git diff

Нужно добавить флаг --cached

git diff --cached

diff --git a/andrei/README.md b/andrei/README.md index de2ffa9..0741f41 100644 --- a/andrei/README.md +++ b/andrei/README.md @@ -69,4 +69,6 @@ URN.SU Database HeiHei.ru Database +### Git Tutorial +[git-scm](https://git-scm.com/docs/gittutorial)

.gitignore

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

Пример файла .gitignore в котором мы указываету git не следить за ошибками, логами директорией .tmp и модулями nodejs

# Ignoring:
*.err
*.log
node_modules/
.tmp/

Подробнее про составление правил для .gitignore читайте в статье

«Синтаксис .gitignore»

git hash-object

$ echo "HeiHei.ru" | git hash-object --stdin

0bdb2c54a9617d62b661102a4862b417d7bdde9b

config

Для локальной настройки определённого репозитория используется файл config который находится в корне директории .git

[core] repositoryformatversion = 0 filemode = false bare = false logallrefupdates = true ignorecase = true [remote "origin"] url = git@github.com:AndreiOlegovich/mkdocs-demo-project.git fetch = +refs/heads/*:refs/remotes/origin/* puttykeyfile = C:\Users\Andrei\.ssh\putty [branch "main"] remote = origin merge = refs/heads/main [branch "topic/dev2"] remote = origin merge = refs/heads/topic/dev2

Предположим у вас в общих настройках git выставлен пользователь user0 с почтой user0@eth1.ru

Первым делом нужно проверить эти значения

$ git config user.name

user0

$ git config user.email

user0@eth1.ru

git config --list

… user.name=user0 user.email=user0@eth1.ru …

Эти настройки находятся в секции user файла gitconfig

vi ~/.gitconfig

… [user] name = user0 email = user0@eth1.ru

Чтобы поменять их например на user1, можно скопировать эту секцию в файл config из директории .git и заменить значения на нужные

[user] name = user1 email = user1@eth1.ru [core] repositoryformatversion = 0 filemode = false bare = false logallrefupdates = true ignorecase = true [remote "origin"] url = git@github.com:AndreiOlegovich/mkdocs-demo-project.git fetch = +refs/heads/*:refs/remotes/origin/* puttykeyfile = C:\Users\Andrei\.ssh\putty [branch "main"] remote = origin merge = refs/heads/main [branch "topic/dev2"] remote = origin merge = refs/heads/topic/dev2

Похожие статьи
Git
Установка
Основы
branch: Ветки
Перейти с HTTPS на SSH
.gitignore
Необходимые Bash команды
Remote
GitHub
GitLab
Ошибки
Git Bash
Работа с API GitHub
Изображение баннера

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящую по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: