Git Product home page Git Product logo

git_course's Introduction

title author presentation
Программа обучающего курса по Git
Valeriy Osipov
enableSpeakerNotes
true

О данном курсе

  • По Git, как и по другим IT-технологиям, есть море различных ресурсов.
  • Особенностью данного курса является то, что выделены основные варианты использования Git'а. И показано как все эти варианты использования реализуются в основных инструментах:
    • Shell
    • текстовый редактор VSCode
    • IDE PHPStorm и
    • GUI для Git'а Sourcetree
  • Это позволит выполнять все действия с Git в вашем основном инструменте, что будет препятствовать потере фокуса и будет способствовать повышению продуктивности

Что такое Git

  • Git - это распределённая система управления версиями
  • Git - это некий аналог блокчейн
  • Альтернативой Git может выступать, например, Mercurial
  • Проект был создан Линусом Торвальдсом для управления разработкой ядра Linux, первая версия выпущена 7 апреля 2005 года. На сегодняшний день его поддерживает Джунио Хамано.
  • Программа является свободной и выпущена под лицензией GNU GPL версии 2. По умолчанию используется TCP порт 9418.

Назначение Git

  • Хранение исходного кода
  • Развертывание

Git инструментарий

  • Shell:
    • Cmder: PowerShell: Posh-Git: Установка: запустить PowerShell с правами администратора и выполнить: "Install-Module posh-git"
  • VSCode:
  • PHPStorm:
    • Settings | Tools | Terminal | "cmd.exe" /k "<path_to_cmder>\vendor\init.bat"
  • GitLab, SourceTree:
    • ничего настраивать не нужно

Основные варианты использования

Установка Git

Инициализация Git репозитория

  • Shell: git init
  • VSCode: Git: Initialize Repository
  • PHPStorm: VCS | Import into Version Control | Create Git Repository...
  • Sourcetree: New tab | Create

Игнорирование файлов

  • VSCode: gitignore extension:
    • Простое расширение для Visual Studio Code, которое позволяет pull'ить .gitignore файлы из репозитоия. Добавляется команда Add gitignore с поддержкой шаблонов - как в плагине .ignore в PHPStorm
    • Минусы:
      • При добавлении какого-либо шаблона в .gitignore несколько раз он добавляет несколько копий, хотя дублировать не нужно - в отличие от PyCharm
      • Это расширение позволяет добавлять в .gitignore только файлы, но не позволяет добавлять в .gitignore директории - в отличие от .ignore плагина для PHPStorm
    • Плюсы:
      • включен в Git Extension Pack

Игнорирование файлов #2

  • PHPStorm: плагин .ignore:
    • Плюсы: подчеркивает entries defined more than one - в отличие от gitignore расширение в VSCode
  • Sourcetree:
    • In Sourcetree you should be able to right click on one of the files/folders and select ignore. This will auto create a .gitignore file for you with that particular file/folder in it
    • Options | Git | Global Ignore List
    • Минусы: нет шаблонов - в отличие от расширения gitignore в VSCode, .ignore плагин в PHPStorm

Работа с ветками

Что такое ветка в Git

Ветка в Git - это метка для коммита. The label moves to new commits as they are created. Когда вы содаете новую ветку вы ничего не изменяете в структуре репозитория. Вы просто создаете новую метку

В Git есть два типа веток:

  • Локальные ветки - хранятся в директории .git/refs/heads/
  • Удаленные (Remote-tracking) ветки

View branch list. List of branches

  • Shell:
    • Local branches: git branch
    • Remote branches: git branch -r
  • VSCode: кликнуть на текущей ветке в левом нижнем углу. Появится меню со списком веток
  • PHPStorm: кликнуть на текущей ветке в правом нижнем углу. Появится меню со списком веток
  • Sourcetree: список веток отобажается в левом sidebar'е в узле "BRANCHES"

Создание новой ветки

  • Shell: git branch <branch_name>
  • VSCode:
    • кликнуть на текущей ветке в левом нижнем углу. Появится меню с пунктами Create new branch... и Create new branch from.... При выборе пункта Create new branch... после создания ветки происходит checkout в эту ветку
    • Git: Create Branch From..., Git: Create Branch
    • Git Lens: Branch Context menu | Create Branch (via Terminal)...
  • PHPStorm:
    • кликнуть на текущей ветке в правом нижнем углу. Появится меню с пунктом "New Branch"
    • При подключении JIRA в качестве Issue Tracker'а при открытии задачи есть галка Create branch
  • Sourcetree: Repository | Branch | New Branch

