<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Записки &#187; VCS</title>
	<atom:link href="http://blog.nsws.ru/tag/vcs/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.nsws.ru</link>
	<description>Мысли о разработке</description>
	<lastBuildDate>Fri, 26 Aug 2011 07:55:13 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Более правильная работа с гит (git stash и git rebase)</title>
		<link>http://blog.nsws.ru/bolee-pravilnaya-rabota-s-git-git-stash-i-git-rebase.html</link>
		<comments>http://blog.nsws.ru/bolee-pravilnaya-rabota-s-git-git-stash-i-git-rebase.html#comments</comments>
		<pubDate>Sun, 27 Dec 2009 12:17:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[VCS]]></category>
		<category><![CDATA[Средства разработки]]></category>
		<category><![CDATA[тулзы]]></category>

		<guid isPermaLink="false">http://blog.nsws.ru/?p=149</guid>
		<description><![CDATA[Временами при работе с git одновременно нескольких человек возникают не очень красивые записи в журнале]]></description>
			<content:encoded><![CDATA[<p>Временами при работе с git одновременно нескольких человек возникают не очень красивые записи в журнале: &#8220;Merge branch &#8216;master&#8217; of ssh://&lt;usr&gt;@&lt;server&gt;/path/to/repo&#8221;, которые не несут особенно большого объема информации. Так, к примеру, посмотрев данный коммит в git-web мы не увидим никакой информации об измененных файлах. Такая ситуация возникает когда вы делаете git pull в вашей рабочей копии репозитория, в которую внесены изменения, при этом происходит авто merge.<span id="more-149"></span></p>
<h2>Git stash</h2>
<p>Для борьбы с такими записями существует специальная команда &#8211; git stash.</p>
<p>Команда git stash созраняет все не закомиченные изменения во временное хранилище (карман) и сбрасывает состояние ветки до HEAD.</p>
<ul>
<li>git stash &#8211; добавить текущие незакоммиченные изменения в стек изменений и сбросить текущую рабочую копию до HEAD’а репозитория;</li>
<li>git stash list &#8211; показать все изменения в стеке;</li>
<li>git stash show &#8211; показать последнее измененеие в стеке (патч);</li>
<li>git stash apply &#8211; применить последнее изменение из стека к текущей рабочей копии;</li>
<li>git stash drop &#8211; удалить последнее изменение в стеке;</li>
<li>git stash pop &#8211; применить последнее изменение из стека к текущей рабочей копии и удалить его из стека;</li>
<li>git stash clear &#8211; очистить стек изменений.</li>
</ul>
<p>То есть фактически необходимо вызвать следующую последовательность команд:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git stash
git pull
git stash apply
git add <span style="color: #660033;">-u</span>
git commit
git push
git stash drop</pre></div></div>

<h2>Git rebase</h2>
<p>При работе с несколькими ветками одновременно в конце концов возникает необходимость применить все изменения с одной ветки на базовую (ну конечно это возникает не всегда, но часто), причем, как правило, базовая ветка с тех пор успела поменять свое содержимое. В таких случаях для слияния веток рекомендуется использовать команду git rebase.</p>
<p>Данная команда сохраняет все ваши изменения на ветке, которые вы сделали с момента ответвления, и накладывает на эту ветку все изменения которые были сделаны на master ветке, после чего применяет все ваши изменения. Таким образом вы получаете ветку, которая ответвляется от текущей master-ветки и теперь вы можете успешно сделать git merge.</p>
<p>Пример использования:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git checkout feature1
git rebase master
git checkout master
git merge feature1</pre></div></div>

<h2>Литература:</h2>
<ol>
<li>git add &#8211;help</li>
<li>git rebase &#8211;help</li>
<li> http://evasive.ru/articles/git_kung-fu.html</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.nsws.ru/bolee-pravilnaya-rabota-s-git-git-stash-i-git-rebase.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Работа с git для начинающих</title>
		<link>http://blog.nsws.ru/rabota-s-git-dlya-nachinayushhix.html</link>
		<comments>http://blog.nsws.ru/rabota-s-git-dlya-nachinayushhix.html#comments</comments>
		<pubDate>Wed, 22 Jul 2009 07:19:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[VCS]]></category>
		<category><![CDATA[Новости]]></category>
		<category><![CDATA[тулзы]]></category>

		<guid isPermaLink="false">http://blog.nsws.ru/?p=123</guid>
		<description><![CDATA[git - это распределенная система контроля версий. Основные ее преимущества, лично для меня, распределенность и использование бинарных дифов, что упрощает работу с системой нескольких пользователей одновременно и упрощает хранение бинарных файлов, ресурсов.]]></description>
			<content:encoded><![CDATA[<p>Наверное не все знают, что такое git и с чем его едят.<br />
git &#8211; это распределенная система контроля версий. Основные ее преимущества, лично для меня, распределенность и использование бинарных дифов, что упрощает работу с системой нескольких пользователей одновременно, и упрощает хранение бинарных файлов, ресурсов.</p>
<p>git используется во многих крупных проектах: Linux kernel, KDE и многих  других.</p>
<p>Изначально git написал Linus Torvalds.</p>
<p><span id="more-123"></span></p>
<h2>Создание нового репозитория</h2>
<p>Создание нового репозитория &#8211; это наверное первая из задач, с которой сталкивается любой разработчик. К данной проблеме есть несколько подходов.</p>
<p>Во-первых, можно использовать только локальный репозиторий, но смысла особого я в этом не вижу.</p>
<p>Во-вторых, можно создать открытый репозиторий, с которым смогут работать другие люди. Рассмотрим этот вариант. Предположим, что у вас есть некий сервер <em>example.com</em> и ваша рабочая машинка.</p>
<p>Для начала вам необходимо установить git. Сделать это можно как вручную скомпилировав его из исходных кодов, так и установив с помощью менеджера пакетов. Будем считать что с этой операцией вы уже справились.</p>
<p>Далее вам надо создать репозиторий. Предположим что вы будете хранить все git-репозитории в /var/git:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>git
<span style="color: #c20cb9; font-weight: bold;">mkdir</span> example.git
<span style="color: #7a0874; font-weight: bold;">cd</span> example.git
git init <span style="color: #660033;">--bare</span></pre></div></div>

<p>Теперь у вас есть пустой git-репозиторий. Это, собственно говоря, все команды, которые требуется выполнить на сервере.</p>
<p>Теперь идем на вашу рабочую машину и пишем:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git init
git remote add origin <span style="color: #c20cb9; font-weight: bold;">ssh</span>:<span style="color: #000000; font-weight: bold;">//</span>username<span style="color: #000000; font-weight: bold;">@</span>example.com<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>git<span style="color: #000000; font-weight: bold;">/</span>example.git
<span style="color: #c20cb9; font-weight: bold;">touch</span> changelog
git add changelog
git commit <span style="color: #660033;">-a</span> <span style="color: #660033;">-m</span><span style="color: #ff0000;">&quot;Initital commit&quot;</span>
git push origin master</pre></div></div>

<p>Этими командами мы создали новый репозиторий, связали его с основной веткой example.git, закомитили туда файл changelog и отослали это на сервер. В результате выполнения этих команд, вы должны увидеть чтото примерно такое:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Counting objects: <span style="color: #000000;">3</span>, done.
Writing objects: <span style="color: #000000;">100</span><span style="color: #000000; font-weight: bold;">%</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">3</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">3</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>, <span style="color: #000000;">224</span> bytes, done.
Total <span style="color: #000000;">3</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>delta <span style="color: #000000;">0</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>, reused <span style="color: #000000;">0</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>delta <span style="color: #000000;">0</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
To <span style="color: #c20cb9; font-weight: bold;">ssh</span>:<span style="color: #000000; font-weight: bold;">//</span>username<span style="color: #000000; font-weight: bold;">@</span>example.git<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>git<span style="color: #000000; font-weight: bold;">/</span>example.git
 <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>new branch<span style="color: #7a0874; font-weight: bold;">&#93;</span>      master -<span style="color: #000000; font-weight: bold;">&amp;</span>gt; master</pre></div></div>

<h2>Получение и оправка репозитория</h2>
<p>Разумеется, после создания репозитория разумно узнать &#8220;а как же получить эти данные на свой компьютер?&#8221;.</p>
<p>Для данной операции используется команда clone. Она создает полную копию удаленного репозитория у вас. Под полной копией понимается именно полная копия, со всеми ветками, удаленными файлами и т.д.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git clone <span style="color: #c20cb9; font-weight: bold;">ssh</span>:<span style="color: #000000; font-weight: bold;">//</span>username<span style="color: #000000; font-weight: bold;">@</span>example.com<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>git<span style="color: #000000; font-weight: bold;">/</span>имя-репозитория</pre></div></div>

<p>Разумеется, /var/git может меняться, в зависимости от того, где располагаются файлы данного репозитория на удаленной машине.</p>
<h2>Обновление данных</h2>
<p>С таким локальным репозиторием можно работать долгое время, однако, когда-то у вас все же возникнет необходимость передать сделанные вами изменения в удаленный репозиторий, чтобы результатами вашего труда могли воспользоваться другие участники разработки, и получить из удаленного репозитория новую версию. Для этого служат команды pull и  push.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git pull</pre></div></div>

<p>Данная команда получает обновленную версию из удаленного репозитория, при этом она проверяет на наличие различных проблем при объединении репозиториев и сообщает об этом.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git push</pre></div></div>

<p>Данная команда целиком передает все сделанные вами изменения, уже закомиченные в локальный репозиторий, в удаленный репозиторий. Для передачи тегов необходимо использовать аргумент &#8211;tags</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git push <span style="color: #660033;">--tags</span></pre></div></div>

<h2>Базовые операции</h2>
<p>Для базовой работы с любой системой контроля версий требуется не особенно большой набор операций: добавление файла в репозиторий, удаление файла из репозитория, комит изменений в репозиторий, отмена незакомиченных изменений и получение списка изменений.</p>
<p>Добавление списка файлов в комит:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"> git add file1 file2 ... fileN</pre></div></div>

<p>Добавление всех недобавленных файлов в комит:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git add <span style="color: #660033;">-a</span></pre></div></div>

<p>Удаление файла из комита:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"> git <span style="color: #c20cb9; font-weight: bold;">rm</span> file1 file2 ... fileN</pre></div></div>

<p>Удаление файла из комита и с жесткого диска:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git <span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-f</span> file1 file2 ... fileN</pre></div></div>

<p>Комит в локальный репозиторий (надо отметить, что в таком случае закомитятся только файлы, которые были обработаны с помощью git add/rm):</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git commit</pre></div></div>

<p>Комит всех изменений в локальный репозиторий:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git commit <span style="color: #660033;">-a</span></pre></div></div>

<p>Отмена всех изменений, сделанных в дереве, до состояния, которое было при последнем комите в локальный репозиторий( очень опасная команда, подумайте прежде чем пользоваться ею):</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git reset <span style="color: #660033;">--hard</span></pre></div></div>

<p>Создание дифа относительно последнего комита:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git <span style="color: #c20cb9; font-weight: bold;">diff</span></pre></div></div>

<h2>Использование веток</h2>
<p>Рано или поздно в любом проекте возникает ситуация, когда требуется заморозить изменения, но продолжать работать, а на замороженные изменения накладывать только баг-фиксы. Для этой цели служат ветви (branch)</p>
<p>В гите можно создать ветку от любого места. Для создания ветки от основного дерева надо выполнить следующую команду:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git checkout <span style="color: #660033;">--track</span> <span style="color: #660033;">-b</span> name_of_newbranch origin<span style="color: #000000; font-weight: bold;">/</span>master</pre></div></div>

<p>В результате этой команды вы увидите примерно такое сообщение:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Branch name_of_newbranch <span style="color: #000000; font-weight: bold;">set</span> up to track remote branch refs<span style="color: #000000; font-weight: bold;">/</span>remotes<span style="color: #000000; font-weight: bold;">/</span>origin<span style="color: #000000; font-weight: bold;">/</span>master.
Switched to a new branch <span style="color: #ff0000;">&quot;name_of_newbranch&quot;</span></pre></div></div>

<p>Это значит, что в локальном репозитории у вас создалась новая ветка.</p>
<p>Если в этой команде заменить <em>origin/master</em> на <em>origin/remote_branch_name</em> то вы создадите ветку от другой ветки.</p>
<p>Чтобы ваша ветка была видна всем, ее требуется пропихнуть в удаленный репозиторий. Делается это так:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git push origin local_branch_name:remote_branch_name</pre></div></div>

<p>Разумеется, надо также уметь и получать ветки в свое распоряжение:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git branch local_branch_name origin<span style="color: #000000; font-weight: bold;">/</span>remote_branch_name
git checkout local_branch_name</pre></div></div>

<p>В результате вы получите искомую ветку после следующего сообщения:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Switched to branch <span style="color: #ff0000;">&quot;local_branch_name&quot;</span></pre></div></div>

<h2>Работа с тегами</h2>
<p>Как правило, кроме веток разработчики используют теги &#8211; чтобы запомнить состояние кода в какой-то момент. Тег &#8211; это своеобразный слепок, точно идентифицирующий состояние кода. Гит умеет работать с подписанными GPG тегами и с неподписанными. Здесь я рассмотрю только неподписанные теги.</p>
<p>Для создания такого тега необходимо выполнить команду:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git tag</pre></div></div>

<p>Чтобы убрать тег необходимо  выполнить:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git tag <span style="color: #660033;">-d</span></pre></div></div>

<p>Для того, чтобы тег стал виден всем, необходимо отправить его в удаленный репозиторий:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git push <span style="color: #660033;">--tags</span></pre></div></div>

<p>Чтобы получить версию с конкретного тега необходимо создать от него локальную ветку и расчекаутить эту ветку:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git fetch origin tag 
git branch  
git checkout</pre></div></div>

<p>Разумеется, в будущем эту ветку можно будет сделать глобальной и выслать в удаленной репозиторий.</p>
<h2>Настройка git</h2>
<p>Для ускорения некоторых операций и увеличения удобства работы можно провести пару настроек:</p>
<p>Настройка цветного вывода:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git config <span style="color: #660033;">--global</span> color.ui <span style="color: #ff0000;">&quot;auto&quot;</span></pre></div></div>

<p>Настройка имени пользователя и почтового адреса (между прочим, это хороший тон):</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git config user.name <span style="color: #ff0000;">&quot;FirstName LastName&quot;</span>
git config user.email <span style="color: #ff0000;">&quot;user@example.com&quot;</span></pre></div></div>

<p>Ускоряем дифы и отменяем ограничение на количество потоков упаковки при push:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git config <span style="color: #660033;">--global</span> diff.renamelimit <span style="color: #ff0000;">&quot;0&quot;</span>
git config <span style="color: #660033;">--global</span> pack.threads <span style="color: #ff0000;">&quot;0&quot;</span></pre></div></div>

<h2>Вместо заключения</h2>
<p>Git &#8211;  очень мощная и удобная система контроля версий. Для нее существует несколько GUI утилит, которые могут облегчить работу, несколько веб интерфейсов для мониторинга текущего состояния. В последнее время все большее кол-во проектов переходят на использование git, и это показатель того, что git успешно развивается и соответствует последним требованиям в области систем контроля версий.</p>
<p>Большое кол-во  документации по использованию git можно найти в сети, в том числе и на <a href="http://git-scm.com/" target="_blank">официальном сайте</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nsws.ru/rabota-s-git-dlya-nachinayushhix.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

