Git и github: что это такое и в чём разница

Background

The modifications aim to be as least intrusive as possible. Currently there’s no known recovery methode, i.e. an image to flash to the device when it doesn’t boot, though you can solder wires to it and get access to a serial console. When it still boots and mounts vfat partitions automatically, limited recovery options are available through snx_autorun.sh and config files in the bootstrap folder.
As long as you don’t completely disable the cloud apps (DISABLE_CLOUD=1), you can always revert to original behavior by simply removing the sd-card. When cloud apps are disabled and no boot scripts are found on the sd-card (i.e. when it’s not inserted), nothing is started when the device boots so you will not be able to access it through the web-interface, telnet, etc.

Small system modifications are made when you click Apply on the status page:

  • A modified sdcard hotplug script is placed on the device to automatically mount ext2 volumes.
  • Modified rc.local and rcS scripts are placed in /etc/init.d to enable hacks when the device is rebooted. It also disables copying original files from /root/etc_default to prevent overwriting changes to files in /etc. This poses a risk so always be extra careful when editing files in /etc
  • The fang_hacks.sh script and cfg file are placed in /etc.

Эксперимент третий

Для начала немного предыстории. Git я использую под Windows (сборку msysgit) для переноса исходников из дома на работу. Но иногда получалась ситуация, когда приношу измененные исходники в главном репозитории, делаю git pull, чтобы обновить исходники в рабочей копии, команда без проблем выполняется, но затем, если даже ничего не трогать, то некоторые файлы помечаются как измененные.

Я долго не мог понять в чем дело, просмотр изменений по сравнению с предыдущей версией показывал, что якобы изменились все строки в файлах, причем сами на себя. Команда git reset —hard ничего не меняла, даже откат изменений с помощью git checkout — ничего не давал, файлы оставались помечены как измененные.

Сразу закралась мысль о переводах строк, но повторить ситуацию в лабораторных условиях, чтобы точно определить когда такое происходит, удалось только недавно, также случайно нашлось решение этой проблемы, но вопрос почему это происходит до сих пор открыт.

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

0. Глобальное значение параметра core.autocrlf должно быть true.

1. Создаем пустой репозиторий.

2. Устанавливаем для него параметр core.autocrlf в false.

3. Создаем файл с переводами строк \r\n.

4. Добавляем файл к коммиту.

5. Выполняем коммит.

6. Создаем клон этого репозитория

Все, клон создается, но файл в клоне Git считает изменившимся, причем побитово файл в клоне полностью совпадает с файлов в исходном репозитории.

Я приведу лог, по которому видно, что сбросить состояние этого файла в состояние без изменений не удается:

>git status
# On branch master
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#       modified:   test.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

>git reset --hard
HEAD is now at ba37f2d 111

>git status
# On branch master
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#       modified:   test.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

>git checkout -- test.txt

>git status
# On branch master
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#       modified:   test.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

Таким образом, такая ситуация возникает с файлами, у которых окончания строк \r\n (для файлов с окончаниями строк \n такая последовательность действий проблем не воссоздает), если у клона и главного репозитория разные значения параметра core.autocrlf.

Решение проблемы пришло неожиданно во время экспериментов. Оказывается, что достаточно после возникновения такой ситуации установить значение параметра core.autocrlf в false. Даже если затем значение этого параметра снова установить в true, то файл будет считаться неизмененным. Все это показано на следующем логе работы:

>git status
# On branch master
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#       modified:   test.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

>git config core.autocrlf false

>git status
# On branch master
nothing to commit (working directory clean)

>git config core.autocrlf true

>git status
# On branch master
nothing to commit (working directory clean)

Как сделать и принять pull request при помощи hub

1. Что такое hub?

hub — консольное приложение, упрощающее введение команд git, обёртка для git. Например, чтобы клонировать репозиторий, используя git, мы должны ввести в терминал:

В hub команда выглядит проще:

Полный список команд hub, и что они упрощают, см. в документации hub.

На момент написания ответа (ноябрь 2016) hub работает только с GitHub, но не BitBucket или прочими ресурсами для хранения кода. Для пользователей Windows доступна установка через пакетный менеджер Chocolatey — .

