Kategóriák: Minden - clean

a Anton Alexeyevich 1 éve

542

Old

Old

git (Anton Korniychuk)

Committing

git commit
Flags

-m , --message= -e, --edit --no-edit --amend --allow-empty --allow-empty-message -n, --no-verify -a, --all -p, --patch -C , --reuse-message= # reuse msg, author, timestamp -c , --reedit-message= # like -C, but invokes msg editor --dry-run

Отмена Изменений

git reset
Modes

Commits after git reset --hard/--keep might be recovered git reflog

--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

--keep

- doesn't touch changes in working tree - changes in index tree => working tree - moves HEAD pointer, changes => lost - index tree will be empty

--merge

- TODO - like git read-tree -u -m , but ...

--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

--soft

- doesn't touch changes in working tree - doesn't touch changes in index tree - delete commits, changes => index tree

git reset === get reset --mixed HEAD
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 clean Remove untracked files from the working tree
-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= # providing additional ingores using glob
Configs

clean.requireForce = true (default) - do nothing without flags (-f or -d, -i)

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" # с временем

diff (сравнение)

git diff --name-only --diff-filter=U # список файлов с конфликтами слияния
git diff --name-status master test # сравнить ветки master и test. Что нужно сделать в master что бы получилось test

Теория

Short hash is first 7 chars of long hash
GIT деревья
- Working Directory # Дерево рабочего каталога - Index # Дерево проиндексированных файлов - HEAD # Дерево истории коммитов

tags(метки)

git push origin [имя метки] # отправить на сервер метку git push origin --tags # отправить на сервер все метки, которых там нет git pull # вытаскивает метки
git tag -a v1.2 -m 'version 1.2' 9fceb02 # выставление меток на уже созданный коммит
git tag v1.4-lw # создание легковесной метки. Опции не нужны
git tag -s v1.5 -m 'my signed 1.5 tag' # создание подписанной аннотированной ветки. Вместо '-a' используем 's' git tag -v v1.5 # верификация подписанной метки. Эта команда использует GPG для верификации подписи
git tag -a v1.4 -m 'my version 1.4' # создание аннотированной метки, если не указать сообщение - откроется редактор
git show v1.4-lw # подробная информация о конкретной метке
git tag # просмотр меток git tag -l 'v1.4.2.*' # просмотр меток по шаблону # Метки перечисляются в алфавитном порядке, независимо от порядка добавления
Виды меток
Подписанные метки - только аннотированная ветка может быть подписана.
Легковесная метка — это что-то весьма похожее на ветку, которая не меняется — это просто указатель на определённый коммит.
Аннотированные метки - хранится в базе как полноценный объект. имеют контрольную сумму, содержат имя поставившего метку, e-mail и дату, имеют комментарий и могут быть подписаны и проверены с помощью GNU Privacy Guard (GPG)
Метка - отметка в истории момента выпуска. Например: v1.0.0

stash(прятание)

git stash branch newBranchName # создаст новую ветку с началом из того коммита, на котором вы находились во время прятанья, восстановит в ней вашу работу и затем удалит спрятанное, если оно применилось успешно
git stash pop # применить последнюю заначку и удалить ее
git stash drop # удалить последнюю заначку. В конце можно указать имя - stash@{0}
git stash apply # применить последнюю спрятанную заначку
git stash apply --index # применить с учетом индекса
git stash apply stash@{2} # применить заначку 2
Применение проиндексированного: по умолчанию то что было проиндексировано применяется без индекса Конфликты: возможно понадобится разрешение конфликтов
git stash list # список сохраненных "заначек"
git stash # спрятать текущие изменения, после этого можно переключать ветку
Прятанье - поглощает грязное состояние рабочего каталога, то есть изменённые отслеживаемые файлы и изменения в индексе, и сохраняет их в стек незавершённых изменений, которые вы потом в любое время можете снова применить.

Remote

