Управление на кода с git

Web технологии, спец. Информационни системи, 2021/22 г.

Тази презентацията е достъпна под лиценза Creative Commons Признание-Некомерсиално-Споделяне на споделеното 4.0 Международен

Основни принципи и малко история

Системи за управление на кода

  • запазване на текущото състояние на кода
  • история на промените в кода (дата, автор, цел, причина, описание)
  • връщане към произволен момент от историята на кода
  • информация за промените между два момента от време
  • споделяне на код и информация за разработката му
  • паралелна работа по кода от различни разработчици
  • обмяна на код между различни негови версии
  • отбелязване (публикуване) на конкретно състояние на кода

Кратка история на git

  • създаден от Linus Torvalds през 2005 г.
  • основно предназначен за управление на кода на ядрото Linux
  • свободен софтуер с отворен код
  • разпределена система
  • силно ориентирана към *nix философията

Основни понятия в git

  • хранилище (repository)
  • подаване (commit)
  • клон (branch)
  • индекс (staging area)
  • хеш (hash)

Първи стъпки в git

Интерфейс на командния ред (CLI)

основната работа с git е през командния ред:

                                                                git <команда> <опции> <параметри>
                                                

Откъде да започнем

  • клониране на съществуващо хранилище
    
                                                                                    git clone <URL>
                                                                    
  • създаване на празно хранилище
    
                                                                                    git init
                                                                    
  • регистриране на всички файлове в хранилището
    
                                                                                    git add .
                                                                    
  • подаване на регистрираните файлове към хранилището
    
                                                                                    git commit
                                                                    

Как да правим промени

  • регистриране на нови промени
    
                                                                            git add <файл>
                                                                    
  • подаване на всички променени и следени файлове
    
                                                                                    git commit -a
                                                                    

Къде сме в момента

  • текущо състояние на кода, индекса и работата директория
    
                                                                                    git status
                                                                    
  • информация за историята
    
                                                                                    git log [--graph]
                                                                    
  • графична информация за историята
    
                                                                                    gitk
                                                                    

Къде сме в момента

  • какви клони има хранилището и на кой сме в момента
    
                                                                                    git branch
                                                                    
  • преглед на промените
    
                                                                                    git diff [<подаване>]
                                                                                    git diff <подаване1> <подаване2>
                                                                    
  • преглед на файл в момент от времето
    
                                                                                    git show [<подаване>:] <файл>
                                                                    

Когато нещо се обърка

Внимание: повечето команди по-долу са свързани със загуба на данни без възможност за тяхното възстановяване!
  • поправка на съобщението на последното подаване
    
                                                                                    git commit --amend
                                                                    
  • изтриване на файл от хранилището
    
                                                                                    git rm <файл>
                                                                    
  • отказ от локални промени във файлове
    
                                                                                    git restore {<файл>}
                                                                    
  • отказ от всички локални промени по следените файлове
    
                                                                                    git reset --hard
                                                                    

Когато нещо се обърка

  • изчистване на неследени файлове
    
                                                                                    git clean -n [-d]
                                                                                    git clean -f [-d]
                                                                    
  • възстановяване на клон към предишно състояние
    
                                                                                    git reset --hard <клон>{<брой-стъпки-назад>}
                                                                    
  • Експериментална разработка

    • преминаване към друг клон
      
                                                                                      git switch <клон>
                                                                      
    • създаване на нов клон и преминаване към него
      
                                                                                      git switch -c <нов-клон>
                                                                      
    • временно запазване на текущите промени
      
                                                                                      git stash
                                                                      
    • възстановяване на временно запазени промени
      
                                                                                      git stash apply
                                                                                      git stash pop
                                                                      

    Съвместна работа

    Работа с отдалечени хранилища

    • добавяне и на отдалечено хранилище
      
                                                                                      git remote add <име> <URL>
                                                                      
    • издърпване на промени от отдалечено хранилище
      
                                                                                      git pull [<хранилище>] {<клон>}
                                                                                      git fetch [<хранилище>] {<клон>}
                                                                      
    • отдалечени клонове
      
                                                                                      git branch -r
                                                                      
    • изтласкване към отдалечено хранилище
      
                                                                                      git push [<хранилище>] -u [<клон-за-следене>] [<клон>]
                                                                      

    Сливане на промени

    • сливане на клонове в текущия клон
      
                                                                                      git merge {<клон>}
                                                                      
    • управление на конфликти при сливане
      
                                                                                      git mergetool
                                                                                      git add <файл>
                                                                      
    • пребазиране върху клон
      
                                                                                      git rebase [<клон>]
                                                                      

    Поглед отвътре

    Индекс

    • интерактивно добавяне в индекса
      
                                                                                      git add -i
                                                                      
    • проверка за промени в индекса
      
                                                                                      git diff --cached
                                                                      
    • възстановяване на файлове от индекса
      
                                                                                      git restore --cached {<файл>}
                                                                      
    • възстановяване със или без запазване на промените в индекса
      
                                                                                      git reset --soft
                                                                                      git reset --mixed
                                                                      

    Конфигурация: .git/config

    • преглед на конфигурация:
      
                                                                                      git config -l
                                                                      
    • преглед на конкретна настройка:
      
                                                                                      git config <секция>.<настройка>
                                                                      
    • промяна на конкретна настройка:
      
                                                                                      git config <секция>.<настройка> <стойност>
                                                                      
    • глобална конфигурация: <директория>/.gitconfig
      
                                                                                      git config --global
                                                                      
    • игнориране на файлове:.gitignore

    Обекти в git

    Четири вида обекти:
    • подаване (commit): съдържа информация за промяна относно базово състояние, описва момент от историята на хранилището
    • дърво (tree): съдържа информация за йерархична структура на файловете
    • файл (blob): масив от данни
    • етикет (tag): именуван константен указател към подаване

    Github

    Комерсиална платформа за работа с git хранилища.

    • създаване на ново хранилище
    • лицензи за код
    • разклоняване на хранилище (fork)
    • заявка за издърпване (pull request, PR)
    • SSH ключове
    • GPG ключове

    Допълнителни ресурси