Узнать какая ветка текущая

  • Shell:
    • В Cmder & Posh-Git текущая ветка отображается в приглашении консоли. Но следует помнить, что это значение не изменяется при изменении текущей ветки иными способами
    • git status
  • VSCode: текущая ветка отображается в левом нижнем углу
  • PHPStorm: текущая ветка отображается в правом нижнем углу
  • Sourcetree: текущая ветка выделена жирным шрифтом

Checkout branch

Checkout branch during create
  • Shell: git checkout -b feature - Создаёт новую ветку, названную feature и делает её активной
  • VSCode:
    • Git: Create Branch: после создания ветки происходит checkout в эту ветку
    • кликнуть на текущей ветке в левом нижнем углу. Появится меню с пунктами Create new branch... и Create new branch from.... При выборе пункта Create new branch... после создания ветки происходит checkout в эту ветку
  • PHPStorm: кликнуть на текущей ветке в правом нижнем углу. Появится меню с пунктом "New Branch". В окне "Create New Branch" есть галка "Checkout branch"
  • Sourcetree: Repository | Branch | New Branch. Есть галка "Checkout New Branch"
Checkout branch after create
  • Shell: git checkout <branch_name>
  • VS Code:
    • Можно кликнуть на названии ветки в левом нижнем углу и выбрать из меню новую ветку
    • Git: Checkout to... command
    • Git Lens:
      • Branch Context menu | Checkout
      • справа от названия ветки есть конка "Checkout"
    • Минусы: При переключении ветки в VS Code текущая ветка в Cmder не изменяется
  • PHPStorm:
    • переключатель веток находится в правом нижнем углу, в строке состояния
    • Минусы: При переключении ветки в VS Code текущая ветка в Cmder не изменяется
  • SourceTree:
    • двойной клик на ветке
    • Main menu | Repository | Checkout...
    • SourceTree при переключении веток переключает их со всеми изменениями, не перенося изменения в stash

Удалить локальную ветку

  • Shell:
    • git branch -d <branch_name>
    • git branch -D <branch_name>
  • VS Code:
    • Git: Delete Branch.... Эта команда удаляет только локальные ветки. Удалить с помощью этой команды удаленные (remote) ветки нельзя
    • Git Lens: Branch Context menu | Delete Branch (via Terminal). Этот способ для remote branches не работает
  • PHPStorm:
    • кликнуть на текущей ветке в правом нижнем углу. Появится меню со списком веток. Кликнуть на стрелочку справа от ветки. В открывшемся меню выбрать "Delete"
  • Sourcetree:
    • from context menu: "Delete <branch_name>..."
    • Main menu | Repository | Branch | Delete Branches

Удалить ветку при слиянии

  • Sourcetree: при выполнении Git-flow | Finish Feature (Finish Release) в окне Finish Feature (Finish Release) есть галки Delete branch и Force deletion
  • GitLab: в MR есть галка Delete source branch

Переименовать ветку

  • Shell: git branch -m old_branch new_branch
  • VSCode: Git: Rename Branch... - переименовывает текущую ветку
  • PHPStorm: кликнуть по стрелочке справа от имени branch'а и появится "Rename..."
  • Sourcetree: Branch context menu: "Rename <branch_name>..."
  • GitLab: Cannot rename branches

Сравнить две ветки

  • Shell:
    • git diff branch1 branch2
  • VSCode:
    • Git Lens: COMPARE node
    • GitLab Workflow:
      • GitLab: Compare current branch with master - открывает сравнение веток в GitLab'е
  • PHPStorm:
    • Git | Compare with branch - сравнивает один файл
    • Выбрать ветку (либо Context menu | Git | Repository | Branches | <choose branch>, либо кликнуть на текущей ветке в правом нижнем углу), кликнуть по стрелочке справа от ветки и выбрать "Compare with Current" - сравнивает все файлы в ветке
  • Sourcetree:
    • щелкнуть правой кнопкой мыши на ветке и выберать из контекстного меню пункт "Diff against current" (current refers to the branch you are currently working on). This will give you the diff between the head commits of the two branches

