<?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>Perlover&#039;s Blog &#187; editors</title>
	<atom:link href="http://blog.perlover.com/tag/editors/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.perlover.com</link>
	<description>Blog about Unix, Perl, Firefox, JavaScript and other internet technologies</description>
	<lastBuildDate>Fri, 20 Jan 2012 15:23:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Git &#8212; начинаем работать :)</title>
		<link>http://blog.perlover.com/2011/09/06/git-start-up/</link>
		<comments>http://blog.perlover.com/2011/09/06/git-start-up/#comments</comments>
		<pubDate>Tue, 06 Sep 2011 13:22:03 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[editors]]></category>
		<category><![CDATA[Examples]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[Автоматизация труда]]></category>
		<category><![CDATA[Контроль Версий]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=1369</guid>
		<description><![CDATA[Итак, продолжаю группу статей, посвязенных Git &#8212; одному из замечательных инструментов по управлению версиями текстовых файлов, а еще более точно &#8212; исходных программных текстов. Этот пост предназначен для тех, кто приступает только работать на Git. Все нижесказанное будет предназначено для Unix окружения и оболочки Bash. Заходим в Unix, где есть bash &#38; git Для начала [...]]]></description>
			<content:encoded><![CDATA[<p>Итак, продолжаю <strong><a title="Группа статей про GIt от Perlover" href="http://blog.perlover.com/tag/git/">группу статей, посвязенных Git</a></strong> &#8212; одному из <strong>замечательных инструментов по управлению версиями</strong> текстовых файлов, а еще более точно &#8212; исходных программных текстов.</p>
<p>Этот пост <strong>предназначен для тех</strong>, кто <strong>приступает только работать на Git</strong>. Все нижесказанное будет предназначено для Unix окружения и оболочки Bash.</p>
<ol>
<li><strong>Заходим в Unix</strong>, где есть bash &amp; git<span id="more-1369"></span></li>
<li>Для начала работ с git <strong>отконфигурируем его глобальные настройки</strong> для того пользователя, под которым мы будем работать, то есть под себя:
<pre class="brush: bash; title: ; notranslate">
git config --global user.name &quot;Your nickname/name&quot;
git config --global user.email &quot;your@email.com&quot;
git config --global i18n.commitEncoding utf8
git config --global status.showUntrackedFiles all
</pre>
<p>Здесь по строкам: 1 &#8212; указываем своё имя, будет видно в логах истории (git log); 2 &#8212; ваш email, будет видно там же; 3 &#8212; вы указываете, в какой кодировке будете писать комментарии к коммитам (commits), рекомендую UTF-8, а значит, надо, чтобы ваш терминал с Unix был в той же кодировке (если всё сделаете правильно &#8212; с русскими буквами проблем не будет, даже если кто-то будет писать commit в windows-1251 кодировке &#8212; git умеет конвертировать их прозрачно); 4 &#8212; весьма полезная опция &#8212; рекомендую поставить (см. последний пример) <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </li>
<li><strong>Создание репозитария</strong> (&#171;репо&#187;, repo). Можно взять <strong>готовые исходники</strong>, которые вы хотите начать отслеживать git-ом, тогда:
<pre class="brush: bash; title: ; notranslate">
cd корень_исходников
git init
# теперь появится папка .git/
</pre>
<p>Либо, можете <strong>склонировать чей то проект</strong> для дальнейших правок, например так:</p>
<pre class="brush: bash; title: ; notranslate">
cd папка_где_будет_папка_исходников
git clone sshuser@ssh.host.com:where/git/repo/project.git
# Теперь будет папка project
</pre>
</li>
<li>Если вы хотите <strong>хранить репозитарий так, чтобы вы или кто-то другой могли его клонировать и закачивать туда</strong>, можете поступать так:
<ul>
<li>Если вы проект откуда то уже до этого клонировали, то &#171;закачка&#187; обратно делается просто:
<pre class="brush: bash; title: ; notranslate">git push</pre>
<p>Правда, одно условие &#8212; оригинальное место, откуда проект скачивали, должно быть read-write доступа. Обычно, общедоступные проекты лежат в read-only доступе.</li>
<li>Если вы <strong>проект только создали</strong>, то вам надо сделать:
<ol>
<li>Создать место, где будет храниться. Самый простой и надежный способ &#8212; <strong>создание отдельного Unix аккаунта</strong> для этого:
<pre class="brush: bash; title: ; notranslate">useradd mygit # Linux вариант</pre>
</li>
<li><strong>Очень рекомендую</strong> положить ваши ssh ключи в <em><strong>~/.ssh/authorized_keys</strong></em>, чтобы не вводить каждый раз пароль при запуске на удаленной машине:
<pre class="brush: bash; title: ; notranslate">man sshd # смотрим раздел &quot;AUTHORIZED_KEYS FILE FORMAT&quot;</pre>
</li>
<li>Из вашего репозитария, что вы проинициализировали <em><strong>git init</strong></em> сделать <strong>bare репозитарий</strong> &#8212; репозитарий, где нет будет рабочего дерева директорий с исходниками, а будет лишь база git со всеми версиями:
<pre class="brush: bash; title: ; notranslate">
cd our_project_before_git
git init # Теперь появилась .git папка с базой, но репозитарий не bare - не годится для всех
git clone --bare . ../our_project.git # Теперь выше мы создаем bare директорию
cd ..
scp -r our_project.git mygit@host.com:our_project.git # закачиваем на хост, откуда потом мы и другие будут забирать его
</pre>
</li>
<li>Теперь на удаленном хосте желательно <strong>аккаунт mygit ограничить доступом только по git</strong>:
<pre class="brush: bash; title: ; notranslate">echo /usr/bin/git-shell &gt;&gt;/etc/shells
# Уточните точный путь до git-shell
vipw
# там меняем shell у пользователя mygit на:
# /usr/bin/git-shell
# Можно указать shell сразу при создании пользователя через &lt;useradd&gt;</pre>
</li>
<li>Теперь, чтобы ваш первоначальный репозитарий был закреплен за тем хостом + путь (mygit@host.com:our_project.git) у вас есть два пути:
<ol>
<li><strong>Либо добавить</strong> хост и путь репо как remote origin командой:
<pre class="brush: bash; title: ; notranslate">git remote add origin mygit@host.com:our_project.git
# более подробно - смотрите man git-remote</pre>
</li>
<li><strong>Либо склонировать из удаленного</strong> залитого репозитария в новую директорию, а старую можете удалить (первый способ, наверное, лучше)
<pre class="brush: bash; title: ; notranslate">mygit@host.com:our_project.git</pre>
</li>
</ol>
</li>
</ol>
</li>
</ul>
</li>
</ol>
<h3>Теперь, пройдемся в кратце еще раз по концепции git, о которой я рассказывал <strong><a href="/2010/11/22/git-starting/">ранее</a></strong>:</h3>
<p>Git хранит в своём репозитарии, который хранится в папке .git внутри корня вашего проекта, все файлы всех версий файлов. Точнее, их упакованные версии. Последние версии git иногда хранят дельты, но это редко. Засчет этого, git очень быстро работает, так как оперирует сразу полными версиями файлов, основываясь на иерархии commit-ов. Каждый commit &#8212; &#171;снимок&#187; (правильнее &#8212; хеш SHA1) рабочей директории (точнее того, что добавлено в &#171;индекс&#187; при commit). То есть, не может быть одного и того же ID commit-в в мире, но с другим сожержимым, кроме вашего проекта именно с теми файлами.</p>
<p>Представьте себе иерархическое дерево, каждый узел которого может иметь одного и более &#171;родителей&#187; (parents), где есть &#171;конечные&#187; узлы, которые не являются родителем для какого либо узла &#8212; это &#171;концы&#187; ветки. Ветка в git &#8212; не что иное, как указатель на этот самый последний commit, которым все заканчивается. Когда вы делаете очередной commit, указатель ветки переназначается в новый последний commit, а предыдущий становится &#171;родительским&#187; для вновь созданного. Git, оперируя названиями веток, берет всегда от туда &#171;конечный&#187; commit, и далее по parents идет вверх по иерархии. У git есть очень гибкий синтаксис указания списка commit-ов через ветки и иерархические статусы узлов (parents, &#171;предков&#187;), а также через временным интервалы (например, что было сделано за последнюю неделю, например). Имена веток могут содержать &#8216;/&#8217; символ. Например: git diff feature/foo..master покажет изменения между веткой feature/foo и master, а если быть более точным &#8212; покажет изменения в commit-ах, которые недостежими в обоих ветках (то есть, если идти по иерархии от концов обеих веток вверх, то учитывать только те коммиты, которые есть только в одной их них. Если мы доходим до &#171;резвилки&#187;, то послее нее, разумеется, коммиты есть в обоих вариантах, и тогда поиск прекращается). По умолчанию принято, что <strong>default ветка</strong> в git имеет имя <strong>master</strong>. Часто, разработчики под ней выпускают релизные версии.</p>
<p>Но устройство git такого, что при работе с ним вам надо очень активно использовать ветвление &#8212; т.е. создавать свои ветки для новых &#171;фич&#187;, тестировать программу, и если все нормально &#8212; &#171;сливать&#187; с главной веткой. Это позволяет четко вести разрботку и разграничивать правки кода. Причем, создание веток вами идет локально &#8212; вы можете им давать любые имена, не опасаясь, что они пересекутся по названию с ветками других разрботчиков проекта &#8212; по умолчанию, новые имена веток хранятся в локальной копии репозитария и при &#171;push&#187; операциях это не затрагивается. Вы легко можете закачать новую ветку в удаленный репозитарий:</p>
<pre class="brush: bash; title: ; notranslate">git push origin my_new_branch:my_new_branch</pre>
<p>Либо даже удалить в удаленном репозитарии какую либо ветку:</p>
<pre class="brush: bash; title: ; notranslate">git push origin :my_new_branch</pre>
<p>Немного по этим двум примерам: синтаксис закачки/выкачки имеет формат src:dst, где src &#8212; имя ветки на source, dst &#8212; имя ветки на destination. То есть, если мы делаем push, то src &#8212; это имя ветки в нащем репозитарии, а dst &#8212; имя ветки в удаленном, а если мы делает :my_new_branch, то src &#8212; &#171;пусто&#187;, т.е. нет, а my_new_branch &#8212; имя удаленной ветки &#8212; то есть толкнуть &#171;нечто пустое&#187; куда-то &#8212; это значит &#171;удалить&#187;.</p>
<p>В git есть <strong>промежуточный слой между репозитарием и вашей рабочей директорией &#8212; индекс (index или stage)</strong>. Файлы, добавленные в индекс, в документации называются staged. Это поначалу может показаться непривычно, но потом это становится понятным. Это как бы &#171;фильтр&#187;, &#171;прослойка&#187;, между вашим проектом и репозитарием. Ведь проекты, почти всегда &#8212; это не просто исходними, но и служебные файлы, которые создаются при компиляции, тестировании и т.п.. Чтобы не тащить с собой в репозитарий весь &#171;этот мусор&#187;, который создается в директории проекта, и индивидуален для каждого разработчика проекта, git имеет этот index. Index &#8212; это тоже дерево файлов и директорий, но &#171;очищенное&#187;, и содержит в себе только то, что будет добавлено при очередном commit. Если git status показывает какой либо файл как untracked &#8212; значит того файла нет в индексе, и пока вы его специально не добавите git add, он не попадет в репозитарий. Для удобства можно делать git add . из корня проекта &#8212; добавить все, что не отслеживается, но тогда надо активно следить за файлами .gitignore!</p>
<p>Возьмите себе за правило активно использовать файл .gitignore (см. man gitignore). Этот файл указывает git-у, какие файлы надо исключать при работе и не добавлять в индекс! Эти файлы могут присутствовать в любой поддиректории проекта, и их действие распространяется либо на поддиректории той, где есть этот файл, либо только на файлы в этой &#8212; в зависимости, как описана маска файла. Например:</p>
<pre class="brush: plain; title: ; notranslate"># Это комментарий

# Исключать только Makefile.old из текущей директории!
/Makefile.old

# Исключать все файлы с расширением .o как в этой, так и в поддиректориях
*.o

# Исключать все txt файлы только в этой директории
/*.txt

# Исключать всю директорию build в текущей папке
/build/

#  Исключать все директории в этой и ниже с именем blib, файлы могут быть с таким именем
blib/
</pre>
<p>И еще парочка заметок. Git не хранит права файлов в репозитарии, за исключением &#8216;x&#8217; флага, и при клонировании все файлы имеют права либо 644, либо 755. Поэтому не делайте репозитариев, с расчетом на отдельные права некоторых файлов (например, права 600 или 700). Сначала это может кому-то не понравиться, потом привыкаешь. Для разработки проектов этого достаточно, так как все проекты по правильному делаются с двумя фазами &#8212; компиляция и инсталирование. Правильные права должны выставляться на последнем этапе дистрибутива. Также, любой клонированный репозитарий может быть репозитарием для другого, если вы это позволите &#8212; получается очень распределенная, несокрушимая система <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  К тому же, работа над каждым репозитарием не требует интернета &#8212; вы можете делать commit-ы в репозитарий на своем диске (вместо ssh хоста в моих примерах можно использовать обычные Unix пути), а если захотите, то при наличии интернета уже &#171;сливать&#187; коммиты в другой remote репозитарий (см. man git-remote, man git-push)</p>
<p>Вернемся к примерам в начале статтьи. Теперь мы имеем репозитарии, с которыми можно работать. Теперь несколько советов по работе</p>
<ol>
<li>Рекомендую прописать у себя в ~/.bash_profile такие команды, которые использую на основании своего опыта:
<pre class="brush: bash; title: ; notranslate">alias gitcommit='git commit -a'
alias gitdiff='git diff|less -S'
alias gitgraph='git log --graph --all --decorate|less -S'
alias gitremote=&quot;git remote show origin&quot;
alias gitlog='git log --decorate'
export LESS=S#4
</pre>
<p>Теперь пояснения:<br />
<strong> gitcommit</strong> &#8212; укороченная команда, когда вы делаете commit (принятие изменений, их фиксация в базе), так, чтобы перед commit были обновлены файлы из рабочего дерева в индекс, а также, чтобы те файлы, которые вы удалили, были также удалены в commit. При такой команде не попадают в commit те файлы, которые есть в рабочем дереве, но нет в индексе (из надо добавлять git add)<br />
<strong>gitdiff</strong> &#8212; просмотр изменений между рабочим деревом и индексом, но запускает less с опцией -S<br />
<strong>gitgraph</strong> &#8212; очень полезная командочка для просмотра &#171;дерева&#187; commit-ов и веток<br />
<strong> gitremote</strong> &#8212; смотрит в удаленный репозитарий origin (может быть несколько репозитариев в git &#8212; я сделал для широкоупотребимой ситуации) и показывает статус вашего репозитария в сравнении с удаленным<br />
<strong> gitlog</strong> &#8212; почти то же, что gitlog, но вместе с commit хешем показывается, если есть, имя версии ветки, которая заканчивается этим commit<br />
<strong>export LESS &#8230;</strong> &#8212; устанавливаем переменную, чтобы команда less работала наиболее удобным способом (см. man less)</li>
<li>Как правило, работа сводится к такому примерно списку команд:
<pre class="brush: bash; title: ; notranslate">cd my_project
# например, текущая ветка - master
git pull # вытащить, если есть, что-то новое из репозитария из ветки master

# не обязательно, но если вы работает в команде, лучше, чтобы ваша новая &quot;фича&quot; велась в отдельной ветке до ее окончания
git checkout -b new_branch
# теперь мы в new_branch
# редактируем как надо что либо

# Проверяем, что мы наделали, смотрим, появились ли новые файлы, которых нет в репозитарии (untracked)
# если есть untracked - думаем, либо добавлять их в репо,
# либо добавить в .gitignore, чтобы не маячили в глазах
# здесь нам пригодится настройка git config --global status.showUntrackedFiles all (см. начало статьи)
# без этой настройки новые целые директории не показываются пофайлово, а только как имя директории
git status

# опционально, если есть untracked файлы - можем добавить их, либо сразу директорию - как здесь - всё под '.'
git add .

# Если порядок наведен, тогда делаем commit:
# если есть alias из моих &quot;команд&quot;, тогда:
gitcommit
# либо на &quot;голом&quot; git:
git commit -a

# тестируем, проверяем, что наваяли, и если все OK, тогда...

# закидываем изменения либо нашей ветки &quot;новой&quot; с созданием оной там, что нежелательно, как правило:
git push origin new_branch:new_branch

# либо в master, не переключаясь с нашей new_branch, что нежелательно
git push origin new_branch:master

# А лучше сделать так:
# переключаемся обратно на master
git checkout master
# На всякий случаем тащим что-то новенькое - вдруг кто-то закинул новое, пока мы работали над new_branch
git pull
# Теперь объединяем изменения в new_branch с master, могут быть конфликты, если при последнем pull мы что-то получили новое
git merge new_branch
# если конфликты - смотрим git diff, правим file, помечаем как resolved (git add file), делаем git commit -a и т.п..
# Заливаем в репозитарий master уже с нашими изменениями
git push
</pre>
</li>
</ol>
<p>Пока всё. Думаю, этого вполне достаточно, чтобы стартануть для работы с git</p>
<p>P.S. Также можете почитать:</p>
<ol>
<li><strong><a href="http://progit.org/book/ru/" target="_blank">Книга &#171;Pro Git&#187; на русском</a>, в переводе (каждый может помогать в переводе через ее git репозитарий <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> )</strong></li>
<li><strong><a href="http://rb.labtodo.com/page/rasproboval-git" target="_blank">Сравнение Git с SVN</a> от Ruslan Brest</strong></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2011/09/06/git-start-up/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>git &#8212; краткое введение</title>
		<link>http://blog.perlover.com/2010/11/22/git-starting/</link>
		<comments>http://blog.perlover.com/2010/11/22/git-starting/#comments</comments>
		<pubDate>Mon, 22 Nov 2010 08:22:18 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[editors]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[RCS]]></category>
		<category><![CDATA[Revision Control System]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[VCS]]></category>
		<category><![CDATA[Version Control System]]></category>
		<category><![CDATA[Автоматизация труда]]></category>
		<category><![CDATA[Контроль Версий]]></category>
		<category><![CDATA[сисадминам]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=1022</guid>
		<description><![CDATA[Давненько уже работаю с такой классной штукой, как git. Git &#8212; это программа для контроля версий программ. В дальнейшем я планирую публиковать статейки, связанные с этой темой. Но чтобы как-то начать это, решил написать этот пост &#8212; краткое ознакомление с ней.Git написан Линусом Торвальдсом &#8212; автором Linux. Эта программа относится к классу программ контроля версий. [...]]]></description>
			<content:encoded><![CDATA[<p>Давненько уже работаю с такой классной штукой, как git. <strong>Git &#8212; это программа для контроля версий программ.</strong> В дальнейшем я планирую публиковать статейки, связанные с этой темой. Но чтобы как-то начать это, решил написать этот пост &#8212; краткое ознакомление с ней.<span id="more-1022"></span>Git написан Линусом Торвальдсом &#8212; автором Linux. Эта программа относится к классу программ контроля версий. К этому же классу относятся такие же программы, как SVN (Subversion) , CVS. Хотя в интернете и бытует мнение, что git сложнее, чем SVN, но мне показалось все иначе. Например, чтобы что-то делать с проектом в SVN, надо часто использовать команды из командной строки на каждое удаление, добавление файла  и т.п.. С git проще &#8212; вы просто работаете с файлами любыми средствами, а затем с помощью нескольких команд можно увидеть изменения и выполнить сразу добавление или удаление файлов пачками.</p>
<h2>Давайте сначала поймем, зачем он вам нужен.</h2>
<p><strong>Если вы один программист</strong>, то вот преимущества git перед ситуацией, когда вы его не используете:</p>
<ol>
<li>В одном репозитарии (условно &#8212; одна папка) у вас хранится сразу вся история проекта с разными версиями. Вы можете создавать экспериментальные ветки, в случае успешного кода их затем объединять в стабильные ветки. <strong>Можно легко переходить в &#171;прошлое&#187;.</strong> Например, можно быстро устранить баг в стабилной версии, а затем продолжать работать в экспериментальной альфа-версии.</li>
<li><strong>Легко просматривать, что вы изменили </strong>вчера и сейчас. Удобно, когда вы приходите утром на работу и хотите вспомнить, на чем же вы остановились.</li>
<li>Заодно &#8212; git, выходит само собой, <strong>удобное средство резервирования и синхронизации</strong>. Вы можете разместить репозитарий на сервере, и с него подтягивать дома рабочие файлы, которые делали на работе,  а после правок заливать изменения обратно.</li>
<li>В git &#8212; <strong>каждый клонированный репозитарий </strong>- не только рабочая площадка, но также и <strong>полноценный репозитарий</strong>. Если вы работали на ноутбуке, а сегодня накрылся ваш сервер с репозитарием, то ваша локальная версия на ноуте &#8212; опять же, репозитарий со всей &#171;историей&#187;.</li>
<li><strong>Для git не надо online </strong>- вам достаточно &#171;подтянуть&#187; с сервера изменения, если были, и отключить ноутбук от интернета. Затем, работайте хоть в самолете! Делайте коммиты, пишите и просматривайте, что вы изменили. Только лишь, когда вы захотите &#171;сбросить&#187; все изменения в ваш главный репозитарий, только тогда вам нужен инет.</li>
</ol>
<p><strong>Если же вы команда</strong>, то преимущества те же, что выше, но также <strong>к ним добавляется возможность легкого ведения группового проекта</strong>. Самый замечательный пример, что все это отлично работает &#8212; ядро Linux &#8212; именно оно ведется Git-ом, и даже единичное увеличение подверсии ядра включает в себя большое количество commit-ов и работу большого количетва программистов.</p>
<p><strong>Git</strong>, по моему опыту, <strong>гораздо понятнее программисту, чем тот же SVN</strong>, и гораздо логичнее. Я долго не мог принять, что в SVN создание ветви &#8212; делается через копирование файла. Какая-то странная логика. Затем, когда я освоил git, мне куда понятнее, что создание ветви &#8212; это создание нового узла дерева со своим parent или даже несколькими parent-ами. Обычнная иерархия, которая понятна не только программисту! Благодаря этому, очень легко прерывать проект и делать ответвления новый подверсий, работать с ними и затем, например, объединять с другими ветками. Git &#8212; это как бы мощный diff с элементами иерархии (diff хорошоф знаком тем, кто работает с Unix).</p>
<h2>Что нужно четко понимать в git?</h2>
<p>Отличительная идеология git от многих других программ контроля версий &#8212; <strong>наличие index</strong>. Index &#8212; это &#171;промежуточный слой&#187; между вашим рабочим файловым деревом, и того, что должно быть добавлено в репозитарий. В репозитарий добавляется только то, что есть в индексе. А в индекс вы добавляете из рабочего дерева то, что необходимо добавить затем в репозитарий. Запутано, скажете вы? Когда вы начнете работать, вы поймете, что это очень даже логично! Именно эта &#171;фишка&#187; git поначалу у меня вызывала непонимание.</p>
<p><strong>Ветвление &#8212; одна из замечательных свойств git-а. </strong>Ветвить можно не просто разные версии программ, а даже по &#171;мелочи&#187;. Например, вы хотите добавить новую фичу в программу. Если вы начнете работать на текущей стабильной версии, вы рискуете создать ситуацию, когда в рабочей версии будет найден баг, вам надо будет быстро его исправить, а вы не закончили и не отладили проект с вашей новой фичей. Тем самым, попадете в затруднительную ситуацию. Выход из нее простой &#8212; создали подветку, делаете свою новую фичу. Если необходимо, вы можете быстро переключаться между ветками. Ветвление в git &#8212; не ресурсоемкий процесс. Им удобно пользоваться и даже нужно. Иначе использование git превратится в стрельбу из пушки по воробьям.</p>
<p>Также, сразу постарайтесь приучить себя к такому способу ведения проекта в git, как <strong>активное использование масок для игнорирования файлов. </strong>То есть, вы ведете проект, но в нем есть два типа файлов и директорий &#8212; условно назовем служебные и проектные. Служебные  &#8212; те, что создаются в процессе работы и нужны только для компиляции. Проектные &#8212; те, что должны отслеживаться git-ом, лежать в репозитарии, и являться частью проекта в целом. Служебные должны исключаться через файл <em>.gitignore</em> (man gitignore). Приучите себя сразу формировать этот файл, от рождения проекта, и постепенно, по мере работы, добавлять в него новые и новые файлы и маски. Этот файл также упростит вам жизнь с командами add &amp; status.</p>
<p>Также, при групповой работе надо знать, что <strong>git &#8212; не локирует файлы на время редактирования </strong>кем либо. Один и тот же файл могут править несколько программистов. Принцип тут такой &#8212; если изменения происходили в &#171;далеких&#187; местах друг от друга в файле, git их объединит автоматом, если же нет &#8212; будет создан конфликт, требующий ручного исправления кем либо.</p>
<h2>Еще несколько понятий и терминов.</h2>
<p><strong>Commit </strong>- это как бы фиксация изменений. Коммит имеет запись в истории &#8212; кто создал, когда, одну или несколько строк от автора изменений, что сделано. Также, можете просто предствавить &#8212; что commit &#8212; как бы снимок всей директории и файлов на тот момент.</p>
<p><strong>Diff </strong>- текстовые <strong>отличия в формате diff между ветками</strong>, commit-ами, файлами и т.п.. Формат его легко читаем и даже сразу понятен, если посмотреть на него &#8212; вы видите, что добавляли или удаляли и когда.</p>
<p><strong>Merge </strong>- объединение веток. Благодаря иерархии (что из чего следовало) и инструментам нахождения отличий (diff), <strong>git сам определяет, что было добавлено в код, что удалено</strong>, и на основе этих изменений он делает новые файлы в объединении. Но иногда может случиться так, что один и тот же файл в близких местах менялся в разных ветках. Вот тогда возникает конфликт (см. ниже)</p>
<p><strong>Conflict </strong>- конфликт. <strong>Если </strong>вы делали merge, и при этом <strong>возникли противоречия, git создает &#171;конфликт&#187;.</strong> Эта ситуация, когда файл с конфликтом помечается внутри базы git особым образом, в самом текстовом коде возникают текстовые метки типа &#8216;&lt;&lt;&lt;&lt;&#8217; или &#8216;&gt;&gt;&gt;&gt;&gt;&gt;&#8217; с кодами из обоих веток и от вас требуется ручное редактирование файла &#8212; устранение конфликта. Вам надо посмотреть эти метки в самом коде, решить, что правильнее, отредактировать, а потом дать понять git-у, что файл вы привели в норму (git add &#8230;). С бинарными файлами несколько иначе, но смысл тот же.</p>
<p><strong>Repository </strong>- репозитарий, то <strong>есть хранилище</strong>. Как уже говорил, любая копия может юыть репозитарием одновременно для кого либо. Вы можете сами для себя определить, где будет главная копия. Закачку и выкачку лучше всего осуществлять через ssh протокол. Делается просто &#8212; там где лежит репозитарий, он должен лежать под правами, скажем пользователя user. Тогда, чтобы вытянуть от туда, вам надо знать либо пароль user, либо иметь ssh ключ. А сама выкачка делается также просто, без всяких ssh команд: &#171;git clone user@therehost.com:git/myproject.git&#187;, например. А дальше, git запомнит адрес репозитария, и обмен данными превратится в две простые команды: &#171;git push&#187; и &#171;git pull&#187;. Если еще правильно организовать доступ по ssh ключам, то можно вообще не вводить пароли <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
Также, маленький нюанс &#8212; <strong>репозитарий может быть двух типов</strong>: bare и обычный. Обычный &#8212; это файловое дерево проекта + .git служебная директория, где все и хранится git-овское. А bare &#8212; это только файлы .git &#8212; там нет рабочей директории, и bare используется только для репозитариев с целью сохранения и взятия информации их них. Обычно, bare репозитариям дают суффикс &#8216;.git&#8217;. В остальном &#8212; работа синхронизации идентична.</p>
<p><strong>Если вы поставили </strong><a href="http://git-scm.com/" target="_blank"><strong>git на Unix</strong></a>, то все по нему можно узнать из man-ов: &#171;man git&#187;, или, например: &#171;man git-diff&#187; и т.п.. Все в нем делается через одну команду &#8212; git, а вторым параметром указывается сама команда. А сам &#171;мен&#187; по ней состоит из git и через дефис той команды, что вам нужна (список всех команд &#8212; man git).</p>
<p><strong>Также, есть <a href="http://code.google.com/p/msysgit/downloads/list" target="_blank"></a></strong><a href="http://code.google.com/p/msysgit/downloads/list" target="_blank"><strong>Windows версия</strong></a>, причем, в том числе с графической поддержкой, показывающей иерархии и изменения от одного commit-а к другому. Находится она здесь: <a href="http://code.google.com/p/msysgit/downloads/list" target="_blank">mSysGit</a> &#8212; там выбираете, например, msysGit-fullinstall-* самый свежий и ставите. Установка проста, как и все программы для Windows. Ленивые могут использовать только графическую оболочку, а продвинутым, пожалуй, будет интересен &#171;Git Bash&#187; из того же комплекта. Лично я предпочитаю работать в &#171;Git Bash&#187;, так как там привычная мощная оболочка bash со всеми ее плюсами (включая, кстати ssh-* команды).</p>
<h2>Заключение</h2>
<p><strong>Не ждите волшебства от git-а</strong>. Он, конечно, не додумает за вас программный код, когда вы объединяете две ветки в одну с разным кодом в одном месте. Но сделает свою работу максимально правильно, упростив вам жизнь.</p>
<p>Я, как программист-одиночка, сейчас уже сложно представляю себе работу  без git. <strong>Даже если  проект поддерживается одним человеком, git сильно облегчает жизнь. </strong>И это  не смотря на то, что все качества git-а раскрываются в групповой работе  над проектом. Самым лучшим примером будет то, что ядро Linux  поддерживается только через этот инструмент контроля версий. А ядро &#8212;  самая динамично-развивающаяся часть кода в мире Linux &#8212; над ней работают  сотни людей. А требования к ее надежности &#8212; самые высокие!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2010/11/22/git-starting/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Отличная документация Subversion на русском</title>
		<link>http://blog.perlover.com/2010/03/14/russian-doc-subversion-svn/</link>
		<comments>http://blog.perlover.com/2010/03/14/russian-doc-subversion-svn/#comments</comments>
		<pubDate>Sun, 14 Mar 2010 12:18:14 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[editors]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=741</guid>
		<description><![CDATA[Заинтересовался я сейчас изучением софта для контроля версий программ. Пока что я знаю, что CVS &#8212; старая и устаревшая платформа, SVN (Subversion) &#8212; современная, заменяющая CVS, и GIT &#8212; другая популярная система контроля версий. И встал вопрос, где и как изучить SVN (решил начать с неё). Английская дока &#8212; это, конечно, хорошо и правильно (термины [...]]]></description>
			<content:encoded><![CDATA[<p>Заинтересовался я сейчас изучением софта для контроля версий программ. Пока что я знаю, что <a href="http://ru.wikipedia.org/wiki/CVS" target="_blank">CVS</a> &#8212; старая и устаревшая платформа, <a href="http://ru.wikipedia.org/wiki/SVN" target="_blank">SVN</a> (Subversion) &#8212; современная, заменяющая CVS, и <a href="http://ru.wikipedia.org/wiki/GIT" target="_blank">GIT</a> &#8212; другая популярная система контроля версий. И встал вопрос, где и как изучить SVN (решил начать с неё). Английская дока &#8212; это, конечно, хорошо и правильно (термины часто не переводимы и меньше ошибок), но когда надо понять такой сложный программный комплекс за быстрое время, русская документация, как нельзя, кстати. И вот тут я нарыл отличную документацию SVN на русском &#8212; текст книги, <strong>изданной O&#8217;Reilly Media</strong>:</p>
<p><a title="Subversion дока на русском" href="http://svnbook.red-bean.com/nightly/ru/svn-book.html" target="_blank"><strong>SVN-документация одним файлом</strong> HTML для чтения (рекомендую)</a><br />
<a href="http://svnbook.red-bean.com/index.ru.html" target="_blank"><strong>Обобщенный список разных форматов</strong> этой книги</a></p>
<p>P.S. Если хотите знать, чем различаются и что чем лучше &#8212; Git или SVN &#8212; <a href="http://www.looble.com/git-vs-svn-which-is-better/" target="_blank">читайте здесь</a> и <a href="http://git.wiki.kernel.org/index.php/GitSvnComparison" target="_blank">здесь</a> (анг)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2010/03/14/russian-doc-subversion-svn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Кнопка «Read More» для WordPress</title>
		<link>http://blog.perlover.com/2009/11/24/read-more-butto/</link>
		<comments>http://blog.perlover.com/2009/11/24/read-more-butto/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 11:33:19 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Для Webmasters]]></category>
		<category><![CDATA[Начинающим]]></category>
		<category><![CDATA[editors]]></category>
		<category><![CDATA[webmaster]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=379</guid>
		<description><![CDATA[Только сегодня понял, как вставлять ссылки «Читать далее» в посты на главной странице сайта, через WordPress. До этого, я думал, что это делает какой-то плагин под WordPress, а выяснилось, что это делается с помощью кнопки, которая у меня под носом. Ее действие мне было трудно заметить, потому как в режиме «Просмотреть» действие этой кнопки мне [...]]]></description>
			<content:encoded><![CDATA[<p>Только сегодня понял, как вставлять ссылки «Читать далее» в посты на главной странице сайта, через WordPress. До этого, я думал, что это делает какой-то плагин под WordPress, а выяснилось, что это делается с помощью кнопки, которая у меня под носом. Ее действие мне было трудно заметить, потому как в режиме «Просмотреть» действие этой кнопки мне было не видно (просмотр черновика показывается «как есть»).</p>
<p>Итак, пишем пост, там, где хотим сократить свой пост для главной страницы, ставим курсор в желаемом месте разбивки, нажимаем кнопку <a href="http://blog.perlover.com/wp-content/uploads/2009/11/1.png"><img class="alignnone size-full wp-image-380" title="Кнопка &quot;Далее&quot;" src="http://blog.perlover.com/wp-content/uploads/2009/11/1.png" alt="Кнопка &quot;Далее&quot;" width="26" height="24" /></a> и вуаля! <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  На этом месте появится ссылка «Читать далее» для вашей текущей темы WordPress.</p>
<p>P.S. Этот пост получился очень коротким, так что такой ссылки в нем я решил не ставить <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2009/11/24/read-more-butto/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WordPress и кавычки</title>
		<link>http://blog.perlover.com/2009/11/17/angle-quotes-wordpress/</link>
		<comments>http://blog.perlover.com/2009/11/17/angle-quotes-wordpress/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 13:11:08 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[Add-ons]]></category>
		<category><![CDATA[GreaseMonkey]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Для Webmasters]]></category>
		<category><![CDATA[editors]]></category>
		<category><![CDATA[greasemonkey]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=300</guid>
		<description><![CDATA[При создании постов из WordPress я часто сталкивался с такой проблемой, как кавычки. Если я заключал слово в обыкновенные кавычки, то при публикации кавычки заменялись на угловые. Это делала тема WordPress, которую я использовал. Это вроде бы здорово! Но была проблема &#8212; часто кавычки заменялись на неправильные угловые &#8212; либо слово начиналось с &#8216;»&#8217;, либо [...]]]></description>
			<content:encoded><![CDATA[<p>При создании постов из WordPress я часто сталкивался с такой проблемой, как кавычки. Если я заключал слово в обыкновенные кавычки, то при публикации кавычки заменялись на угловые. Это делала тема WordPress, которую я использовал. Это вроде бы здорово! Но была проблема &#8212; часто кавычки заменялись на неправильные угловые &#8212; либо слово начиналось с &#8216;»&#8217;, либо заканчивалось &#8216;«&#8217;. Это меня жутко раздражало, но что делать я не знал. Правда нашел AddOn &#8212; <a href="https://addons.mozilla.org/en-US/firefox/addon/5314" target="_blank">Typograf</a>, но у него есть один жирный минус &#8212; он все ваши тексты отсылает на сервера авторов плагина для переделки. Я не думаю, что кому то это очень понравится, если он будет знать, что кто-то читает то, что он написал (ведь можно случайно и пароль отправить, и личный пост и т.п..)</p>
<p>Пришлось написать <a href="http://userscripts.org/scripts/show/62144" target="_blank">свой плагин</a>, только для <a href="http://blog.perlover.com/2009/10/30/greasemonkey-intro/" target="_blank">GreaseMonkey</a>. <span id="more-300"></span>Он довольно <strong>корректно</strong> заменяет обычные <strong>кавычки на угловые</strong> прямо в посте (надо только нажать на иконку <a href="http://blog.perlover.com/wp-content/uploads/2009/11/icon.png"><img class="alignnone size-full wp-image-302" title="icon" src="http://blog.perlover.com/wp-content/uploads/2009/11/icon.png" alt="icon" width="26" height="24" /></a>). Когда пост вы публикуете, уже нет авто-замены кавычек «темой» или WordPress-ом (не знаю точно, где это срабатывает). Тем самым, вы получаете более красивый пост, и с правильными угловыми кавычками <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Еще, что делает этот плагинчик &#8212; он заменяет три точки на один Unicode символ &#8216;…&#8217; (не знаю почему, но почему то многие автозаменялки делают именно это &#8212; мне и три точки нравятся <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> ), и два или три тире он заменяет на длинное Unicode тире.</p>
<p><strong>Для установки </strong>идем <a title="Угловые кавычки в WordPress" href="http://userscripts.org/scripts/show/62144" target="_blank">по ссылке</a>, там нажимаем кнопку «Install». Перед этим у вас должен стоять <a href="http://blog.perlover.com/2009/10/30/greasemonkey-intro/" target="_blank">GreaseMonkey</a> (я его рекомендую поставить всем &#8212; ресурсов много не ест, зато <a title="Здесь много скриптов для GreaseMonkey" href="http://userscripts.org/" target="_blank">много чего</a> можно в него поставить <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> )</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2009/11/17/angle-quotes-wordpress/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Чем редактировать XML?</title>
		<link>http://blog.perlover.com/2009/11/11/easy-xml-editor/</link>
		<comments>http://blog.perlover.com/2009/11/11/easy-xml-editor/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 09:56:58 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[editors]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=233</guid>
		<description><![CDATA[Не знаю, как у вас, но для меня большой проблемой было найти приемлемый XML редактор, чтобы и XML проверял, и бесплатный, не слишком навороченный, но чтобы данные можно было вводить, не беспокоясь об ескейпе симолов &#038;, <> и т.п...]]></description>
			<content:encoded><![CDATA[<p>Не знаю, как у вас, но для меня большой проблемой было найти приемлемый XML редактор, чтобы и XML проверял, и бесплатный, не слишком навороченный, но чтобы данные можно было вводить, не беспокоясь об ескейпе симолов &amp;, &lt;&gt; и т.п..</p>
<p>Для простых задач, например, для таких, когда настройки к какой либо программе надо указать с помощью XML конфиг файла, подойдет редактор <a href="http://www.microsoft.com/downloads/details.aspx?familyid=72d6aa49-787d-4118-ba5f-4f30fe913628&amp;displaylang=en" target="_blank"><strong>XML Notepad</strong></a>, который сделан ненавистной многими фирмой Micro$oft.</p>
<p>Лично я, пришел к выводу, что все редакторы XML либо слишком навороченные и платные, либо ненавороченные и не такие удобные, как XML Notepad. Не могу понять, почему такой популярный формат имеет такую низкую поддержку на уровне редактора&#8230; Наверное, может быть потому, что XML часто генерируется программами и ими же парсится, а редактировать ручками не так восстребованно. Но иногда очень надо, а пользоваться обычным текстовым редактором &#8212; глупо (постоянно следить за ескейпингом символов)</p>
<p><strong>Из плюсов</strong> нашего героя можно перечислить: простота, и понятность.</p>
<p><strong>Минусы</strong>: в нем можно настроить либо \r\n, либо \n символы концовки строки, миксовать он не умеет. Можно отключить Indent (имеет имя Auto Format в настройках, не мог сразу догадаться, что это именно Indent). Как то странно, IMHO. Еще один неприятный момент, но он лежит в нормальных рамках <a href="http://blog.perlover.com/2009/11/10/easy-about-utf8/">Unicode &amp; UTF-8</a> &#8212; он вставляет всегда символ <a href="http://en.wikipedia.org/wiki/Byte_order_mark" target="_blank">BOM</a> вначале документа. Символ этот нужен для Unicode, для <a href="http://blog.perlover.com/2009/11/10/easy-about-utf8/">UTF-8</a> он бесполезен. Скорее всего, это издержки того, что внутри Windows такой документ храниться в Unicode, а для него BOM часто необходим (он указывает процессору Unicode в каком порядке идут старшие и младшие байты 16 разрядной кодировки). Но, многие программы спокойно работают с BOM, так как он аннулируется UTF-8.</p>
<p><strong>Но плюсы перевешивают минусы</strong>. Если привыкнуть к этому редактору, то редактировать небольшие XML с ним очень просто.</p>
<p><strong>Краткое пояснение</strong>: редактор представляет собой, в общем плане, два окна &#8212; левое и правое. В левом &#8212; идут названия элементов, аттрибутов и псевдо-нод (например, #text &#8212; текстовый child, #comment &#8212; комментарий и т.п..). В правом &#8212; значения этих элементов, напротив тех, что слева. Если вам надо отредактировать готовый XML, например, какие либо настройки, и не менять структуру XML, то редактирование сводится к изменению только значений в правом окне (перемещаемся курсом вверх-вниз, нажимая <em>Enter</em> &#8212; редактируем, <em>Shift-Enter </em>- вставка новой строки в значении). Это очень удобно! А чтобы в правом окне были все значения, как на ладоне, достаточно сделать из меню <em>View -&gt; Expand All</em>, или <em><strong>Alt+V -&gt; Enter</strong></em> или <em><strong>Alt + V -&gt; E</strong></em>. После этого можно приступать к их редактированию.</p>
<p>Для удобства идеалогии редактирования, <strong>все строится </strong>на понятиях node и sibling (брат/сестра в переводе). Например, даже аттрибут елемента &#8212; это тоже node, у него есть parent &#8212; елемент, чьим аттрибутом он является. Из этого вытекает простое правило &#8212; для всех них существует две команды, через меню &#8212; вставка <strong>Before</strong> и <strong>After</strong>. Before &#8212; это вставить новый sibling перед текущим, выражаясь в понятиях DOM,  After &#8212; вставить после. Есть также третья команда &#8212; <strong>Child</strong> &#8212; вставить в текущую node.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2009/11/11/easy-xml-editor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

