{"id":23498361,"url":"https://github.com/cucumberian/git-tutorial","last_synced_at":"2025-04-23T00:37:18.679Z","repository":{"id":81632754,"uuid":"558071943","full_name":"cucumberian/git-tutorial","owner":"cucumberian","description":"Git tutorial","archived":false,"fork":false,"pushed_at":"2024-02-21T23:40:19.000Z","size":45,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-16T15:18:22.985Z","etag":null,"topics":["git","markdown","russian","tutorial"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cucumberian.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-10-26T21:00:07.000Z","updated_at":"2022-10-26T21:17:16.000Z","dependencies_parsed_at":"2024-02-22T00:41:47.592Z","dependency_job_id":null,"html_url":"https://github.com/cucumberian/git-tutorial","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cucumberian%2Fgit-tutorial","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cucumberian%2Fgit-tutorial/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cucumberian%2Fgit-tutorial/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cucumberian%2Fgit-tutorial/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cucumberian","download_url":"https://codeload.github.com/cucumberian/git-tutorial/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250348868,"owners_count":21415905,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["git","markdown","russian","tutorial"],"created_at":"2024-12-25T05:31:25.552Z","updated_at":"2025-04-23T00:37:18.653Z","avatar_url":"https://github.com/cucumberian.png","language":null,"readme":"# Git\n\n## Git cheat Sheet\n\nhttps://training.github.com/downloads/ru/github-git-cheat-sheet/\n\n### Первоначальная настройка\n\nНастройка информации о пользователе для всех локальных репозиториев\n\n```bash\ngit config --global user.name \"[имя]\"\n```\n\nУстанавливает имя, которое будет отображаться в поле автора у выполняемых вами коммитов\n\n```bash\ngit config --global user.email \"[адрес электронной почты]\"\n```\n\nУстанавливает адрес электронной почты, который будет отображаться в информации о выполняемых вами коммитах\n\n### Создание репозитория\n\nСоздание нового репозитория или получение его по существующему URL-адресу\n\n```bash\ngit init [название проекта]\n```\n\nСоздаёт новый локальный репозиторий с заданным именем\n\n```bash\n$ git clone [url-адрес]\n```\n\nСкачивает репозиторий вместе со всей его историей изменений\n\n### Операции с файлами\n\nПеремещение и удаление версий файлов репозитория\n\n```bash\ngit rm [файл]\n```\n\nУдаляет конкретный файл из рабочей директории и индексирует его удаление\n\n```bash\ngit rm --cached [файл]\n```\n\nУбирает конкретный файл из контроля версий, но физически оставляет его на своём месте\n\n```bash\ngit mv [оригинальный файл] [новое имя]\n```\n\nПеремещает и переименовывает указанный файл, сразу индексируя его для последующего коммита\n\n### Игнорирование некоторых файлов\n\nИсключение временных и вторичных файлов и директорий.\nДля исключения файлов из системы гит (чтобы она не проверяла в них на предмет изменений) надо добавить следующие строчки в файл `.gitignore` (в корневом каталоге).\n\n```\n_.log\nbuild/\ntemp-_\n```\n\nGit будет игнорировать файлы и директории, перечисленные в файле .gitignore с помощью wildcard синтаксиса\n\n```bash\ngit ls-files --others --ignored --exclude-standard\n```\n\nСписок всех игнорируемых файлов в текущем проекте\n\n### Сохранение фрагментов `git stash`\n\nСохранение и восстановление незавершённых изменений\n\n```bash\ngit stash\n```\n\nВременно сохраняет все незафиксированные изменения отслеживаемых файлов\n\n```bash\ngit stash pop\n```\n\nВосстанавливает состояние ранее сохранённых версий файлов\n\n```bash\ngit stash list\n```\n\nВыводит список всех временных сохранений\n\n```bash\ngit stash drop\n```\n\nСбрасывает последние временно сохранённыe изменения\n\n### Внесение изменений\n\nПросмотр изменений и создание коммитов (фиксация изменений)\n\n```bash\ngit status\n```\n\nПеречисляет все новые или изменённые файлы, которые нуждаются в фиксации\n\n```bash\ngit diff\n```\n\nПоказывает различия по внесённым изменениям в ещё не проиндексированных файлах\n\n```bash\ngit add [файл]\n```\n\nИндексирует указанный файл для последующего коммита\n\n```bash\ngit diff --staged\n```\n\nПоказывает различия между проиндексированной и последней зафиксированной версиями файлов\n\n```bash\ngit reset [файл]\n```\n\nОтменяет индексацию указанного файла, при этом сохраняет его содержимое\n\n```bash\ngit commit -m \"[сообщение с описанием]\"\n```\n\nФиксирует проиндексированные изменения и сохраняет их в историю версий\n\n### Коллективная работа\n\nИменованные серии коммитов и соединение результатов работы\n\n```bash\ngit branch\n```\n\nСписок именованных веток коммитов с указанием выбранной ветки\n\n```bash\ngit branch [имя ветки]\n```\n\nСоздаёт новую ветку\n`bash`\ngit switch -c [имя ветки]\n\n````\nПереключается на выбранную ветку и обновляет рабочую директорию до её состояния\n```bash\ngit merge [имя ветки]\n````\n\nВносит изменения указанной ветки в текущую ветку\n\n```bash\ngit branch -d [имя ветки]\n```\n\nУдаляет выбранную ветку\n\n### Просмотр истории\n\nПросмотр и изучение истории изменений файлов проекта\n\n```bash\ngit log\n```\n\nИстория коммитов для текущей ветки\n\n```bash\ngit log --follow [файл]\n```\n\nИстория изменений конкретного файла, включая его переименование\n\n```bash\ngit diff [первая ветка]...[вторая ветка]\n```\n\nПоказывает разницу между содержанием коммитов двух веток\n\n```bash\ngit show [коммит]\n```\n\nВыводит информацию и показывает изменения в выбранном коммите\n\n### Откат коммитов\n\nУдаление ошибок и корректировка созданной истории\n\n$ git reset [коммит]\n\nОтменяет все коммиты после заданного, оставляя все изменения в рабочей директории\n\n$ git reset --hard [коммит]\n\nСбрасывает всю историю вместе с состоянием рабочей директории до указанного коммита.\n\n### Синхронизация с удалённым репозиторием\n\nРегистрация удалённого репозитория и обмен изменениями\n\n```bash\ngit fetch [удалённый репозиторий]\n```\n\nСкачивает всю историю из удалённого репозитория\n\n```bash\ngit merge [удалённый репозиторий]/[ветка]\n```\n\nВносит изменения из ветки удалённого репозитория в текущую ветку локального репозитория\n\n```bash\ngit push [удалённый репозиторий] [ветка]\n```\n\nЗагружает все изменения локальной ветки в удалённый репозиторий\n\n```bash\ngit pull\n```\n\nЗагружает историю из удалённого репозитория и объединяет её с локальной. pull = fetch + merge\n\n## Требования к именам коммитов\n\nhttps://github.com/rolling-scopes-school/docs/blob/master/docs/git-convention.md\n\n- Названия коммитов должны быть согласно [гайдлайну](https://www.conventionalcommits.org/en/v1.0.0/)\n- Тип коммита должен быть только в нижнием регистре (`feat`, `fix`, `refactor`, `docs` и т.д.)\n- Должен использоваться present tense (\"add feature\" not \"added feature\")\n- Должен использоваться imperative mood (\"move cursor to...\" not \"moves cursor to...\")\n\n### Примеры имен коммитов\n\n- `init:` - используется для начала проекта/таска. Примеры:\n\n```\ninit: start youtube-task\ninit: start mentor-dashboard task\n```\n\n- `feat:` - это реализованная новая функциональность из технического задания (добавил поддержку зумирования, добавил footer, добавил карточку продукта). Примеры:\n\n```\nfeat: add basic page layout\nfeat: implement search box\nfeat: implement request to youtube API\nfeat: implement swipe for horizontal list\nfeat: add additional navigation button\nfeat: add banner\nfeat: add social links\nfeat: add physical security section\nfeat: add real social icons\n```\n\n- `fix:` - исправил ошибку в ранее реализованной функциональности. Примеры:\n\n```\nfix: implement correct loading data from youtube\nfix: change layout for video items to fix bugs\nfix: relayout header for firefox\nfix: adjust social links for mobile\n```\n\n- `refactor:` - новой функциональности не добавлял / поведения не менял. Файлы в другие места положил, удалил, добавил. Изменил форматирование кода (white-space, formatting, missing semi-colons, etc). Улучшил алгоритм, без изменения функциональности. Примеры:\n\n```\nrefactor: change structure of the project\nrefactor: rename vars for better readability\nrefactor: apply eslint\nrefactor: apply prettier\n```\n\n- `docs:` - используется при работе с документацией/readme проекта. Примеры:\n\n```\ndocs: update readme with additional information\ndocs: update description of run() method\n```\n\n## FAQ\n\n\u003e Можно ли ревертнуть отправленный (запушенный) в репозиторий коммит без снижения оценки?\n\u003e\n\u003e \u003e Да, можно.\n\n## Git Теория\n\n### Структура папок\n\nСтруктура папок\n\n- `./hooks/` - события на которые можно настроить события (например прогон линтеров при ошибках).\n- `./info/` - может содержать файл `exclude`, который является гиперлокальный амналогом `.gitignore`\n- `./objects/` - сохраняются все почти все объекты, которые нужны для сохранения соcтояния кода. Коммиты, блобы и т.д.\n- `./refs/` -\n  - `heads/` - ветки\n  - `tags/` - теги\n  - `remotes/` - ветки слежения, которые показывают в каком состоянии был удаленный репозиторий, когда за ним следили крайний раз\n- `config` - настройки\n- `description`\n- `HEAD` - указатель `HEAD`, который указаывает на место, с которого будет продолжена история\n\n### Сущности\n\n#### Blob\n\nBlob = big binary object - большой бинарный объект. В блобы гит превращает файлы ск оторыми мы ряботает.\n\n#### Tree\n\nTree - дерево объектов. Содержит ссылки либо на деревья объектов, либо на блобы.\nОтвечает за состояние файлов.\n\nДанная команда показывает тип обхекта по его хэшу\n\n```bash\ngit cat-file -t \u003chash\u003e\n```\n\nДанная команда вывоидит содержимое объекта по его хэшу\n\n```bash\ngit cat-file -p \u003chash\u003e\n```\n\nТаким образом можно просмотреть тип и содержание каждого коммита.\nВ дерево объектов будут храниться или деревья или блобы, блобы хранить в сжатом ввиде файл.\n\n#### Commit\n\nЭто снимок состояния файлов с неокторой метаинформацией.\nКаждый коммит, кроме первого указывает на родителя\nОбычно состоит из 7 элементов:\n\n- ссылка на родителя\n- ссылка на дерево объектов, которые входят в состояние коммита\n- собственный хэш (на основе дерева объектов)\n- автор и комиттер\n- метка времени\n- сообщение\n\n#### ветка\n\nЛогически ветка - последовательность коммитов. Но коммит ничего не знает в какой он ветке. Ветка реализуется как ссылка на последний коммит.\nВетки хранятся в папке `./refs/heads` каждая в виде отдельного файла. В этом файле записпн коммит на который ссылкается каждая ветка (последний).\n\n#### ссылки\n\nЭто удобные переменные, которые указывают на определенные коммиты. Гит использует хэши.\nОсновной указатель `HEAD` указывает на то место, с которого будет продолжена история коммитов. HEAD в большинстве случаев и в нормальном состоянии указывает не на конкретный коммит, а на ветку, а веткка в свою очередь, есть указатель на последний коммит.\n`HEAD` показывает на то место, в котором мы сейчас находимся.\nПри смене указателя `HEAD` на другой коммит (например смене ветки) указатель `HEAD` переместится на тот коммит и рабочий код каталоге с гитом ихменится.\n`HEAD` хранится в файле `./git/HEAD` и в нем указана ссылка ref: на файл с хэшом каммита.\n\n##### Тэги tags\n\nТэги - это статичные указатели на определенный коммит. Их можно использовать для личных нужд, чтобы помечать определенные версии программы, ключевые моменты разработки. Они нужны для удобства, чтобы не запоминать хэш отдельного коммита.\nТэги могут быть:\n\n- легковесными - есть только название\n- аннотированными - можно писать дополнительную информацию как у коммита\n\n#### репозиторий\n\nМесто хранения кода с историей всех изменений.\nМожет быть:\n\n- локальный\n- удаленный - может быть как gitub, gitlb, друго сервис, репозиторий коллеги или соседней папкой.\n\n### Состояния\n\nФайлы в гите могут находиться в двух глобальных состояниях: они могут быть отслеживаемые и могут быть неотслеживаемыми.\nГит знает про существование неостжеиваемых файлов в рабочей директории, но изменения рабочий файлов никак не затрагивают внутреннего сотсояния гита.\nОтслеживаемые файлы могут получиться несколькими путями:\n\n- были неотлежвиваемыми и добавлены в индекс пользователем - стенут отслеживаемыми при коммите\n- были отслеживаемыми раньше и модифицированы\n\nОтслеживаемые файлы огут находиться в трех состояниях:\n\n- неизмнененные\n- измененные\n- staged - подготовленные к внесению ихменений в след коммите\n- _stash_ - заначка (при помещении заначку)\n\n#### Index\n\nIndex в гите - это черновик будущего коммита. По умолчанию гит не сохраняет все изменения, которые делает пользователь.\n\nГит работает с тремя областями или деревьями:\n\n1. Рабочая директория - песочница с текущими файлами\n2. Индекс - черновик коммита\n3. HEAD - указатель на историю коммитов\n\n`git checkout -b feature_1` - создать ветку с именем feature_1 и установить на нее указатель HEAD\n`git checkout -b feature_2 main` - создать ветку от указателя main. Можно также передать хэш коммита, вместо указателя.\n\n`git remote add origin \u003cremote_rep_address\u003e` - добавить удаленный репозиторий под именем `origin`\n`git --set-upstream origin main` - установить как ветку загрузки для удаленного репозитория `main`\n\n`git branch --all` - просмотреть все ветки, включая и из удаленных репозиториев\n`git push -u origin --all` - как `git push --set-upstream origin --all` - установить все ветки как синхронихируемые с удаленным репозиторием и выгрузить их.\nВ файл `config` добавятся аналогичные записи для этих настроек - связи с удаленными репозиториями и списки связей для локальных и ветвей и удаленного репозитория.\n\nПо умолчаниюю при клонировании репозитория, клонируетс одна ветка, а остальные остаются удаленном репозитории. Для просмотер списка веток можно восползовться командой `git branch --all`. Для создания локальной версии ветки с удаленного репозитория надо выполнить команду `git checkout \u003cимя удаленной ветки\u003e`.\n\n`git pull` = `git fetch` + `git merge`\\* - глобальными настройками используется. Можно изменять флагами на rebase.\n`git fetch` - забирвет все изменения\n\nРекомендуется отдельноисползовать команду `git fetch` чтобы заняться решением конфликтов когда будет время.\nСама структура веток предполагает объединение в будущем.\nГит предлагает две стратегии объединения.\n\n1. Merge - слияние.\n   - выбирает последний коммит в каждой сливаемой ветке и создает на их основе merge-commit, который будет содаржать объединенное состояние. Возможно надо будет решать конфликты. После рзрашения создасться коммит и на него передвинется указатель ветвки в которой мы нахоились.\n     Почти всегда при merge создается один дополнительный коммит.\n     Особый случай merge - **fast forward**. - если во влиаемой ветке на было изменений с момента форка их нее и все коммиты из ветки просто переносятся в другую ветку. Таким образом нового коммита не возникает. Сожно отменить и гит будет создавать фиктивный коммит\n     Сохраняет историю коммитов. Идеально подходит для публичных репо, где важна соанность истории.\n2. Rebase\n   ребеиз из двх веток.\n   - количество коммитов отличается при rebase и при merge. В случае merge он такое же, что и было до marge. История коммитов исзменяется. Нету лшних коммитов слияния.\n\n### Конфилкты\n\n- чаще синзронизируйтесь с репозиторием с которым работаете - перенос конфликтов на более ранний уровень\n- не трогайте чужой код - лучше обсудите с коллегами, а потом решайте кто в какие ветки внесет в изменения\n- лучше делайте селкие коммиты - проще перемещаться между ниими и в случае rebase они будут требовать меньше внимания\n- разделяйте задачи так, чтобы они не качались обзего кода\n\n`git merge \u003cимя ветки\u003e` - слить текущую ветку с целевой и передвинуть указатель на новый коммит слияния.\n`git merge --abort` - прервать процесс слияния\n\nКонфликты при `merge` и при `rebase` чаще всего отличаются.\n`Rebase` - итеративная операция. Каждый коммит, который мы переносим при `rebase`, может создать потенциальные конфликты.\nВ процессе ребейза может создаться несколько конфликтов на каждой итерации. Надо их разрешить (в файлах), добавить файл с разрешенным конфликтом в индекс комнадой `git add` и перейтина следующую итерацию комнадой `git rebase --continue`.\n\n### Stash\n\nБывают ситуации, когда нельзя коммитить, но надо переключиться на следующую заачу. Тогда на помощь приходит `Stash`. Stash - \"заначка\".\n\n```bash\ngit stash\n```\n\nПри выполнении этой команды\n\n- все изменения помещяются в состояние **stash**,\n- индекс приводится к сотсоянию последнего коммита (как при `git reset`)- очищается\n- все изменения из рабочей директории передйут в специальный коммит, на который указывает указатель **`stash`**,\n- рабочая дректория откатится к состоянию при последнем коммите\n\nПосле выполнения внеплановой задачи можно при помози команды\n\n```bash\ngit stash apply\n```\n\nперенести все изменения из stash в рабочую директорию, а stash очистится.\n\n### Случайно закомиченные файлы\n\nЛучшая драка - это та, которой удалось избежать.\n\n#### .gitignore\n\nФайлы, которые есть в игноре не отслеживаются гитом.\n\n- `.gitigore` - глобальный\n- `.gitignore` - в репозитории\n- `./.git/info/excude` - на уровне текущего локального репозитория\n  Если быть более точным, то кроме отслеживаемых и неотслеживаемых файлов есть еще и **игнорируемый** файлы. Игнорируемые файлы могут обаховаться если новый файл был создан и он попал под маску gitignore. **Но уже закомичееные файлы не могут стать игнорируемыми!** Поэтому любые добавления закомиченных файлов в гитигнор не распространаются на них. Надо удалить файл и\n\n1. Добавляем файлы в .gitignore\n2. Удаляем файл их кэша гита `git rm --cache file`\n3. Коммитим изменения без файла `git add .gitingore`, `git commit -m \"new commit\"`\n   Таким образом файл уже не будет отслеживаемым и будет игнорироваться через gitignore.\n\n#### Случайно закомичченые пароли и токены или другая секретаня (персональная) информация\n\n- поменять пароли токены\n- добавить в .gitignore\n- очистить историю (не поможет, но будет не так стыдно (не факт))\n\n##### Если в последнем коммите\n\nЕсли это было в последем коммите репозитория, внести изменения в рабочую директорию и выполнить команду`git commit --amend`.\nПосле изменения коммита при помощи команды `git commit --amend` гит создаст нвый коммит, который будет видоизменным предыдущим коммитом, но уже без секретный файлов. И уже новый измененный коммит будет ссылатьс на ноду, куда ссылался неимененный коммит. Но надо помнить, что **неправльный коммит не удалится из дерева коммитов гита**, просто на него не будет ссылок. Поэтому надо задуматься над тем какие использовать инструмаенты для очистки дерева гита.\n\n##### Если надо внести изменения раньше\n\nИнтерактивный ребейз\n\n```bash\ngit rebase -i \u003cхэш коммита с которого перебазируемся\u003e\n```\n\nЗатем можно вбрать какие комиты оставить, какие удалить, поменять мествми. Например удалить коммит с паролем. Тогда перепишется история и коммит с паролем пропадет из истории.\n\n**Но пароль все еще можно достать из git!** Он сохранен в коммите, в который можно получить доступ если знать его хэш. Ну или просто найти его в объектах.\nХэш можно узнать через `git reflog`.\n\n### Опасные операции\n\nЕсть несколько операция которые риводят к безвозвратным изменениям.\nВсе остальные команды не удалют никакие объекты. И скорее всего эти именения можно вернуть. Если же изменения не были заккомичены, то их потерять легко\n\n- `git pul -f` - изменения применяются к нашей рабочей директории\n- `git reset` (git reset --hard) - откат изменений к какому-то конкретному коммиту\n- `git checkout -f` `git switch -f`- переключение на другую ветку в результате чего состояние рабочей директории приводится в стостояние той ветки.\n- `git clean -f` - очищает рабочую директорию от всех неотслеживаемых файлов\n\n### Чтобы ничего не потерялось\n\nВыполняйте команду `git status`. Закомиттьте или засташьте.\n\nБывает что мы закоммитили, а потом передвинули указатель ветки и потеряли связь с прежним состоянием после очередного коммита. Коммит все ещё останется в гите, но мы не увидим его через команду `git log`.\n\n#### Как найти потерянные коммиты\n\n- `git reflog` - логи гита\n- `git fsch --full`\n\nЛоги гита отдельно собираются для каждой ветки в папке `./git/logs/refs`. Если удалить папку логов `./git/logs`, то и команда `git reflog` ничего не выдаст.\nВ таком случае можно использовать `git fsck --full` - она проверить весь репозиторий с учтетом того, чтобы на все объекты были ссылки и выдаст список коммитов, на которые нет ссылок.\n\n### Отмена изменений\n\n#### Отменить коммит\n\nЧтобы отменить коммит можно воспользоватьс командой\n\n```bash\ngit revert \u003cхэш коммита\u003e\n```\n\nпосле которой гит создаст патч к текущему коммиту, отменяющий изменения того коммита, который был указан.\nНапример мы можем отменить какую-то отдельную фичу из отдельного коммита, в котором была обнаружена ощибка.\n\n#### Отмена состояния одного файла\n\n- откад до состояния в предыдущем коммите\n  `git checkout -- \u003cfile\u003e`\n  `git restore \u003cfile\u003e`\n- откад состояния файла до конкретного коммита\n  `git restore --source=\u003chash\u003e \u003cfile\u003e`\n\n#### Откат изменений всего репозитория\n\n`git reset`\n\n- `git reset --soft` - отмена изменений только с помощью указатедя HEAD. Т.е. только передвинется указатель на указанный коммит. А в индексе и в рабочей директории файлы будут все ещё соотвествовать коммиту с которого мы откатывались.\n- `git reset` `git reset --mixed` - удаляет данные из индекса до того состояния и передвигвает указатель HEAD\n- `git reset --hard` - изменяетс все три области (рабочую директорию, индекс и HEAD)\n\n### GIT команды\n\n#### **`git init`**\n\ngit\nИнициализирует `git` в текущей директории и создает директорию `.git` с настройками и индексами `git`'a.\n\n```bash\ngit init\n```\n\n---\n\n#### **`git add --all`**\n\nДобавляем все измененные файлы в `git`.\n\nИгнорирует содержимое файла `.gitignore`\n\n```bash\ngit add --all\n```\n\nДобавляем файл к индексу.\n\n```bash\ngit add \u003cимя_файла\u003e\n```\n\n`.gitignore` - специальный файл, содержимое которого будет игнорироваться системой `git` при проверки изменений.\nНапример\n\n```\n./venv/\n.env\n```\n\nПервая строка говорит системе `git` игнорировать директорию `venv` в корне проекта, а вторая строка - игнорировать скрытый файл `.env`.\n\nСказать дотнету добавить все файлы в гитигнор, которе не нужны(нужно для .NET, кто знает, те поймут, остальным не нужно=):\n\n```bash\ndotnet add gitignore\n```\n\n---\n\n#### **`git commit`**\n\nФиксация изменений.\n\nОткрывается редактор по-умолчанию для написания комментария коммита:\n\n```bash\ngit commit -a\n```\n\nВнесение изменений с указанием коментария и без открытия редактораq:\n\n```bash\ngit commit -m \"init: start project git-tutorial\"\n```\n\n---\n\n#### **`git diff`**\n\nПоказывает разницу между файлами\n\n```bash\ngit diff [с чем сравнить]\n```\n\nСравнить можно, например с каким-ть коммитом, унав его id из `git log`.\n\n\\+ стоят у того что добавляется\n\n\\- стоят у того что убирается в текущей версии по сравнению с камитом\n\n---\n\n#### **`git log`**\n\nПозволяет вывести список всех комитов.\n\n```bash\ngit log\n```\n\nCписок камитов и отношения между вевями в виде графа:\n\n```bash\ngit log --graph\n```\n\nПросмотреть все коммиты во всех ветках:\n\n```bash\ngit log --oneline --all\n```\n\n#### **`git reflog`**\n\nПоявилась в последних версиях `git`\nПоказывает всю историю и ветки, что происходила и когда ветка была главной.\nСочетая `git reflog` и `git diff ID` можно просмотреть разницу между камитами.\n\n---\n\n#### Работа с ветками\n\n##### **`git branch`**\n\nПоказывает список веток\n\n---\n\n##### **`git branch имя_ветки`**\n\nСоздает новую ветку. Также можно сипользовать:\n\n```bash\ngit checkout -b имя_ветки\n```\n\nЧтобы сразу создать новую ветвь и перейт в неё.\n\n---\n\n##### **`git branch -d имя_ветви`**\n\nУдаляем ветку. Удаление происходит если ветка уже слита.\n\n---\n\n##### **`git branch -D имя_ветви`**\n\nНасильное удаление ветви без проверки того, что она уже слита.\n\n---\n\n#### Перемещение по веткам\n\n`HEAD`- это символическое имя текущего выбранного коммита.\n\nПо-умаолчанию HEAD указывает на последний коммит из локального дерева.\n\nОбычно `HEAD` указывает на имя ветки, например `master` или `bugFix`. При коммите мы меняем статус ветки и это вижно через изменение `HEAD`.\n\n##### **Detaching HEAD**\n\nОтделение `Detaching HEAD` означает присвоение `HEAD` не ветке, а конкретному коммиту.\n\n##### **`git checkout`**\n\nПозволяет переключиться на нужный коммит указав его `hash`.\n\n```bash\ngit checkout commit_hash\n```\n\nИли можно переключиться на ветвь разработки:\n\n```bash\ngit checkout branch_name\n```\n\nПри переходе на коммит, текущий указатель `*HEAD` будет отделен от листа ветки. Чтобы его вернуть можно ввести команду перехода на ветку:\n\n```bash\ngit checkout master\n```\n\nМожно использовать не только **абсолютные** ссылки в виде коммитов или названий веток, а переходить к их родительским элементам, с помощью **относительных** ссылок: `^` или `~\u003cnum\u003e`.\n\nЧтобы перейти в родительский элемент от ветки `master` (на один коммит назад по дереву):\n\n```bash\ngit checkout master^\n```\n\nЧтобы перейти на 2 элемента назад:\n\n```bash\ngit checkout master^^\n```\n\nИли то же самое можно записать в виде относительной ссылки:\n\n```bash\ngit checkout master~2\n```\n\nВместо названий веток можно использовать идентификаторы коммитов.\n\nПри переходе по **относительным ссылкам** можно использовать указатель `HEAD`, например, чтобы перейти на 2 уровеня назад:\n\n```bash\ngit checkout HEAD^^\n```\n\nили\n\n```bash\ngit checkout HEAD~2\n```\n\n---\n\n#### Слияние веток\n\n##### **`git merge branch_name`**\n\n```bash\ngit merge branch_name\n```\n\nВливание в текущую ветку указанной ветви `branch_name`.\n\n---\n\n##### **`git rebase branch_name_\u003cкуда_переносим\u003e`**\n\nПри ребейзе git по сути копирует набор коммитов и переносит их в указанное место.\n\nПреимущество `rebase` в том, что с его помощью можно делать чистые линейные последовательности коммитов.\nНапример, если существеут ветка `master` и `bugFix`, и мы хотим сдвинуть наши изменения из ветки `bugFix` прямо на вершину ветки `master`, то находясь в ветку `bugFix` можем набрать следующую команду:\n\n```bash\ngit rebase master\n```\n\nТаким образом мы скопируем и перенесем коммиты из ветки `bugFix` в ветку `master`, как будто изменения делались последовательно, хотя на самом деле параллельно. В ветке `master` сощдастся новый коммит.\n\nЕсли делаем `rebase master` при этом находясь в `master^` или в другом потомке, то указатель просто сдвинется на ветку `master`.\n\n---\n\n#### Работа с удаленным репозиторием\n\n##### **`git remote add origin url`**\n\nЧтобы связать локальный репозиторий с удаленным репозиторием используется команда `git remote add`, например:\n\n```bash\ngit remote add origin git@github.com:username/project.git\n```\n\n`origin` - это название, которое мы даем этому удаленному репозиторию.\n\nЗатем переименовваем текущую ветку `master` в `main`, т.к. на гитхабе при создании репо главная ветка это `main`:\n\n```\ngit branch -M main\n```\n\nЗатем отправляем командой `git push` данные из ветки main в удаленный репозиторий `origin`:\n\n```bash\ngit push -u origin main\n```\n\nДалее можноотправлять изменения просто командой\n\n```bash\ngit push\n```\n\n---\n\n##### **`git pull`**\n\nДанная команда загружает актуальную версию с удаленного репозитория в локальный.\n\n```bash\ngit pull\n```\n\n`pull` - это составная команда, она не только загрузит состояние с гитхаба, но и произведет `merge` с текущим состоянием локального репозитория.\n\n---\n\n#### pull request\n\nЧтобы отправить запрос на изменение в чужой репозиторий\nнужно:\n\n1. Создать форк `fork` чужого проекта на своем аккаунте.\n2. Внести изменения\n   1. Склонировать форк к себе в локальную среду командой\n   ```bash\n   git clone https://github.com/my_nickname/forked_project\n   ```\n   2. Создать ветку с изменениями, напрмиер:\n   ````bash\n   git branch fixes\n   ``` или\n   ```bash\n   git checkout -b fixes\n   ````\n   3. Внести все изменения в эту ветку:\n   ```bash\n   git add file\n   git commit -m \"fix: fix description\"\n   ```\n   4. Запушить изменения в свой аккаунт:\n   ```bash\n   git push\n   ```\n3. Подтвердить создание `pull request`'a на [github](https://github.com) с изменениями.\n\nЕсли вы не делаете форк, и пытаетесь загруить в оригинальный репозиторий, то система это не позволит.\nНадо сделать копию клон и потом отправить клон-копию себе. Создастся запрос на изменение в главную ветку в оригинал.\n\n---\n\n#### quiz\n\n`git clone`` - клонирование, создание локальной копии удаленного репозитория.\n\n_fork_ - копия чужого реозитория\n\n`git pull` - стянуть все изменения из удаленного репозитория. Cоздает вопрос слияния веток, иногда проще клонировать весь блок в отдельную папку.\n\n`git pull` - выкачивает данные из репозитория и делает слияние с локальным репозиторием\nЕсли не нужно слияние то луче использовать команду `git clone`.\n\n`git push` - отправляет изменения в удаленный репозиторий\n\n`git push ssh_name` или `git push https://...`\n\ngit должен быть авторизован на внесение изменений в удаленный репозиторий, чтобы выполнить команду git push\n\n`git add` - добавляет файлу версионность в локальном репозитории\n\n`git checkout` - позволяет перемещаться между ветками и сохранениями\n\n`git diff` - разница между текущей и зафиксированной версией файла\n\n`git commit` - фиксация изменений в репозитории\n\n`git branch` - вывод всех веток на экран\n\n`git branch new_branch_name` - создание новой ветки\n\n`git merge branch_name` - слияние веток: в текущую branch_name\n\n`git merge lists` - в текущую ветку добавит информацию из lists\n\n`git reset --hard HEAD^` - сбросить мастер на 1 коммит назад (символ ^)\n\n`git push origin master --force` - запушить изменения в мастер, но т.к. мы переписываем история - поэтому `--force`\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcucumberian%2Fgit-tutorial","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcucumberian%2Fgit-tutorial","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcucumberian%2Fgit-tutorial/lists"}