Ранее: открыть первую часть конспекта с базовыми командами: http://rubyblog.ru/others/git/

Пуш в удалённую ветку:

git checkout -b feature_name
git push -u origin feature_name

Посмотреть содержимое последних 2 коммитов прямо в консоли:

git log -p -2

Рабочие ветки:

master  _____*___________*_____
hotfix  _____/          /
release __________*____*_______
develop ____*____/____/________
feature ___/

Переключиться на ветку, создав её:

git checkout -b hotfix

Посмотреть список веток:

git branch

Переключиться на ветку master и слить с hotfix, потом удалить hotfix:

git checkout master
git merge hotfix
git branch -d hotfix

merge conflict

git mergetool

difftool и mergetool инструменты

Обзор инструментов для визуального сравнения и разрешения конфликтов слияния / Хабр

KDiff3 - Homepage

Meld

Программист - это звучит гордо: Подружить git и meld за 5 минут

Конфигурация mergetool с meld linux:

sudo apt-get install meld
git config --global merge.tool meld
git config --list

Конфигурация mergetool с kdiff3 linux:

sudo apt-get install kdiff3
git config --global merge.tool kdiff3
git config --list

GUI Linux Git:

https://www.gitkraken.com/git-client

Git-cola:

https://git-cola.github.io/downloads.html

https://git-cola.github.io/share/doc/git-cola/hotkeys.html

sudo apt-get install git-cola
git-cola

https://gitignore.io/

https://help.github.com/en

Удаление файла из списка слежения:

git rm --cached foo.txt

Откатить антрекет файл к предыдущему состоянию:

git checkout -- foo.txt

Убрать из индекса файл:

git reset HEAD foo.txt

Help:

git help log

Log за последние 2 недели:

git log --since=2.weeks

Пушить все ветки:

git config --global push.default matching

git fetch

Забираем изменения из удалённого репозитория, но не меняет наши локальные файлы.

git fetch
git merge origin/develop

# как 

git pull

git show - изучить конкретный коммит

git log
git show e130422

git diff

Название веток:

git checkout -b feature/devise 
git checkout -b release/1.0

Gitflow

https://github.com/nvie/gitflow

sudo apt-get install git-flow

https://nvie.com/posts/a-successful-git-branching-model/

https://danielkummer.github.io/git-flow-cheatsheet/index.ru_RU.html

git flow init
git flow feature start foobar

git flow feature finish foobar
git flow release start 1.1

git flow release finish 1.1
git flow hotfix start 1.1.1

git flow hotfix finish 1.1.1

git tag

git tag 1.1.2

git push origin --tags

git checkout -b 1.1.2

aliases

git config --global alias.br branch
git config --global alias.p push
git config --global alias.co checkout
git config --global alias.m merge
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.type 'cat-file -t'
git config --global alias.dump 'cat-file -p'
git config --global alias.hist "log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short"

Удаление коммита:

git revert HEAD --no-edit

git rebase

git rebase не сохраняет последовательность коммитов, как при git merge

git rebase использовать для своих веток при разработке фич, но не рекомендуется использовать для публичных веток.

git rebase develop
git pull --rebase orign master

Помогает избегать конфликты. сначала скачает, потом накатит локальные изменения.

git stash

Временно убираем локальные изменения в крозину (коробку).

git stash
git pull --rebase orign master
git stash pop

В корзину можно складывать более одного изменения.

git stash list # show all stashes
git stash show # show last stash
git stash apply # apply last stash
git stash drop # delete last stash
git stash pop # apply and delete last stash
git stash clear # clear all stash

orign

git remote
git remote -v

NOTES:

man git log

Тег и отдаление на предыдущий коммит перед версией (^ - это родитель v1):

git tag v1
git checkout v1^
git tag v1-beta

Если мы внесли изменения в файл, но он ешё не в индексе, то можно откатить изменения файла до состояния текущего коммита:

git checkout hello.html

Отмена проиндексированных изменений (перед коммитом) - уже зелёный, но ещё не коммит:

git reset HEAD hello.html

Отменим индексацию изменений и откатим изменения:

git reset HEAD hello.html
git checkout hello.html

Отмена коммита путём создания нового коммита, отменяющего нежелательные изменения:

git revert HEAD

Удаление коммиттов из ветки

Предположим, что у нас есть тег v1, откатим к нему:

git reset --hard v1

Теперь коммиты в ветке master не видны, которые были после тега v1 (если были созданы теги позднее тега v1), но они не исчезли, их можно посмотреть:

git hist --all

Удалить тег:

git tag -d foobar

Изменить предыдущий коммит

git add foo.html
git commit -amend -m "Foo file edit" 

Перемещение файлов

mkdir bar
git mv foo.rb bar
git status
git commit -m "Moved foo.rb to bar"

Просмотр отличающихся веток:

git hist --all

merge vs rebase

Не использовать rebase:

  • если ветка является публичной и расшаренной, чтобы не мешать работе других программистов.
  • когда важна точная история коммитов ветки (rebase переписывает историю коммитов)

Использовать rebase для кратковременных локальных веток, а merge для веток в публичном репозитории.

Локальное клонирование репозитория

git clone foo foo_cloned

origin

git remote
git remote show origin

Посмотреть список удалённых веток:

git branch -a

Извлечение изменений из удалённого репозитория:

git fetch
git merge origin/master

Что равно:

git pull

Добавление локальной ветки для отслеживания удалённой ветки:

git branch --track foo origin/foo

Создание “чистого репозитория”:

Чистый репозиторий (без рабочих каталогов)

git clone --bare foo foo.git

Добавить чистый репозиторий в качестве удаленного репозитория к нашему оригинальному репозиторию:

В нашем оригинальном репозитории надо сделать:

git remote add shared ../foo.git

Отправка изменений в общий репозиторий:

git push shared master

Общим называется репозиторий, получающий отправленные нами изменения.

Извлечение общих изменений:

git remote add shared ../foo.git
git branch --track shared master
git pull shared master

Способ расшарить git репозиторий по сети

Запуск git сервера (в рабочей директории)

git daemon --verbose --export-all --base-path=.

Клонируем:

git clone git://localhost/foo.git foo_cloned

Расшарить репозитории по Wi-fi сети:

В Git Daemon, добавьте метку –enable=receive-pack к команде git daemon

Посмотрите, запущен ли git daemon у вашего соседа. Обменяйтесь IP-адресами и проверьте, сможете ли вы извлекать изменения из репозиториев друг друга.