вторник, 20 ноября 2012 г.

Git

Что есть Git
 http://ru.wikipedia.org/wiki/Git


Начало

Создать init репозиторий в текущем каталоге
git init 
Будет создан скрытый каталог .git, содежащий информацию о репозитарии. Однако git пока не отслеживает изменения в файлах каталога.
Их нужно добавить add в список отслеживания т.н. индекс:
git add <имя_файла_или_папки>
или
git add .
. - означает, что добавить необходимо все файлы которые есть.
Дополнительный параметр -i позволяет выбрать файлы для индексирования в интерактивном режиме.


Если репозиторий уже существует, например по адресу https://my@repo/myproject.git то его можно скопировать clone себе командой
git clone https://my@repo/myproject.git
Удалить rm файлы с диска
 git rm <файл>
Удалить файлы из индекса (отслеживания)
 git rm --cached <файл>
Git будет часто напоминать о не отслеживаемых файлах, в каталоге репозитория. Имена этих файлов можно добавить в спосок исключений:
.git\info\exclude - файл с описанием типов файлов и папок не включаемых в репозиторий

После того, как файлы репозитария были изменены нужно зафиксировать эти изменения в git.
зафиксировать commit сделанные изменения
git commit -am "примечание"
поместить push все изменения в главное хранилище
git push
достать pull из главного хранилища
git pull
 Наконец самый полезный параметр --help 
git <вот-об-этой-команде-я-и-хочу-что-то-узнать> --help


Коммиты (фиксации)

Сделать коммит.
git commit -am "примечание"
-a  сделать коммит для всех файлов, если необходимо - неявно выполнить git add и git rm, для новых файлов и удалённых соответственно
-m "note"  добавить комментарий к коммиту
log Показать историю коммитов
git log
Последнее выглядит куда приятнее если использовать текстовый интерфейс для Git под названием tig:

 

 

 

 

 

 

 

 

 

Редактирование коммитов 

 

Дополнить (--amend) коммит изменениями.
Если коммит был сделан преждевременно, то можно внести изменения и после и добавить их в него, не создавая нового:
git commit -a --amend

Удалить (reset) последний коммит (но не изменения) (--soft)
git reset --soft HEAD^

Удалить последний коммит и последние изменения (--hard)
git reset --hard HEAD^

Все коммиты имеют SHA1 хэш, например  9effa6ec863ea18823ca69bfae1d1f0ac610e544
Используя хэш можно обратиться к конкретному коммиту (вместо последнего HEAD^). Обычно требуется только первые 4 цифры хэша для идентификации коммита (здесь это 9eff).
Удалить reset все коммиты после заданного
git reset --hard <хэш_фиксации> [файл для которого будет выполнена команда]
Переключится checkout на определённый коммит
git checkout <хэш_фиксации> [файл для которого будет выполнена команда]
Вернуть файл на состоние последнего коммита
git checkout -- file.txt

 

Ветки

master - название основной ветки по-умолчанию.
посмотреть список веток branch
git branch
-a или --all - посмотреть список всех веток, в том числе и хранимых в главном хранилище.
Cоздать новую ветку. Ветка будет создана как копия текущей.
git branch <имя_ветки>
-d или --delete - удалить ветку
-m или --move переименовать ветвь, например
git branch -m <имя_ветки> <новое_имя_ветки>
переключится на ветку
git checkout <имя_ветки>
-b - с этим параметром переключение происходит вместе с созданием новой ветки


Конфликты

Если в ветках, слияние которых происходит редактировались одни и те же части файлов - происходит конфликт. Git, тем не мение, помещает все изменения в один и тот же файл, однако отделяет изменения активной ветки
и той, с которой происходит слияние таким образом
<<<<<<< HEAD 
изменения в текущей ветке
======= 
изменения ветки с которой происходит слияние
>>>>>>> d918d23958841041e2f75b9cbfafc93e9a9a1321 
Оставить "их" или "наш" файл:

git checkout --theirs -- path/to/conflicted-file.txt
git checkout --ours -- path/to/conflicted-file.txt

Алсо

head     ссылка на последнюю фиксацию в текущей ветке
HEAD     текущая ветка. точнее, ...
origin     главный репозиторий по-умолчанию. ...

рассказать о себе
git config --global user.name "Your Name"
git config --global user.email you@example.com
Если опустить ключ --global в вышеприведённых командах то изменения коснутся только данного репозитория.

***
Сделать слияние определённых файлов из разных веток - SO
 

Примеры

Создать репозиторий
git init
# смотрим что есть в папке
git status
# при желании добавляем в файл .git/info/exclude исключения, файлы (или каталоги) которые не должны отслеживаться гитом
git add .
git commit -am "..."
git checkout -b develop_branch
репозиторий уже есть...
git clone https://sotona@bitbucket.org/sotona/p.git
git checkout -b my_branch
# делаем  какие-нибудь изменения
git commit -am "какое нибудь информативное описание"[link]
# ещё несколько изменений-фиксаций
...
# теперь наконец-то есть чем похвалиться, зальём изменения (и заодно новую ветку) в главное хранилище.
git push origin rz_consts 
# ещё несколько фиксаций и выталкиваний (какое-то дурацкое слово)
...
# похоже в этой ветке все задуманные изменения сделаны и к тому же работают. Пора объединить её с главной (master) веткой 
git checkout master
git merge my_branch
# отлично, заливаем всё в главное хранилище
git push origin master

Типичный сценарий работы с git.
Предполагается, что существуют две ветки: master, где должна содержатся рабочая версия кода и develop - ветка, в которую вносятся изменения.

На ветке develop. Внести изменения в отслеживаемые файлы.
Зафиксировать изменения в git
git commit -am "комментарий к изменениям"
Убедится, что код с внесенными изменениями работает.
Переключится на ветку master и объединить её с develop.
git checkout master
git merge develop

Вернутся в ветку develop для внесения новых изменений.
git checkout develop

Git GUI


Ссылки

codeschool: git (интерактивное введение в git)
Правила хорошего тона при работе с git в многопользовательском окружении
Обзорные:
http://habrahabr.ru/post/60030/
http://habrahabr.ru/post/60347/
Отладка с помощью Git
Магия Git - хорошая онлайн-книга о Git
Немного отвлечённое
Стиль именования коммитов

Комментариев нет:

Отправить комментарий