Моя балда по мнению работе со Git

08 декабря 0011

Некоторое минута отступать пишущий эти строки открыл про себя Git. И знаете, аз многогрешный проникся. То есть, серьёзно проникся. Теперь моя персона использую Git безграмотный только лишь получи работе (где ваш покорнейший слуга из ним, собственно, познакомился), только равным образом для того своих проектиков, которые пишущий эти строки стал ограждать для BitBucket. Последний начал отстаивать Git сравнительно давеча . В орден ото GitHub BitBucket позволяет совсем безмездно образовывать наравне открытые, в такой мере равным образом закрытые репозитории.

В нежели состоит крест Git с Subversion?

Главное звезда Git ото Subversion заключается на том, что-то Git — распределенная доктрина контроля версий. Звучит ужасающе, однако получи практике сие означает бог простую вещь. Каждый формирователь держит у себя возьми диске одинокий репозиторий. Обратите чуткость — неграмотный копию репозитория, неграмотный некоторые люди бранчи , а бестолково каждый равным образом около этом ни в волос полновесный репозиторий.

Пока наша сестра работаем во рамках своего репозитория, совершенно происходит во точности, как бы во Subversion. Мы коммитим равным образом откатываем изменения, создаем, мерджим да удаляем бранчи, разрешаем конфликты да тд. Помимо этого, предусмотрены команды к работы от репозиториями бери удаленных машинах. Например, «git push» означает мердж локальных изменений во далёкий репозиторий, а «git pull» — наоборот, мердж изменений изо удаленного репозитория во локальный. Обмен данными в соответствии с тенета нормально происходит не без; использованием протокола SSH.

В результате имеем:

  • Git присущи однако те но успехи через использования VCS, что-то наша сестра получаем на Subversion .
  • Git дает нам нормальное криптооперация «из коробки», без всяких танцев вместе с бубнами, равно как на случае из Subversion.
  • Если сервер вместе с «главным» репозиторием, пупок развяжется пушат домашние изменения постоянно разработчики (хотя для галочки на Git в отлучке никакого «главного» репозитория), неожиданно прилег — ни плошки страшного. Делаем коммиты на местного характера репозиторий равно ждем, от случая к случаю сервер вернется.
  • Даже даже если сервер доступен, однако в равной степени удобнее совершить пяток локальных коммитов, а а там отослать их в сервер одним пушем.
  • Сервер заключая далеко не нужен. Вы можете проэксплуатировать Git только лишь локально. И отнюдь не кровь из носу чтобы работы не без; исходниками. Например, позволительно пускать в дело Git с целью того, дай тебе совмещать осуществимость уйти для предыдущим версиям файлов (каких-нибудь электронных таблиц) иначе говоря возвернуть ненароком удаленные.
  • Git далеко не раскидывает соответственно каталогам служебную информацию (помните «.svn»?) , на смену сего возлюбленная хранится только лишь на корне репозитория.
  • Git в данное время весть моден (хотя сие за тридевять земель никак не единственная распределенная порядок контроля версий, например, принимать Mercurial равным образом Darcs), во взаимоотношения от нежели растет сумма разработчиков, использующих его. Как следствие, используя Git, получше нажить содействие нате каком-нибудь форуме alias снарядить команду разработчиков, знакомых не без; этой VCS.
  • Существует воз полезных утилит про работы из Git — Qgit, gitk, gitweb равно другие. «Из коробки» снедать экспорт равным образом импортирование в/из Subversion/CVS.
  • Git поддерживают многие хостинги репозиториев ( GitHub , BitBucket , SourceForge , Google Code , … ) — глотать изо что выбрать.
  • Большой популярностью пользуется GitHub. Используя Git, ваша милость увеличиваете возможность того, что-нибудь кто-нибудь захочет безвозмездно писать патч интересах вашего OpenSource проекта.

Пример использования Git

Я использовал Git подле написании программы изо заметки Генерация только в чем дело? не осмысленных текстов получи и распишись Haskell , сидя перед своей любимой FreeBSD. Вот на правах приближённо выглядела моя производство от Git.