2. Зачем использовать hub?

Фиксить мелкие баги и опечатки, а затем сделать pull-request проще через веб-интерфейс GitHub. Однако если Ваши изменения довольно значительны, лучше клонировать репозиторий к себе на компьютер по следующим причинам:

  • IDE/продвинутые текстовые редакторы предоставляют значительно больше возможностей для работы с кодом в сравнении с редактированием в вебе;
  • Могут понадобиться разного рода тесты, недоступные при редактировании в веб-интерфейсе;
  • Для многих предпочтительнее работать в терминале.

Итак, вы решили клонировать репозиторий. hub упрощает:

  • Клонирование удалённого репозитория; рассмотрено в п. 2.1 данного ответа;
  • Форк; достаточно ввести в терминал ;
  • pull request; после того, как Вы запушили изменения в свой форк, достаточно ввести в терминал .

3. Настройка hub перед использованием

  1. Создайте пользовательскую переменную среды , — это сделать просто при помощи Rapid Environment Editor, — значением для которой будет путь к исполняемому файлу Вашего редактора, в котором Вам удобно писать pull request message, — описание Вашего pull request, — при необходимости добавив аргументы командной строки. Например, у меня для Sublime Text значение вышло следующим:

Если путь к исполняемому файлу содержит пробелы, во избежание багов, лучше заключить его в кавычки.

  1. При использовании hub в Windows и открытии редактируемых файлов в Sublime Text могут возникнуть проблемы с pull requests от имени администратора. Поскольку это не первая моя проблема, связанная с UAC, а толку от него не вижу, я отключил у себя контроль учётных записей.
  2. Комментарии — текст под сообщением во вкладке — по умолчанию выделяются . Но когда Вы внесёте pull request в чужой репозиторий, то обнаружите, что текст под сообщением отобразится как заголовки, а не комментарии.

Необходима настройка git. :

Отныне комментариям во вкладке будут предшествовать символы , после внесения pull request комментариев не будет видно как визуально, так и в исходном коде описания к pull request.

При необходимости резервных копий или синхронизации пользовательской конфигурации файлов git узнать, где хранятся конфигурационные файлы git, начиная с версии 2.8 можно командой:

Например, у меня в Windows 10 путь к файлу, где хранится данная настройка для комментариев, оказался следующим:

Если Ваша проблема отлична от расписанных здесь, и её разрешения не получается найти поисками Google и по репозиторию; попробуйте ещё раз воспроизвести проблему, перед введением команд hub послав в терминал следующую команду:

В терминале появится отладочная информация. Если и по ней не получилось разрешить проблему, создайте багрепорт в issue tracker hub, приложив к сообщению вывод Вашего терминала вместе с отладочной информацией.

4. Пример создания pull request через hub

Сделаем посредством PowerShell и hub pull request в репозиторий https://github.com/LightAlf/bioRepo1. Помимо вышеперечисленных команд hub в примере используются также команды git, о предназначении которых можно узнать, например, из данного или этого ресурсов на русском.

Результат:

5. Пример принятия pull-request при помощи hub

Если pull request предложен Вам, Вы можете принять его из терминала, воспользовавшись командой hub — . Изменения будут влиты в Ваш локальный репозиторий; чтобы перенести их на удалённый, следует сделать . Пример, как принять pull-request. если ветка, в которую предложили сделать pull request, является веткой по умолчанию.

Результат:

В описании коммита по умолчанию будут ссылки на коммит, которым приниматеся pull request, и на сам pull request, а также его заголовок.

Пользовательница/пользователь GitHub, у которой/которого Вы приняли pull request, не сразу, но будет указана/указан в числе контрибьюторов Вашего репозитория.

Возможности GitLab

GitLab — это отличный инструмент для разработчиков, который предоставляет следующие возможности:
— управление публичными и приватными git-репозиториями;
— управление пользователями и группами, правами доступа к git-репозиториям;
— отслеживание ошибок, деплой, анализ кода;
— интеграция с разными CI-системами CI (Jenkins и т. п.), организация самостоятельного процесса CI посредством встроенных средств.

Есть и другие возможности (функционал api, wiki страниц, доски задач и идей, отслеживание изменений, комментарии к проектам и прочие). Подробнее можно узнать из официальной документации.

Особенности

Отличия от версий 2.x

  • Полностью другая строка вызова приложения, а именно используется стандарт POSIX.
  • Работа с хранилищем конфигурации реализовано на основании библиотеки
  • Реализована поддержка работы с и хранилищами
  • Функциональность работы через — перенесена в предустановленный плагин
  • Вместо двух команд и оставлена только одна команда , которая работает как команда в предыдущих версиях, при это функциональность синхронизации с удаленным репозиторием (команды и ) перенесена в отдельный плагин
  • Отказ от поддержки работы с форматом при выгрузке конфигурации в исходники
  • Отказ от поддержки файла и переименования длинных файлов
  • Расширяемость функционала за счет использования механизма подписок на события
  • Пока не поддерживается синхронизация с несколькими хранилищами одновременно. (команда )

Шаг 4. Подключаем свой домен

Гитхаб позволяет использовать собственное доменное имя вместо стандартного username.github.io. Для этого, разумеется, вам сначала нужно приобрести его — как это сделать, можно посмотреть в другой статье.

Предположим, что у нас уже есть домен, подключим его к репозиторию: перейдём во вкладку «Settings» в интерфейсе репозитория, и в разделе «GitHub Pages» в поле «Custom domain» введём название нашего домена (например: html-academy.ru) и нажмём кнопку «Save».

Настройки своего домена в GitHub Pages

Теперь Гитхаб знает о нашем домене, однако, этого недостаточно — нужно изменить информацию о DNS-записях самого домена, для этого нам необходимо перейти на сайт доменного регистратора, где домен был куплен. Интерфейс работы с DNS-записями разный у каждого регистратора, но суть примерно одинакова.

Нам нужно настроить A-запись домена, для этого перейдём в панель управления DNS-записями, найдём (или добавим) A-запись и укажем «192.30.252.153» в качестве её значения. Ещё будет полезной по настройке А-записей у DNS провайдера.

Смена DNS-записи домена

Всё готово! В течение нескольких часов вы сможете открыть свой сайт, используя ваш домен.

Возможности

Система спроектирована как набор программ, специально разработанных с учётом их использования в сценариях. Это позволяет удобно создавать специализированные системы контроля версий на базе Git или пользовательские интерфейсы. Например, Cogito является именно таким примером оболочки к репозиториям Git, а StGit использует Git для управления коллекцией исправлений (патчей).

Git поддерживает быстрое разделение и слияние версий, включает инструменты для визуализации и навигации по нелинейной истории разработки. Как и Darcs, BitKeeper, Mercurial, Bazaar и , Git предоставляет каждому разработчику локальную копию всей истории разработки, изменения копируются из одного репозитория в другой.

Удалённый доступ к репозиториям Git обеспечивается git-демоном, SSH- или HTTP-сервером. TCP-сервис git-daemon входит в дистрибутив Git и является наряду с SSH наиболее распространённым и надёжным методом доступа. Метод доступа по HTTP, несмотря на ряд ограничений, очень популярен в контролируемых сетях, потому что позволяет использовать существующие конфигурации сетевых фильтров.

История

Разработка ядра Linux велась на проприетарной системе BitKeeper, которую автор, — Ларри Маквой, сам разработчик Linux, — предоставил проекту по бесплатной лицензии. Разработчики, высококлассные программисты, написали несколько утилит, и для одной Эндрю Триджелл произвел реверс-инжиниринг формата передачи данных BitKeeper. В ответ Маквой обвинил разработчиков в нарушении соглашения и отозвал лицензию, и Торвальдс взялся за новую систему: ни одна из открытых систем не позволяла тысячам программистов кооперировать свои усилия (тот же конфликт привёл к написанию Mercurial). Идеология была проста: взять подход CVS и перевернуть с ног на голову, и заодно добавить надёжности.

