GIT

Configuring

Первоначальная настройка Git

git config --global user.name "Nikolay Rozhkov"
git config --global user.email rozhkov@uchi.ru

Внешиние утилиты

git config --global diff.tool meld
git config --global difftool.prompt false
git config --global core.editor /usr/bin/vim

External diff

[diff]
  tool = meld
[difftool]
  path = meld
  prompt = false

External editor

[core]
  editor = /usr/bin/vim

Init

Инициализировать новый проект c Git

git init new-project
git init new-project --bare

Добавить существуй проект в Git

cd existing-project
git init
git init .

Staging

Add

git add .

Reset

git reset

Remove

git rm
git add -A
git add --all

Commit

git status
git commit
git commit -m 'Here goes message'

Undo

Изменение последнего коммита

git commit --amend

Отмена изменений файла

git checkout -- hello.txt
Staging

Branches

Создание ветки

git branch feature

Переключение

git checkout feature

Сокращённо

git checkout -b feature

Список веток

$ git branch --all
* master
%3 A A B B A->B C C B->C master master C->master HEAD HEAD master->HEAD

Новая ветка

%3 A A B B A->B C C B->C master master C->master HEAD HEAD feature feature HEAD->feature feature->C

Разработка

%3 A A B B A->B C C B->C D D C->D master master C->master E E D->E HEAD HEAD feature feature HEAD->feature feature->E

Слияние fast-forward, "Перемотка"

git checkout master
git merge feature
%3 A A B B A->B C C B->C D D C->D E E D->E master master E->master HEAD HEAD master->HEAD feature feature feature->E

Слияние --no-ff

git checkout master
git merge --no-ff feature
%3 A A B B A->B C C B->C D D C->D F F C->F E E D->E E->F master master F->master HEAD HEAD master->HEAD feature feature feature->E

Слияние при наличии других коммитов

%3 A A B B A->B C C B->C D D C->D G G C->G E E D->E F F E->F G->F master master F->master HEAD HEAD master->HEAD feature feature feature->E

Rewrite

Revert

git revert HEAD~1
%3 A A B B A->B C C -B -B C->-B feature feature C->feature B->C B:ne->-B:nw feature' feature' -B->feature' HEAD HEAD HEAD' HEAD' feature->HEAD feature'->HEAD'
git checkout feature && git rebase master
%3 B B C C B->C D D C->D G G C->G E E D->E D' D' D->D' E' E' E->E' F D'->E' feature' feature' E'->feature' G->D' master master G->master HEAD HEAD feature feature HEAD->feature HEAD' HEAD' feature->E feature'->HEAD'

Interactive Rebase

git co -b before-rebase
for i in `seq 10 30`; do echo $i > $i && git add . && git cm -m$i ; done
git co -b after-rebase
git rebase -i HEAD~21 # master
# Rebase cc9a7b9..10cf5fa onto cc9a7b9 (21 command(s))
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
git cherry-pick cc9a7b9
%3 C C D D C->D G G C->G E E D->E D' D' D->D' master' master' D'->master' G->D' master master G->master HEAD HEAD feature feature HEAD->feature feature->E

Remotes

git init uchi && cd ..
git clone uchi -o source local
cd local && git branch -m main
git branch --unset-upstreamgit branch --set-upstream-to=source/master
cat .git/config
[remote "originsource"]
  url = /tmp/uchi
  fetch = +refs/heads/*:refs/remotes/originsource/*
[branch "mastermain"]
  remote = originsource
  merge = refs/heads/masterremote = source
  merge = refs/heads/master
%3 A A B B A->B master master master->B
git clone uchi -o source local
%3 A A B B A->B master main B->master origin_master source/master origin_master->B
%3 A A B B A->B C C B->C master master master->C
...
%3 origin_master source/master B B origin_master->B master main A A A->B D D B->D D->master
%3 A A B B A->B C C B->C master master master->C
git fetch source
%3 origin_master source/master C C origin_master->C master main A A B B A->B B->C D D B->D D->master
%3 A A B B A->B C C B->C master master master->C
git fetch && git merge source/master
git pull source
%3 origin_master source/master C C origin_master->C master main A A B B A->B B->C D D B->D E E C->E D->E E->master

Notation

local-branch:remote-branch

Uptrack

git push -u source feature

Delete

git push source :topic
git push source --delete topic

CHECKOUT

Resolve conflicts

git rebase master
git pull --rebase
git checkout --ours file.txt # feature
git checkout --theirs file.txt # master

Detached

git checkout 26c0aa12792e6344f5
%3 A A B B A->B C C B->C HEAD HEAD B->HEAD master master C->master
git checkout 26c0aa12792e6344f5 -b feature

Revisions

%3 checkout checkout revision revision checkout->revision show show show->revision cherry-pick cherry-pick cherry-pick->revision reset reset reset->revision
$ git show ???

Возможные значения

master

v1

b1713c7

Возможные значения

HEAD@{0}

HEAD^

HEAD~

Выбираем SHA

$ git log
commit b1713c78427b728a2d981981dccb5d6e398b66a6
Author: Nikolay Rozhkov <rozhkov@uchi.ru>
Date:   Wed Jun 21 19:20:54 2017 +0300

    Fixed env

commit 47194bcc4a1413360b42a15f1067605162f58d29
Author: vbratkev <bratkevich.v@gmail.com>
Date:   Tue Jun 20 15:15:26 2017 +0300

    Fix deploy

Выбираем перемещения HEAD

$ git reflog
b1713c7 HEAD@{0}: commit: Fixed env
47194bc HEAD@{1}: clone: from git@github.com:nirname/documentary.git
$ git show HEAD@{1}

Выбираем родителей

HEAD^n n-й родитель

HEAD~n n 1-x родителей

HEAD^1^1 == HEAD~2

Выбираем родителей

HEAD^ == HEAD^1

HEAD~ == HEAD~1

HEAD == HEAD^0 == HEAD~0

Выбираем родителей

revisions G G D D G->D H H H->D B B D->B I I F F I->F J J J->F F->B C C F->C E E E->B A A B->A C->A

Выбираем родителей

revisions G G = A^^^ = A^1^1^1 = A~3 D D = A^^ = A^1^1 = A~2 G->D H H = D^2 = B^^2 = A^^^2 = A~2^2 H->D B B = A^ = A^1 = A~1 D->B I I = F^ = B^3^ = A^^3^ F F = B^3 = A^^3 I->F J J = F^2 = B^3^2 = A^^3^2 J->F F->B C C = A^2 = A^2 F->C E E = B^2 = A^^2 E->B A A = A^0 B->A C->A

Debugging

Bisect

git bisect start
git bisect bad
git bisect good master
git bisect start HEAD master
git bisect run test -f hello.txt

Rules

git push -f
git push -u origin feature
git push -u origin feature && git rebase master
git rebase master && git push -u origin feature
git pull --rebase
git merge --no-ff master && git pull --rebase
git rebase --abort
git merge --abort
git reset --hard HEAD~
git revert HEAD
git checkout '**'
git clean -df
git branch -D feature

Done

Прочитать

https://git-scm.com/book/en/v2

https://git-scm.com/book/ru/v1