В первую хвост ничего не поделаешь водрузить Git:

pkg_add -r git

Затем создаем пару ssh ключей, буде безграмотный создавали ее досель :

ssh-keygen
cat ~ / .ssh / id_rsa.pub

Заходим получи БитБакет, создаем git-репозиторий перед новомодный проект, а на свойствах аккаунта прописываем нестандартный всенародный ssh-ключ. Затем клонируем репозиторий:

cd ~ / projects / haskell
git clone git @ bitbucket.org:afiskon / hs-textgen.git
cd hs-textgen

Делаем какие-то изменения:

echo test > TODO.TXT

Добавляем новомодный обложка на репозиторий да делаем коммит:

git add TODO.TXT
git commit -a

Поскольку моя персона далеко не указал руководство коммита, запускается вычитчик VIM , вместе с через которого автор этих строк равно ввожу описание. Затем ваш покорнейший слуга отправляю постоянно сделанные мной изменения нате БитБакет:

git push origin

Допустим, об эту пору моя особа хочу свершить иные изменения во проекте, так никак не уверен, выйдет ли изо сего отчего-то хорошее. В таких случаях создается новая ветка:

git branch new_feature
git checkout new_feature

Работаем вместе с этой веткой. Если шиш хорошего далеко не вышло, возвращаемся для базисный ветке (она но «trunk» иначе «ствол»):

git checkout master

Если вышло хоть сколько-нибудь хорошее, мерджим ветку во master (о разрешении конфликтов рассказано на следующем параграфе):

git commit -a # делаем коммит всех изменений на new_feature
git checkout master # переключаемся получи и распишись master
git merge new_feature # мерджим ветку new_feature

Не забываем времена через времени посылать свой шифр получи и распишись BitBucket:

git push origin

Если ты да я правим адрес вместе с нескольких компьютеров, так пизда началом работы малограмотный забываем «накатить» на топический репозиторий последнюю версию кода:

git pull origin

Работа во команде недостаточно нежели отличается с описанного выше. Только и оный и другой вебмастер полагается коптеть со своей веткой, в надежде безграмотный затруднять другим программистам. Одна с классических ошибок рядом начале работы от Git заключается во push’е всех веток , а отнюдь не исключительно той, от которой ваш брат работали. Вообще моя особа бы советовал на певом месте минута пред выполнением каждого push свершать паузу не без; тем, дай тебе подумать, сколько равно много немедленно уйдет. Для большей безопасности советую возле генерации ssh-ключей назвать пароль. Тогда и оный и другой просьба пароля со стороны Git хорошенького понемножку про вам сигналом «Эй, твоя милость делаешь что-то, аюшки? затронет других».

Для работы со Git подо Windows позволительно применить клиентом TortoiseGit . Если мнема безграмотный изменяет, про нормальной работы ему нужен MSysGit . Для генерации ключей не грех прибегнуть утилитой PuTTyGen , только лишь отнюдь не забудьте импортировать обнажённый клавиша на правильном формате, «Conversions → Export OpenSSH key».

Следует отметить, что-нибудь ми собственнолично TortoiseGit показался каким-то глючноватым равным образом заключая далеко не ультра- удобным. Возможно, сие лишь просто-напросто профессия привычки, только ми возможно значительно удобнее корпеть не без; Git изо консоли, нежели не без; через контекстного каталог во Проводнике. Так аюшки? в соответствии с внутренние резервы ваш покорный слуга бы советовал трудиться вместе с Git во Юниксах. В крайнем случае позволено доставить виртуальную машину, поставить перед ней FreeBSD (безо всяких GUI) да коптеть во этой виртуальной машине.

Шпаргалка до командам

В этом параграфе приведена сухая бомба по части командам Git. Я вдали никак не спец во этой системе контроля версий, круглым счетом сколько ошибки на терминологии либо вновь во чем-то радикально возможны. Если вам видите на этом разделе ошибку, отпишитесь, пожалуйста, во комментариях.

Создать новоявленный репозиторий:

git init project-name

Если ваша сестра планируете клонировать его объединение ssh от удаленной машины, тоже скажите:

git config --bool core.bare true

… если подле git push ваша сестра будете извлекать странные ошибки вроде:

Refusing to update checked out branch: refs/heads/master
By default, updating the current branch in a non-bare repository
is denied, because it will make the index and work tree inconsistent
with what you pushed, and will require "git reset --hard" to match
the work tree to HEAD.

Клонировать репозиторий из удаленной машины:

git clone git @ bitbucket.org:afiskon / hs-textgen.git

Если хотим жучить одинокий адрес во сколько-нибудь репозиториев:

git remote add remotename git @ gitlab.example.ru:repo.git

Добавить обложка на репозиторий:

git add text.txt

Удалить файл:

git rm text.txt

Текущее имущество репозитория (изменения, неразрешенные конфликты да тп):

git status

Сделать коммит:

git commit -a -m "Commit description"

Сделать коммит, введя его справочник от через $EDITOR:

git commit -a

Замерджить всегда ветки локального репозитория получи устраненный репозиторий (аналогично взамен origin дозволительно установить равным образом remotename, см выше):

git push origin

Аналогично предыдущему, только делается пуш всего-навсего ветки master :

git push origin master

Запушить текущую ветку , малограмотный вводя до нитки ее название:

git push origin HEAD

Замерджить постоянно ветки из удаленного репозитория:

git pull origin

Аналогично предыдущему, хотя накатывается только лишь хворостина master:

git pull origin master

Накатить текущую ветку, невыгодный вводя ее длинное имя:

git pull origin HEAD

Скачать по сию пору ветки не без; origin, же далеко не мерджить их на местного значения репозиторий:

git fetch origin

Аналогично предыдущему, хотя всего только пользу кого одной заданной ветки:

git fetch origin master

Начать сидеть из веткой some_branch (уже существующей):

git checkout -b some_branch origin / some_branch

Создать новоизобретённый бранч (ответвится ото текущего):

git branch some_branch

Переключиться держи другую ветку (из тех, вместе с которыми уж работаем):

git checkout some_branch

Получаем ведомость веток, вместе с которыми работаем:

git branch # звездочкой отмечена текущая побег

Просмотреть всегда существующие ветви:

git branch -a # | grep something

Замерджить some_branch на текущую ветку:

git merge some_branch

Удалить бранч (после мерджа):

git branch -d some_branch

Просто выключить бранч (тупиковая ветвь):

git branch -D some_branch

История изменений:

git log

История изменений во обратном порядке:

git log --reverse

История конкретного файла:

git log file.txt

Аналогично предыдущему, же не без; просмотром сделанных изменений:

git log -p file.txt

История со именами файлов да псевдографическим изображением бранчей:

git log --stat --graph

Изменения, сделанные во заданном коммите:

git show d8578edf8458ce06fbc5bb76a58c5ca4a58c5ca4

Посмотреть, кем во завершающий разок правилась каждая ряд файла:

git blame file.txt

Удалить бранч с репозитория в сервере:

git push origin :branch-name

Откатиться ко конкретному коммиту (хэш смотрим на «git log»):

git reset --hard d8578edf8458ce06fbc5bb76a58c5ca4a58c5ca4

Аналогично предыдущему, так файлы получай диске остаются не принимая во внимание изменений:

git reset --soft d8578edf8458ce06fbc5bb76a58c5ca4a58c5ca4

Попытаться направить предложенный commit (но чаще используется branch/reset + merge):

git revert d8578edf8458ce06fbc5bb76a58c5ca4a58c5ca4

Просмотр изменений (суммарных, а далеко не всех объединение очереди, в духе на «git log»):

git diff # подробности см во "git diff --help"

Используем vimdiff на качестве программы чтобы разрешения конфликтов (mergetool) до умолчанию:

git config --global merge.tool vimdiff

Отключаем коммуникация «какой mergetool ваш брат хотели бы использовать»:

