вторник, 29 апреля 2014 г.

How to по git. Для склеротиков.

Настройка Git клиента для идентификации пользователя:
git config --global user.name "Your Name"
git config --global user.email "your@email.address"
git config --global core.editor "your editor"
Инициализация репозитория в текущем каталоге:
git init
Создает репозиторий в указанном каталоге:
git init <directory>
Клонирование репозитория на локальную машину:
git clone <repo>
Добавить файл для идексации и следить за всеми изменениями в нем ( можно задавать по маске ):
git add <file>
Добавить каталог для индексации:
git add <directory>
Удалить файл из индексации ( можно задавать по маске ):
git rm <file>
Перенести или переименовать файл / каталог:
git mv <source> <destination>
Сделать "снапшот" всех выполненных изменений:
git commit -a -m "message"
Статус репозитория ( добавление, удаление, изменение файлов ):
git status
Показать историю коммитов:
git log
Показать только определенное количество коммитов:
git log -n <limit>
Показать историю коммитов по конкретному файлу:
git log <file>
Посмотреть различия между последним коммитом и текущими изменениями:
git diff
Просмотр всех различий между коммитами:
git diff <commit> <commit>
Посмотреть различия между коммитом и текущими изменениями:
git diff <commit> <file>
Посмотреть различия между коммитами для файла:
git diff <commit> <commit> <file>
Показать список всех файлов в основной ветке:
git ls-tree master -r --name-only
Работа с ветками

Список веток:
git branch
Создание ветки:
git branch <new_branch_name>
Безопастное удаление ветки, если не были сделаны изменения:
git branch -d <branch_name>
Удаление ветки, даже если были сделаны изменения:
git branch -D <branch_name>
Переименование текущей ветки:
git branch -m <rename_current_branch>
Переход к существующей ветке:
git checkout <branch_name>
Создание и переход к ветке:
git checkout -b <new_branch_name>
Слияние текущей ветки с указанной:
git merge <branch>
Откат изменений

Перейти на последний коммит ветки "master":
git checkout master
Откатить изменения во всех файлах до указанного коммита:
git checkout <commit>
Откатить изменения для конкретного файла до указанного коммита:
git checkout <commit> <file>
Сделать откат всех изменений выполненных в коммите, при этом создается новый коммит указывающий на откат изменений:
git revert <commit>
Отмена изменений до последнего коммита, а также сбрасывает индексацию для конкретного файла:
git reset HEAD <file>
Отмена изменений до последнего коммита и сбрасывает индексацию:
git reset --soft
Отмена изменений до последнего коммита, сбрасывает индексацию, а так же отменить любые изменения в рабочей директории:
git reset --hard
programming Удаляет файлы которые не были добавлены в репозиторий:
git clean -f
Удаляет файлы которые не были добавлены в репозиторий по указанному пути:
git clean -f <path>
Удаляет файлы и каталоги которые не были добавлены в репозиторий:
git clean -df
Только показывает, что будет удаленно:
git clean -n
Работа с удаленными репозиториями

Список соединений с удаленными репозиториями:
git remote
Добавить соединение:
git remote add <name> <url>
Удалить соединение:
git remote rm <name>
Переименовать соединение:
git remote rename <old_name> <new_name>
Получить изменения из репозитория со списком всех веток ( при этом стираются любые локальные изменения ):
git fetch <remote>
Получить изменения из репозитория для конкретной ветки ( при этом стираются любые локальные изменения ):
git fetch <remote> <branch>
Получить копию текущей ветки с удаленного репозитория и слить ее с локальной копией:
git pull <remote>
Залить указанную ветку на удаленный репозиторий:
git push <remote> <branch>


Отдельно про git stash.
Удобно, занимаясь одним делом, «отложить» текущую работу в сторону и отвлечься, скажем, на срочное исправление бага, даже если он находится в другом бранче. После исправления и коммита можно преспокойно вернуться к начатому.
i. hack-hack-hack
ii. git stash
iii. fix-fix-fix
iv. git commit -a -m 'bugfix #31337'
v. git stash pop
Те же, кто знает про git stash, посмотрите на последнюю строку — её отличие от apply в том, что откладываемые результаты не остаются во временном хранилище (посмотрите git stash list после нескольких примений stash!)
Если изменение было фактически законченным, можно оформить коммит не отходят от кассы — git stash save 'commit msg' (взято с http://habrahabr.ru/post/75728/http://habrahabr.ru/post/137408/)
Отдельно про git bisect.
git bisect -  возможность бинарного поиска по коммитам. Для примера приведу следующую ситуацию. В нашем проекте поломался какой-то функционал, в чем конкретно проблема мы понять не можем, но точно знаем, что в прошлом релизе этот функционал точно работал. Так вот команда bisect позволяет нам легко откатить проект на заданное число коммитов и найти тот коммит, в котором неуловимый баг проявляется в первый раз.
Во-первых, запускаем механизм поиска и устанавливаем значение, что текущее состояние проекта нерабочее
git bisect start 
git bisect bad
Далее откатываемся на рабочее состояние проекта — на 10 коммитов назад по истории
git bisect good HEAD~10
Смотрим, проявляется ли этот баг в текущем состоянии. Допустим, сейчас с проектом все хорошо, поэтому продолжаем поиск дальше
git bisect good
Эта команда перематывает состояние проекта в середину, между хорошим коммитом и плохим, т. е. Сейчас мы находимся в пяти коммитах назад по истории. Если баг проявляется, то он находится до текущего коммита, если нет — то после. С каждой такой итерацией расстояние уменьшается в два раза, пока мы не находим плохой коммит (а главное — его автора, к сожалению, это его опять сделали мы).
После завершения поиска сбрасываем репозиторий в исходное состояние
git bisect reset )

2 комментария: