Competent


Importing sources into repository

git init

git add .

git commit -m 'initial project version'

Exporting sources from repository

git archive master --format=zip

  • git archive --remote=<repo> --format=tar

сохраняет все изменения в файл

git diff > test.patch git diff --cached > test.patch

git apply test.patch // применить изменения из патча


Comparing repository revisions

  • git log <currentBranchName> --not master - посмотреть коммиты, которые есть в ветке, но нет в мастере
  • git diff master ... <currentBranchName> - показать разницу с мастер веткой

Creating a branch

Git хранит свои данные как последовательность снимков состояния

git branch feature/login-page
git checkout feature/login-page

git checkout -b feature/login-page

Working with branch

  • git branch -d <branchName> - удаление ветки

  • git branch - вывести списов веток (локальных)

  • git checkout --track origin/serverfix - для отслеживания изменений, не использовать слово origin

Traversing branches

Это ветки, которые создаются временно, под какой-то функционал, а затем вмердживаются и удаляются (like feature/new-auth)


Common branching patterns (rebasing in Git)

  • rebase перемещение

Rebase — еще один способ перенести изменения из одной ветки в другую. Rebase сжимает все изменения в один «патч». Затем он интегрирует патч в целевую ветку.

В отличие от слияния, перемещение перезаписывает историю, потому что она передает завершенную работу из одной ветки в другую. В процессе устраняется нежелательная история.

TIP

Rebase работает следующим образом: находится общий предок для двух веток (на которой вы находитесь сейчас и на которую вы выполняете перемещение); для каждого из коммитов в текущей ветке берётся его дельта и сохраняется во временный файл; текущая ветка устанавливается на тот же коммит, что и ветка, на которую выполняется перемеще- ние; и, наконец, одно за другим применяются все изменения.

git checkout feature
git rebase master

interactive rebase (Это откроет редактор, перечислив все коммиты, которые будут перемещены)

$ git checkout feature
$ git rebase -i master
git rebase --onto master server client

По сути, это указание «переключиться на ветку client, взять изменения от общего предка веток client и server и повторить их на master

Merging branches

  • merge слияние

    • принимает содержимое ветки источника и объединяет их с целевой веткой. В этом процессе изменяется только целевая ветка. История исходных веток остается неизменной
    • создает доп merge коммит, который содержит историю обеих веток
    git checkout feature
    git merge master
    

    or

    git merge master feature
    

Tagging

lightweight / annotated

  • git tag посмотреть все теги

  • git tag v1.0.0 создать тег (lightweight)

  • git tag -a v1.1.0 -m "release 1.1.0" создать тег (annotated)

  • git tag v1.2.0 <sha-1 commit>

  • git tag -l "v1.*" поиск по тегам

  • git show v1.1.0 просмотр информации по тегу

  • git push origin v1.0.0 запушить тег

  • git push origin --tags запушить все теги

  • git tag -d v1.2.0 удалить тег

  • git checkout 1.1.0 переход на конкретный тег


Creating and applying patches

  • сохраняет все изменения в файл

    git diff > test.patch
    git diff --cached > test.patch
    

    git format patch

  • применить изменения из патча

    • git apply test.patch если патч был сгенерериван с помощью комманды git diff (индексацию файлов и коммит нужно делать вручную)

    • git am test.patch если патч создан при помощи format patch (авто коммит)


Revision specifiers

git show dae68e1	            // sha1
git show HEAD	                // reference
git show v1.0.0	                // tag
git show master	                // local branch
git show origin/master	        // remote branch
git show master~2	            // 2 commits back from master

Data recovery

  • git reflog - локально записывает все изменения, там можно вытянуть хеш удаленных кеоммитов
$ git reflog
1a410ef HEAD@{0}: 1a410efbd13591db07496601ebc7a059dd55cfe9: updating HEAD
ab1afef HEAD@{1}: ab1afef80fac8e34258ff41fc1b867c702daa24b: updating HEAD

далее можем восстановить коммиты, git branch recover-branch ab1afef (хеш HEAD@{1})

* если reflog почищен, можно использовать git fsck --full - проверяет базу коммитов на целостность

$ git fsck --full
dangling blob d670460b4b4aece5915caf5c68d12f560a9fe3e4
dangling commit ab1afef80fac8e34258ff41fc1b867c702daa24b
dangling tree aea790b9a58f6cf6f2804eeac9f0abbe9631e4c9
dangling blob 7108f7ecb345ee9d0084193f147cdad4d2998293

dangling commit - ссылка на недостижимый коммит


Using external editors and merge tools

git config --global merge.tool kdiff3

kdiff3, p4merge, extMerge


Distributed VCS (if supported)

  • Workflows

    • форкнуть репозиторий, внести изменения, закинуть пулл-реквест
    • доступ в мастер у одного человека, остальные выводят ветки и кидают запросы на мердж
  • Checking out remote branches

    $ git remote add jessica git://github.com/jessica/myproject.git
    $ git fetch jessica
    $ git checkout -b rubyclient jessica/ruby-client
    
    git pull git://github.com/onetimeguy/project.git
    
  • Integrating contributed work

    • git shortlog - быстро получает список наподобии changelog

Gitflow: master, develop, hotfixes, feature, release

* feature - выводятся и вливаются в develop
* release - выводятся из develop, вливаются в develop, master
* hotfix - выводятся из master, вливаются в master, develop