Начальная разработка велась меньше, чем неделю: 3 апреля 2005 года разработка началась, и уже 7 апреля код Git управлялся неготовой системой. 16 июня Linux был переведён на Git, а 25 июля Торвальдс отказался от обязанностей ведущего разработчика.

Торвальдс так саркастически отозвался о выбранном им названии git (что на английском сленге означает «мерзавец»):

I’m an egotistical bastard, so I name all my projects after myself. First Linux, now git. Я эгоистичный ублюдок, и поэтому называю все свои проекты в честь себя. Сначала Linux, теперь git.

История версий

Версия Первоначальная дата выпуска Последняя версия Дата выпуска
Старая версия, не поддерживается: 0.99 2005-07-11 0.99.9n 2005-12-15
Старая версия, не поддерживается: 1.0 2005-12-21 1.0.13 2006-01-27
Старая версия, не поддерживается: 1.1 2006-01-08 1.1.6 2006-01-30
Старая версия, не поддерживается: 1.2 2006-02-12 1.2.6 2006-04-08
Старая версия, не поддерживается: 1.3 2006-04-18 1.3.3 2006-05-16
Старая версия, не поддерживается: 1.4 2006-06-10 1.4.4.5 2008-07-16
Старая версия, не поддерживается: 1.5 2007-02-14 1.5.6.6 2008-12-17
Старая версия, не поддерживается: 1.6 2008-08-17 1.6.6.3 2010-12-15
Старая версия, не поддерживается: 1.7 2010-02-13 1.7.12.4 2012-10-17
Старая версия, не поддерживается: 1.8 2012-10-21 1.8.5.6 2014-12-17
Старая версия, не поддерживается: 1.9 2014-02-14 1.9.5 2014-12-17
Старая версия, не поддерживается: 2.0 2014-05-28 2.0.5 2014-12-17
Старая версия, не поддерживается: 2.1 2014-08-16 2.1.4 2014-12-17
Старая версия, не поддерживается: 2.2 2014-11-26 2.2.3 2015-09-04
Старая версия, не поддерживается: 2.3 2015-02-05 2.3.10 2015-09-29
Старая поддерживаемая версия: 2.4 2015-04-30 2.4.12 2017-05-05
Старая поддерживаемая версия: 2.5 2015-07-27 2.5.6 2017-05-05
Старая поддерживаемая версия: 2.6 2015-09-28 2.6.7 2017-05-05
Старая поддерживаемая версия: 2.7 2015-10-04 2.7.6 2017-08-10
Старая поддерживаемая версия: 2.8 2016-03-28 2.8.6 2017-08-10
Старая поддерживаемая версия: 2.9 2016-06-13 2.9.5 2017-08-10
Старая поддерживаемая версия: 2.10 2016-09-02 2.10.5 2017-09-26
Старая поддерживаемая версия: 2.11 2016-11-29 2.11.4 2017-09-26
Старая поддерживаемая версия: 2.12 2017-02-24 2.12.5 2017-09-26
Старая поддерживаемая версия: 2.13 2017-05-10 2.13.7 2018-05-29
Старая поддерживаемая версия: 2.14 2017-08-04 2.14.4 2018-05-29
Старая поддерживаемая версия: 2.15 2017-10-30 2.15.2 2018-05-29
Старая поддерживаемая версия: 2.16 2018-01-17 2.16.4 2018-05-29
Старая поддерживаемая версия: 2.17 2018-04-03 2.17.1 2018-05-29
Текущая версия: 2.18 2018-06-21 2.18.0


Легенда:
Старая версия, не поддерживается
Старая поддерживаемая версия
Текущая версия
Тестовая версия
Будущая версия

Настройка деплоя

Типичный скрипт деплоя у меня выглядит так:

Переведу на русский язык:

  1. Переходим в ветку (на всякий случай).
  2. Получаем свежий код с Гитхаба/Битбакета.
  3. Устанавливаем/обновляем npm-пакеты.
  4. Запускам сборку Грантом.

Последний пункт нужно пояснить: я запускаю задачу локально установленным ( без ключа ) Грантом. Так всё нужное для деплоя (кроме Гита и npm) устанавливается одной командой и не требует .

