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