Bare Repository (Local Remotes)
$ git clone ~/repos/myproject.git
$ git init --bare ~/repos/myproject.git $ cd /path/to/existing/repo $ git remote add origin ~/repos/myproject.git $ git push origin master
git remote add [-t ] [-m ] [-f] [--[no-]tags] [--mirror=] git remote rename git remote remove git remote set-head (-a | --auto | -d | --delete | ) git remote set-branches [--add] … git remote get-url [--push] [--all] git remote set-url [--push] [] git remote set-url --add [--push] git remote set-url --delete [--push] git remote [-v | --verbose] show [-n] … git remote prune [-n | --dry-run] … git remote [-v | --verbose] update [-p | --prune] [( | )…]
git remote # shows names of tracked repositories git remote [-v | --verbose] # shows names and urls of tracked reposisories

branch(ветвление)(old)

Включение изменений из одной ветки в другую
Перемещение (rebase)

git rebase --onto master server client - переместить изменения из ветки server->client в ветку master

git rebase master - переместить текущую ветку в master

$ git checkout experiment

$ git rebase master

First, rewinding head to replay your work on top of it...

Applying: added staged command

взять все изменения, которые попали в коммиты на одной из веток, и повторить их на другой

Слияние (merge)

виды

текхходовое слияние

перемотка

Конфликты

Automatic merge failed;

git status - показывает как unmerged файлы с конфликтом

В файле конфликта все что до ======= это версия HEAD, после - сливаемая ветка

После ручного разрешения конфликтов нужно выполнить commit для окончательного слияния

git merge testing - слить текущую ветку с testing

Отслеживаемые ветки
При клонированнии автоматически создается ветка master, которая отслеживает origin/master. Поэтому git push\git pull работают из коробки
git checkout -b [ветка] [удал. сервер]/[ветка] - в ручную настроить отслеживание удаленной ветки

git checkout --track origin/serverfix - сокращение если локальное и удаленное имя - одинаковы

git checkout -b local_serverfix origin/serverfix - использовать другое локальное имя для удаленной ветки

git push\git pull - не требуют дополнительных аргементов
Локальная ветка - которая напрямую связана с удаленной
Удалённые ветки
git push origin :iss43 - удалить на сервере ветку iss43
git pull - получение удаленной ветки и автоматическое слияние с локальной
git checkout -b serverfix origin/serverfix - создать локальную ветку на основе удаленной
git merge origin/master - слить удаленные наработки в мою текущую ветку
git fetch origin - синхронизировать с удаленным сервером origin
git push origin master # отправить на сервер origin локальную ветку master git push origin localBranchName:serverBranchName # отправить на сервер ветку которая по другому называется
Локальные(редактируемые) копии для удаленных веток автоматически не создаются
Удаленная ветка(origin/master) и локальная(master) не конфликтуют
это ссылки на состояние веток в ваших удалённых репозиториях
git branch - остальные параметры
git branch -m # переименовать верку git branch -m # переименовать тукущую ветку
git branch - список веток
-v - список веток с последним коммитом в каждой
--merged - список веток которые сливали с текущей
--no-merged - список веток не слитых с текущей
git branch -d testing # удалить ветку testing с сохранением наработок
git branch -D testing # удалить неслитую ветку с потеряй наработок
основные комманды - создание\переключение
git checkout testing path/to/file.txt # в текущую ветку вставить файл file.txt из последнего коммита ветки testing git checkout testing . # вытащить из последнего коммита ветки testing текущую папку. Точка(.) обозначает "текущий каталог" git checkout . # вытащить из последнего коммита текущей ветки из последнего коммита текущий каталог
git checkout -b branch-name # создать ветку iss53 и переключиться на нее
git branch -d testing # удалить ветку testing
git checkout testing # переключится на ветку testing
git branch testing # сздать ветку testing
теория
создание ветки - это просто создание файла указывающего на определенный коммит
master - ветка по умолчанию

branch(new)

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

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