Напишем скрипт для Шипита:

И сохраним его как в папке проекта.

Шипит работает очень просто: он подключается к серверу по SSH, переходит в папку сайта и выполняет там команды, указанные после метки . (На самом деле возможностей у него больше.)

Всё, теперь можно разложить сайт одной командой, не считая коммита и пуша изменений:

General usage

Download an sd-card image from the releases page or follow the manual steps below.

Updating: If you’ve applied the hack before and are updating to a newer release, the web-interface will not allow you to apply the hack since (older versions of) scripts are already on the device. Make sure to click the Update button on the status page before rebooting!! This will copy all relevant files to the device, overwriting the previous version.

1. Prepare an sd-card with two partitions.

The first partition on the device must be a vfat partition. It will only contain some small scripts so 100MiB should be more than enough.
The second partition must be an ext2 partition and will contain all other files.

2. Copy bootstrap folder and snx_autorun.sh

The bootstrap folder contains CGI scripts for the embedded Boa webserver. The script is the entry-point for enabling the hacks.

Both must be copied to the vfat partition.

4. Place sd-card in device

Boot the device without sd-card, wait until the blue led stops flashing. The device will automatically run when the sd-card is inserted. Do not boot the device with the card inserted and then re-insert it, to prevent it from being mounted incorrectly (mmcblk1 instead of mmcblk0).

5. Enable hacks

When you visit you should now be presented with a status page. If you get a ‘404 Not Found’ page, the script didn’t run. You can visit to check if the sd-card is mounted correctly.

Click ‘Apply’ to enable the hacks.