Работа с удаленными (Remote-tracking) ветками

Pulling
  • Shell:
    • git pull
    • git pull origin <branch>
  • VSCode:
    • Git: Pull
    • Git: Pull from...
  • PHPStorm:
    • Update Project (update project) кнопка на панели инструментов
    • Main menu | VCS | Update Project...
    • Main menu | VCS | Git | Pull...
  • Sourcetree:
    • Pull кнопка на панели инструментов
    • Branch Context menu | Pull (tracked)
Pushing
  • Shell:
    • git push
    • git pull origin <branch>
  • VSCode:
    • Git: Push
    • Git: Push to...
  • PHPStorm:
    • Main menu | VCS | Git | Push...
    • в окне "Commit Changes" если нажать на стрелочку справа от кнопки "Commit", то появится кнопка "Commit and Push..."
  • Sourcetree:
    • Push кнопка на панели инструментов
    • Branch Context menu | Push to, Push to (tracked)
    • при выполнении Git-flow | Finish Feature (Finish Release) в окне Finish Feature (Finish Release) есть галка Push changes to remote
    • Плюсы: Sourcetree позволяет пушить сразу несколько веток - в отличие от PHPStrom

Слияние

  • Shell:
    • git merge
  • VS Code:
    • Git: Merge Branch...
    • расширение Git Merger:
      • Минусы: missed in the Git Extension Pack
  • PHPStorm:
    • кликнуть на текущей ветке в правом нижнем углу), кликнуть по стрелочке справа от ветки и выбрать Merge into Current
  • Sourcetree:
    • Branch context menu | Merge <branch_name> into current branch
Разрешение базовых конфликтов слияния
  • Shell: Merge conflicts occur when the same part of the code has been modified in both branches. For example, if the same line of README.md is edited in fix and master. The file impacted will have conflict-resolution markers (<<<<<<< and >>>>>>>) added to it by git, showing the conflicting lines (separated by =======)

    $ git merge fix
    # conflict with README.md
    # merge failed
    $ cat README.md
    To contact us email:
    <<<<<<< HEAD
    [email protected]
    =======
    [email protected]
    >>>>>>> fix

    You have to manually choose the option you want or combine them. Then run git add to mark the file as resolved. When you're done resolving conflicts finalize the merge with git commit

Разрешение базовых конфликтов слияния #2
  • VSCode:
    • Нажать на кнопку "Source Control" слева
    • See MERGE CHANGES in sidebar.
    • Those files have merge conflicts.
  • PHPStorm: "Resolve Conflicts"
  • Sourcetree: Main menu | Actions | Resolve Conflicts

Работа с коммитами

Создание коммита

  • Shell: git commit -m <commit_message>
  • VSCode:
    • Git: Commit, Git: Commit All
    • нажать на кнопку "Source Control". В открывшемся sidebar'е есть сверху кнопка "Commit"
  • PHPStorm:
    • кнопка Commit на панели инструментов
    • Main menu| VCS | Commit
  • Sourcetree:
    • Нажать на кнопку "Commit" на панели инструментов
    • В окне "Unstaged files" содержатся все непроиндексированные изменения. Выберать файлы для индексации перед коммитом
    • В окне "Staged files" содержатся все проиндексированные файлы. Для удаления файла из индекса нажать на "минус" справа от файла
    • Ввести комментарий к коммиту
    • Нажать кнопку "Commit" для фиксации всех проиндексированных изменений в репозитории

Partial commits

  • VS Code: Git: Stage Selected Ranges
  • PHPStorm: в окне "Commit Changes" можно галочками выбирать изменения
  • Sourcetree: WORKSPACE | File Status: you can select lines to stage in the diff view of each uncommitted file. Then you commit what is in staging

Cherry-pick

  • Shell:

    $ git checkout master
    $ git cherry-pick a456bd7
    # merge commit a456bd7 (from another branch)
    # with branch master
  • VSCode: Git History:

    • Cherrypick into current branch: Сначала необходимо выбрать коммит в Git History
    • Context menu | Git: View File History. В открывшемся окне "File History" справа от каждого коммита есть кнопка "Cherry pick, Compare, etc"
  • PHPStorm: Version Control window | Log tab | commit context menu | Cherry-Pick

  • SourceTree: In the log view (Cmd-2), just select one or more commit lines (Cmd-click or Shift-click multi-selects), then right-click and select 'Cherry pick'