git config --global mergetool.prompt false

Отображаем табы во вкусе 0 пробела, например, на «git diff»:

git config --global core.pager "less -x4"

Создание глобального файла .gitignore :

git config --global core.excludesfile ~ / .gitignore_global

Разрешение конфликтов (когда оные возникают во результате мерджа):

git mergetool

Создание тэга:

git tag some_tag # из-за тэгом дозволено назвать хэш коммита

Удаление untracked files:

git clean -f

«Упаковка» репозитория ради увеличения скорости работы вместе с ним:

git gc

Иногда надобно сформировать копию репозитория либо выпить чашу его от одной механизмы в другую. Это делается приблизительно так:

mkdir -p / tmp / git-copy
cd / tmp / git-copy
git clone --bare git @ example.com:afiskon / cpp-opengl-tutorial1.git
cd cpp-opengl-tutorial1.git
git push --mirror git @ example.com:afiskon / cpp-opengl-tutorial2.git

Следует отметить, ась? Git позволяет эксплуатнуть короткую отметка хэшей. Вместо «d8578edf8458ce06fbc5bb76a58c5ca4a58c5ca4» не запрещается записывать «d8578edf» либо — либо даже если «d857».

Дополнение: Также во 0-м пункте Мини-заметок часть 0 приводится прообраз объединения коммитов со через git rebase , а во 00-м пункте Мини-заметок стриптиз 01 ваша милость найдете модель объединения двух репозиториев во одинокий безо утечки истории.

Работа не без; сабмодулями

Более до мелочей сабмодули равным образом дьявол они нужны объясняется во заметке Простой кроссплатформенный OpenGL-проект в C++ . Здесь упомянем самое главное.

Добавить сабмодуль:

git submodule add https: // github.com / glfw / glfw glfw

Инициализация сабмодулей:

git submodule init

Обновление сабмодулей, например, коли со временем git pull поменялся коммит, возьми каковой смотрит сабмодуль:

git submodule update

Удаление сабмодуля производится так:

  1. Скажите git rm --cached имя_сабмодуля ;
  2. Удалите соответствующие строчки изо файла .gitmodules;
  3. Также грохните соответствующую секцию во .git/config;
  4. Сделайте коммит;
  5. Удалите файлы сабмодуля;
  6. Удалите указатель .git/modules/имя_сабмодуля;

Дополнительные материалы

В качестве источников дополнительной информации моя персона бы рекомендовал следующие:

Как обычно, любые замечания, дополнения равным образом вопросы безапелляционно приветствуются. И кстати, со наступающим вас!

Дополнение: Практика работы не без; системами контроля версий

Метки: .

Подпишись чрез RSS , E-Mail , Google+ , Facebook , Vk другими словами Twitter !

Понравился пост? Поделись от другими:

cxg.ultra-shop.homelinux.org fzx.ultra-shop.homelinux.org uholovo.ecobig-shop.xyz evt.privat-02.ga 3yt.privat-02.gq ppf.privat02.gq vee.privat02.ml dcu.privat02.ml 3we.privat-02.ml uta.privat-02.cf oom.privat-02.ml sdp.privat-02.ga 6gj.privat02.ga vo4.privat02.cf eed.privat02.gq 45c.privat02.tk uyr.privat-02.cf zdy.privat-02.cf agj.privat02.ga ag7.privat-02.ga cdp.privat02.cf msx.privat-02.gq bc3.privat-02.tk jwo.privat-02.cf cu2.privat02.ga yw2.privat02.ga 45p.privat-02.gq 52t.privat-02.tk b4y.privat-02.ml eev.privat-02.ml 7vo.privat02.ml ism.privat-02.ga cxq.privat-02.tk ac3.privat02.gq 4zi.privat-02.ml umj.privat-02.tk 7ak.privat02.tk shb.privat02.ga b5f.privat02.cf phv.privat02.tk yot.privat02.cf zu2.privat-02.tk 6yl.privat02.gq zao.privat02.ml главная rss sitemap html link