Задания для самостоятельной работы

  1. Добавить в этот репозиторий новый файл, в котором разместить исходный текст программы на выбранном вами языке программирования, которая выводит на экран надпись .
  2. Создать дополнительную ветку , в которой надпись заменена на текущую дату.
  3. В основной ветке заменить надпись на надпись .
  4. Выполнить слияние ветки в ветку . При слиянии заменить вывод на строчку .
  5. Удалить ветку .
  6. Добавить в репозиторий задачу (Issue), в которой указать необходимость добавить в программу комментарий о появлении вывода текущей даты.
  7. Посмотреть через терминал историю изменений файла. Определить SHA-1 хеш коммита, в котором в программу в дополнительной ветке был добавлен вывод текущей даты.
  8. Найти в справочном сайте GitHub (https://help.github.com) форматы инструкций, которая будучи добавлена в описание коммита позволяет управлять состоянием задач.
  9. Добавить в программу комментарий с 7-значной версией хеша соответствующего коммита. При добавлении коммита с комментарием в репозиторий, добавить в описание коммита специальную инструкцию, которая позволит автоматически пометить созданную ранее задачу как выполненную.
  10. В случае ошибки выполнить шаги 9–12 заново. Успешным выполнением считается задача, которая была создана вручную, а закрыта с помощью специальным образом оформленного описания коммита.
  11. Найти интересный для себя факт о системе контроля версий Git или сервисе GitHub и добавить его в репозиторий https://github.com/storkvist/Intro-to-Git-and-GitHub в раздел «Интересные факты о Git и GitHub» с помощью пулл-реквеста.

7 ловушек GitHub — ошибки в оформлении, которые часто делают программисты

Неочевидная команда запуска

Напишите код, который запускает ваше приложение. Некоторые программисты считают, что и — это очевидные команды, но не стоит забывать о том, что очевидное вам вовсе не обязательно будет понятно тому, кто читает ваш проект.

Мусор в коде

Уберите отовсюду консоль-логи, принты, выводы ошибок и глупые комментарии. Как-то раз я собеседовал на должность преподавателя приятного кандидата и уже собирался предложить ему работу. А затем обнаружил в его коде функцию, которая не делала ничего. Рядом с ней красовался комментарий: «Нужно удалить».

Ошибки в коде

Обязательно прогоните код через линтер: он проверит код на ошибки, укажет на баги и найдёт подозрительные конструкции.

Ключи и пароли в коде

Не оставляйте в ваших репозиториях ключи и пароли — это дурной тон. Храните такие данные в переменных окружения или в .env-файле, добавив его в .gitignore.

Непонятные коммиты

Начинайте свой коммит с того, что вы что-то добавили, удалили или изменили. Затем напишите, что получилось в результате. Проверьте себя: читая хороший коммит, посторонний человек может понять, что было сделано и зачем. Например: изменили функцию, которая не позволяла отправить письмо.

Низкая активность

Очень важно постоянно держать зелёным ваш график активности («contributions»). Чтобы не создавалось впечатления, что вы не работаете, создайте специальную папку «Мои решённые алгоритмы»

Добавляйте в неё всю релевантную активность: «алгоритм решения судоку», «алгоритм сортировки», чтобы было видно, что вы постоянно что-то делаете.

Плохой стиль

Соблюдайте стайлгайд своего языка — PEP8 для Python, Airbnb Style Guide для JavaScript, Airbnb Ruby Styleguide для Ruby и так далее. Так вы продемонстрируете заботу о комфорте коллег и уважение к принятым в сообществе нормам.

Options

You can set some options:

$ ghr \
    -t TOKEN \        # Set Github API Token
    -u USERNAME \     # Set Github username
    -r REPO \         # Set repository name
    -c COMMIT \       # Set target commitish, branch or commit SHA
    -n TITLE \        # Set release title
    -b BODY \         # Set text describing the contents of the release
    -p NUM \          # Set amount of parallelism (Default is number of CPU)
    -delete \         # Delete release and its git tag in advance if it exists (same as -recreate)
    -replace          # Replace artifacts if it is already uploaded
    -draft \          # Release as draft (Unpublish)
    -soft \           # Stop uploading if the same tag already exists
    -prerelease \     # Create prerelease
    TAG PATH

Заключение

На мой взгляд применение параметра core.autocrlf — довольно спорное решение из-за того, что фактически файлы в разных репозиториях оказываются разные, хотя задумка интересная. Теоретически применение этого параметра должно облегчить написание кода пользователями в разных операционных системах, не задумываясь о том какие символы для перевода строк они используют.

Но по крайней мере в Windows проблемы с этой настройкой есть, кроме того возможны ситуации, когда Git примет бинарные файлы за текстовые и примется в них исправлять переводы строк. В этом случае мы получим порчу файлов. Если честно, немного странно видеть эту возможность в Git, когда Линус Торвальдс на одном из докладов сказал такую фразу, что когда он начал делать Git, то хотел бы, чтобы в ней файлы не портились и извлекались из репозитория в том виде, в каком они туда попали. Хотя эта возможность отключается.

Мы не рассмотрели еще одно значение этого параметра, а именно inline, когда Git преобразует переводы строк в \n только при чтении файлов, и при записи создает файлы с таким же окончанием строк. Но по аналогии с нашими предыдущими экспериментами можно самостоятельно разобраться как этот режим работает.

Также хотелось бы обратить ваше внимание на параметр core.safecrlf, который тесно связан с core.autocrlf, но который мы также не рассматривали.

На этом пока все, статья оказалась даже больше, чем я ожидал, но надеюсь, что она окажется полезной.

Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.

y0prst 21.03.2012 — 16:32

Значение параметра

> Мы не рассмотрели еще одно значение этого параметра, а именно inline, когда Git преобразует переводы строк в n только при чтении файлов, и при записи создает файлы с таким же окончанием строк.

Во-первых, не inline, а input. Во-вторых, при чтении откуда? при записи куда?
Если core.autocrlf=input, то файлы чекаутятся as is, а при коммите происходит конвертация CRLF->LF для текстовых файлов.

Joshuan 05.09.2012 — 16:56

Ох как сложно вы написали о довольно простой вещи.

Evghenii 27.12.2013 — 19:18

Отлично

Отлично написанно, спасибо

Petre73 23.03.2017 — 15:34

Наконец-то разобрался что значит:
«warning: LF will be replaced by CRLF in »

Олег 11.04.2018 — 14:30

Эксперимент третий — всегда вляпываюсь

Что по проблемным файлам выдаёт команда git ls-files —eol?

Ссылка на основную публикацию