git
(Anton Korniychuk)
branch(new)
rename branch
(locally and remotely)
git branch -m old_branch new_branch # Rename branch locally
git push origin :old_branch # Delete the old branch
git push --set-upstream origin new_branch # Push the new branch, set local branch to track the new remote
find common ancestor
$ git merge-base branch2 branch3 # 050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
$ git merge-base --fork-point develop # for current branch and develop branch
git log -1 $(git merge-base --fork-point branch-name)
git diff $(git-merge-base A B) B
branch(ветвление)(old)
Remote
git remote
# shows names of tracked repositories
git remote [-v | --verbose]
# shows names and urls of tracked reposisories
git remote add [-t <branch>] [-m <master>] [-f] [--[no-]tags] [--mirror=<fetch|push>] <name> <url>
git remote rename <old> <new>
git remote remove <name>
git remote set-head <name> (-a | --auto | -d | --delete | <branch>)
git remote set-branches [--add] <name> <branch>…
git remote get-url [--push] [--all] <name>
git remote set-url [--push] <name> <newurl> [<oldurl>]
git remote set-url --add [--push] <name> <newurl>
git remote set-url --delete [--push] <name> <url>
git remote [-v | --verbose] show [-n] <name>…
git remote prune [-n | --dry-run] <name>…
git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)…]
Bare Repository
(Local Remotes)
$ git init --bare ~/repos/myproject.git
$ cd /path/to/existing/repo
$ git remote add origin ~/repos/myproject.git
$ git push origin master
$ git clone ~/repos/myproject.git
stash(прятание)
Прятанье - поглощает грязное состояние рабочего каталога, то есть изменённые отслеживаемые файлы и
изменения в индексе, и сохраняет их в стек незавершённых изменений, которые вы потом в любое время
можете снова применить.
git stash # спрятать текущие изменения, после этого можно переключать ветку
git stash list # список сохраненных "заначек"
git stash apply # применить последнюю спрятанную заначку
Применение проиндексированного: по умолчанию то что было
проиндексировано применяется без индекса
Конфликты: возможно понадобится разрешение конфликтов
git stash apply stash@{2} # применить заначку 2
git stash apply --index # применить с учетом индекса
git stash drop # удалить последнюю заначку. В конце можно указать имя - stash@{0}
git stash pop # применить последнюю заначку и удалить ее
git stash branch newBranchName # создаст новую ветку с началом из того коммита, на котором вы находились во
время прятанья, восстановит в ней вашу работу и затем удалит спрятанное, если оно применилось успешно
tags(метки)
Метка - отметка в истории момента выпуска. Например: v1.0.0
Виды меток
Аннотированные метки - хранится в базе как полноценный объект. имеют контрольную сумму, содержат имя поставившего
метку, e-mail и дату, имеют комментарий и могут быть подписаны и проверены с помощью GNU Privacy Guard (GPG)
Легковесная метка — это что-то весьма похожее на ветку, которая не меняется — это просто указатель на определённый коммит.
Подписанные метки - только аннотированная ветка может быть подписана.
git tag # просмотр меток
git tag -l 'v1.4.2.*' # просмотр меток по шаблону
# Метки перечисляются в алфавитном порядке, независимо от порядка добавления
git show v1.4-lw # подробная информация о конкретной метке
git tag -a v1.4 -m 'my version 1.4' # создание аннотированной метки, если не указать сообщение - откроется редактор
git tag -s v1.5 -m 'my signed 1.5 tag' # создание подписанной аннотированной ветки. Вместо '-a' используем 's'
git tag -v v1.5 # верификация подписанной метки. Эта команда использует GPG для верификации подписи
git tag v1.4-lw # создание легковесной метки. Опции не нужны
git tag -a v1.2 -m 'version 1.2' 9fceb02 # выставление меток на уже созданный коммит
git push origin [имя метки] # отправить на сервер метку
git push origin --tags # отправить на сервер все метки, которых там нет
git pull # вытаскивает метки
Теория
GIT деревья
- Working Directory # Дерево рабочего каталога
- Index # Дерево проиндексированных файлов
- HEAD # Дерево истории коммитов
Short hash is first 7 chars of long hash
diff (сравнение)
git diff --name-status master test # сравнить ветки master и test.
Что нужно сделать в master что бы получилось test
git diff --name-only --diff-filter=U # список файлов с конфликтами слияния
log (история)
git log # вывод истории
git log -1 # полная инфа по последнему коммиту в текущей ветке
git log -1 branch-name # полная инфа по последнему коммиту в branch-name ветке
git log -1 12fdb48 # инфа о коммите по его hash-у
git log --format=%H -1 branch-name # shous only commit hash for the last commit in the branch-name branch
git log --author="Oleksandr Chernysh" --since="2018-03-14" --format=oneline # без времени
git log --author="Oleksandr Chernysh" --since="2018-03-14" --format=oneline --pretty=format:"%ad %h by %an, %s" # с временем
Отмена
Изменений
git clean
Remove untracked files from the working tree
Configs
clean.requireForce = true (default) - do nothing without flags (-f or -d, -i)
-n, --dry-run # do nothing, just show would be done
-f, --force # do deleting
-i, --interactive # do deleting with interactive choices
-d # delete directories too
-x # delete ignored (via all .gitignore) files too
-X # delete only ignored files
-q, --quite # no output
-e, --exclude=<pattern> # providing additional ingores using glob
git revert
Revert some existing commits by creating a new one
-e, --edit # (default) open msg editor
--no-edit # don't start msg editor
--n, --no-commit
git reset
git reset === get reset --mixed HEAD
Modes
--soft
- doesn't touch changes in working tree
- doesn't touch changes in index tree
- delete commits, changes => index tree
--mixed
(default)
- doesn't touch changes in working tree
- changes in index tree => working tree
- delete commits, changes => working tree
- index tree will be empty
--merge
- TODO
- like git read-tree -u -m <commit>, but ...
--keep
- doesn't touch changes in working tree
- changes in index tree => working tree
- moves HEAD pointer, changes => lost
- index tree will be empty
--hard
- resets working tree, doesn't touch untracked files
- it is impossible to recover uncommitted reseted data
- resets index tree
- moves HEAD pointer, changes => lost
Commits after git reset --hard/--keep might be recovered git reflog
Committing
git commit
Flags
-m <msg>, --message=<msg>
-e, --edit
--no-edit
--amend
--allow-empty
--allow-empty-message
-n, --no-verify
-a, --all
-p, --patch
-C <commit>, --reuse-message=<commit> # reuse msg, author, timestamp
-c <commit>, --reedit-message=<commit> # like -C, but invokes msg editor
--dry-run