Amend commit (change your most recent commit)

  • Shell:

    To make changes to your most recent commit use: $ git commit --amend For example, you might want to edit the name of the commit:

    $ git commit -m 'my first comit'
    $ git commit --amend
    # editor opens
    'my first commit'
  • VSCode: Git: Commit All (Amend), Git: Commit Staged (Amend)

  • PHPStorm: в окне "Commit Changes" есть галка "Amend commit"

  • Sourcetree: In SourceTree, the “Commit options…” dropdown list to the right of the commit dialog has an option to “Amend latest commit.” You’ll be asked if you want to replace the commit text in your current dialog with the message of the previous commit. Say yes, since you’re adding a file to the previous commit that you had meant to include all along

Revert commit

This generates a new commit with all the changes introduced in <commit> afterwards applying it to the current branch

  • Shell:
    • git revert <commit>.
  • VSCode:
    • Git History:
    • Context menu | Git: View File History. В открывшемся окне "File History" справа от каждого коммита есть кнопка "Cherry pick, Compare, etc". В открывшемся меню есть пункт "Revert this (...) commit"
  • PHPStorm:
    • VCS | Git | Revert...
    • кнопка "Revert" на панели инструментов
  • Sourcetree:
    • Commit context menu | Reverse commit...

HEAD

HEAD – это указатель на текущую ветку, которая, в свою очередь, является указателем на последний коммит, сделанный в этой ветке. Это значит, что HEAD будет родителем следующего созданного коммита. Как правило, самое простое считать HEAD снимком вашего последнего коммита.

Перемещатm HEAD можно, например, двойным щелчком кнопкой мыши по коммиту в Sourcetree

Git Flow diagram

Git Flow diagram

Git Flow Tools

  • Shell:
    • git flow feature start <feature_name>
    • git flow feature finish <feature_name>
  • VSCode: расширение gitflow
  • PHPStorm:
    • плагин Git Flow Integration
    • При подключении JIRA в качестве Issue Tracker'а при открытии задачи есть галка Create branch
  • Sourcetree:
    • Main menu | Repository | Git-flow
    • Git-flow button:
      • Не создает автоматически бранчи - в отличие от GitFlow: Initialize repository for gitflow в VSCode

Git Best practices

  • Использовать Git Flow
  • Не сохранять большие бинарные файлы в Git
  • Коммиты удалять "нельзя". Для "удаления" коммитов используется Revert commit

Merge Requests (MR)

Merge Request предназначен для Code Review

Аналогом MR в GitLab является Pull Request в GitHub

Working with MR in different Tools

  • VSCode: GitLab Workflow
  • PHPStorm:
    • плагин GitLab Projects:
      • Settings | Version Control | GitLab
      • В меню Git добавляется меню "Git Lab" с пунктами "Create Merge Request..." и "List Merge Requests..."
    • плагин GitLab Quick Merge Request:
      • Добавляется Settings | Version Control | GitLab Quick Merge Request

Crate MR in GitLab

  • Название MR лучше копировать из названия задачи в JIRA
  • Заполнить поле Assignee
  • Установить галку Delete source branch

Практические задания

Установить Git и настроить свой любимый инструмент для работы с Git

Содать локальный репозиторий

  1. git init
  2. Добавить в репозиторий файл

Склонировать удаленный репозиторий

  1. Склонировать учебный репозиторий из GitLab
  2. Проверить состояние репозитория (git status), определить какие есть ветки и какая ветка текущая
  3. Создать новый файл и закоммитить его

Создать feature-branch

  1. Создать feature-ветку от develop
  2. Внести изменения в определенную строчку определенного файла
  3. Закоммитить изменения
  4. Сравнить текущую ветку с develop

Создать конфликт при слиянии изменений

  1. Переключиться на ветку develop
  2. Внести другие изменения в ту же строчку того же файла. Закоммитить изменения
  3. Попробовать смерджить feature-ветку
  4. Разрешить конфликт

Посмотреть историю изменений

git log

Запушить ветку на remote

в GitLab

Создать Merge Request

git_course's People

Contributors

osya avatar

Watchers

 avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.