Шпаргалка по git. Пошаговое руководство: как выполнить слияние веток в git, как создать новую ветку и репозиторий, как выписать ветку с github и т.п. Инструкции по git для начинающих.
Git – это распределенная система контроля версий. Это главное отличие git от svn. Каждый разработчик создает на своем компьютере отдельный, полноценный репозиторий.
В рамках этого репозитория можно делать все тоже самое, что и обычно в svn – создавать ветки, просматривать изменения, выполнять коммиты. Для того, чтобы можно было работать с удаленными репозиториями и обмениваться изменениями с другими разработчиками, в git есть две команды, не имеющие аналогов в svn – git push и git pull.
git push – вливание локальных изменений в удаленный репозиторий. git pull – вливание изменений из удаленного репозитория в локальный. Обмен данными обычно происходит с использованием протокола SSH.
Git поддерживают несколько крупных репозиториев – GitHub, SourceForge, BitBucket и Google Code. Удобно использовать один из них в качестве основного хранилища для корпоративных проектов.
Как выписать репозиторий с github
- Создаем новую директорию для проекта project_name, переходим в нее.
- Выполняем команду:
1git clonegit@github.com:devlabuser/sharp.git./
“./” означает, что создать репозиторий нужно в текущей директории.
Результат: каталог с выписанной веткой master. Теперь можно создавать новые ветки, или выписывать с github существующие.
Как выписать ветку с github
С помощью команды “checkout” можно выписать уже существующую ветку с github:
1
2
|
$git checkout-bdev origin/dev
$git checkout-bproject_branch origin/project_branch
|
Или так, что намного надежнее:
1
|
$git checkout—track origin/production
|
Если вышеприведенные команды не сработали, выдали ошибку, и времени разбираться с ней нет, можно попробовать получить нужную ветку следующим способом:
1
2
|
git checkout-bproject_branch
git pull origin project_branch
|
Т.е. сначала мы создаем новую ветку, а затем вливаем в нее изменения из ветки на github.
Как создать новую ветку в локальном репозитории
- Создаем новую ветку в локальном репозитории:
12$git checkout-bdevSwitched toanewbranch‘dev’
- Публикуем ее на github:
1234$git push origin devTotal0(delta0),reused0(delta0)Togit@github.com:devlabuser/sharp.git*[newbranch] dev->dev
Как переключиться на другую ветку в git
1
|
$git checkout project2_branch
|
Если вы случайно удалили какой-то файл, можно извлечь его из хранилища:
1
|
$git checkout readme.txt
|
Как посмотреть список веток
Команда “branch” позволяет посмотреть список веток в локальном репозитории. Текущая ветка будет помечена звездочкой:
1
2
3
|
$git branch
*dev
master
|
Как сделать commit
Создаем новую ветку, выполняем в ней нужные изменения.
- Список всех измененных и добавленных файлов можно просмотреть командой:
1$git status
- Подготавливаем коммит, добавляя в него файлы командой:
1$git add<file1><file2>...
Или удаляем устаревшие файлы:
1$git rm<file1><file2>... - Выполняем коммит:
1$git commit-m‘Комментарий к коммиту’
- Как правило, в репозитории существует две основные ветки – dev и master. Dev – общая ветка разработчиков и тестировщиков. Именно в нее добавляются все новые разработки перед очередным релизом. Master – ветка для выкладки продукта на боевые сервера.После коммита надо влить в нашу ветку изменения из ветки dev и master:
12$git pull origin dev$git pull origin master
Теперь наша ветка содержит изменения для проекта, и все последние изменения по другим задачам, которые успела внести команда.
- Переключаемся на ветку dev:
1$git checkout dev
- Вливаем в dev изменения из ветки проекта:
1$git merge project_branch
- Заливаем последнюю версию ветки dev на удаленный сервер:
123456789$git push origin devCounting objects:4,done.Delta compression using up to2threads.Compressing objects:100%(2/2),done.Writing objects:100%(3/3),286bytes,done.Total3(delta0),reused0(delta0)Togit@github.com:devlab/sharp.gitd528335..9a452d9 dev->dev
push может не пройти, потому что удалённый origin/dev обогнал локальную его копию.
Как решить конфликт бинарных файлов
Допустим, при слиянии с другой веткой git выдал ошибку. Команда git status возвращает информацию о конфликте:
1
2
3
4
5
6
7
8
9
10
11
12
|
$git status
...
Unmerged paths:
(use«git add <file>…»tomark resolution)
both modified: root/css/styles.css.gz
$git diff root/css/styles.css.gz
diff—cc root/css/styles.css.gz
index970c721,bc6d170..0000000
Binary files differ
|
Конфликтный файл является бинарным (это могут быть архивные файлы, изображения и т.п.), и решение конфликта стандартным способом, с помощью редактирования – не возможно.
Чтобы решить такой конфликт, надо просто выбрать – какая версия файла будет использоваться: ваша или из вливаемой ветки. Чтобы использовать свой вариант файла, вводим команду:
1
2
|
git checkout—ours binary.dat
git add binary.dat
|
Если мы выбираем версию из вливаемой ветки:
1
2
|
git checkout—theirs binary.dat
git add binary.dat
|
“ours” – от английского “наш”, “theirs” – от английского “их”.
Как посмотреть историю изменений
git log – просмотр логов.
1
2
3
4
5
6
7
8
9
10
11
12
|
$git log
commit9a452d9cdbdb57e7e4f2b09f8ce2f776cd56657a
Author:DevLab User<user@mail.ru>
Date: Wed Jul3118:35:472013+0400
first commit
commit d528335724dfc15461996ed9d44d74f23ce6a075
Author:DevLab User<user@mail.ru>
Date: Wed Jul3106:24:572013-0700
Initial commit
|
Вывод данных о каждом коммите в одну строку:
1
2
3
4
|
git log—pretty=oneline
9a452d9cdbdb57e7e4f2b09f8ce2f776cd56657afirst commit
d528335724dfc15461996ed9d44d74f23ce6a075 Initial commit
|
Для вывода информации git log использует просмотрщик, указанный в конфиге репозитория.
Поиск по ключевому слову в комментариях к коммиту:
1
2
|
$git log|grep-e«first»
first commit
|
Команда “git show” позволяет просмотреть, какие именно изменения произошли в указанном коммите:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
$git show99452d955bdb57e7e4f2b09f8ce2fbb6cd56377a
commit99452d955bdb57e7e4f2b09f8ce2fbb6cd56377a
Author:DevLab User<user@mail.ru>
Date: Wed Jul3118:35:472013+0400
first commit
diff—gita/readme.txtb/readme.txt
newfile mode100644
index0000000..4add785
—-/dev/null
+++b/readme.txt
@@-0,0+1@@
+Text
\No newline at endof file
|
Можно посмотреть построчную информацию о последнем коммите, имя автора и хэш коммита:
1
2
3
4
|
$git blame README.md
^d528335(devlabuser2013-07-3106:24:57-07001)sharp
^d528335(devlabuser2013-07-3106:24:57-07002)=====
|
git annotate, выводит измененные строки и информацию о коммитах, где это произошло:
1
2
|
$git annotate readme.txt
9a452d9c (DevLab User 2013-07-3118:35:47+0400 1)Text
|
Как сделать откат
- git log – просмотр логов, показывает дельту (разницу/diff), привнесенную каждым коммитом.
1234567891011commit9a452d9cdbdb57e7e4f2b09f8ce2f776cd56657aAuthor:devlabuser<user@mail.ru>Date: Wed Jul3118:35:472013+0400first commitcommit d528335724dfc15461996ed9d44d74f23ce6a075Author:devlabuser<user@mail.ru>Date: Wed Jul3106:24:572013-0700Initial commit
- Копируем идентификатор коммита, до которого происходит откат.
- Откатываемся до последнего успешного коммита (указываем последний коммит):
12$git reset—hard9a452d955bdb57e7e4f2b09f8ce2fbb6cd56377aHEAD isnow at9a45779first commit
Можно откатить до последней версии ветки:
12$git reset—hard origin/devHEAD isnow at9a45779first commit
После того, как откат сделан, и выполнен очередной локальный коммит, при попытке сделать push в удаленный репозиторий, git может начать ругаться, что версия вашей ветки младше чем на github и вам надо сделать pull. Это лечится принудительным коммитом:
1
|
git push-forigin master
|
Как выполнить слияние с другой веткой
git merge выполняет слияние текущей и указанной ветки. Изменения добавляются в текущую ветку.
1
|
$git merge origin/ticket_1001_branch
|
git pull забирает изменения из ветки на удаленном сервере и проводит слияние с активной веткой.
1
|
$git pull origin ticket_1001_branch
|
git pull отличается от git merge тем, что merge только выполняет слияние веток, а pull прежде чем выполнить слияние – закачивает изменения с удаленного сервера. mergeудобно использовать для слияния веток в локальном репозитории, pull – слияния веток, когда одна из них лежит на github.
Создание нового локального репозитория
1
2
3
|
$mkdir project_dir
$cd project_dir
$git init
|
git cherry-pick
git cherry-pick помогает применить один-единственный коммит из одной ветки к дереву другой.
- Для этого нужно выписать ветку, в которую будем вливать коммит:
1git checkout master
- Обновить ее:
1git pull origin master
- Выполнить команду, указать код коммита:
1git cherry-pick eb042098a5
- После этого обновить ветку на сервере:
1git push origin master
Как раскрасить команды git
После создания репозитория в текущей директории появится субдиректория .git . Она содержит файл config .
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
[core]
repositoryformatversion=0
filemode=true
bare=false
logallrefupdates=true
[remote"origin"]
fetch=+refs/heads/*:refs/remotes/origin/*
url=git@github.com:devlab/sharp.git
[branch"master"]
remote=origin
merge=refs/heads/master
[branch"dev"]
remote=origin
merge=refs/heads/dev
|
Чтобы раскрасить вывод git, можно добавить в файл блок [color]:
1
2
3
4
5
6
|
[color]
branch=auto
diff=auto
interactive=auto
status=auto
ui=auto
|