Competent
- Importing sources into repository
- Exporting sources from repository
- Comparing repository revisions
- Creating a branch
- Working with branch
- Traversing branches
- Common branching patterns (rebasing in Git)
- Merging branches
- Tagging (labeling in TFS)
- Creating and applying patches (shelvesets in TFS)
- Revision specifiers
- Data recovery
- Using external editors and merge tools
- Distributed VCS (if supported)
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 masteror
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.patchgit 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-clientgit pull git://github.com/onetimeguy/project.gitIntegrating contributed work
git shortlog- быстро получает список наподобии changelog
Gitflow: master, develop, hotfixes, feature, release
* feature - выводятся и вливаются в develop
* release - выводятся из develop, вливаются в develop, master
* hotfix - выводятся из master, вливаются в master, develop