Git cheat sheets
Краткое описание основных команд для работы с Git репозиториями. Здесь дан минимально необходимый перечень команд, который позволит начать работу с репозиториями сервера Radix.Linux.
tags
Git
Более полную информацию о Git можно найти, например в книге Pro Git (на русском языке, эту книгу можно полистать здесь: Pro Git).
Create a bare repository
Чистые репозитории используются для представления удаленного доступа. В таких репозиториях не ведется разработка непосредственно, а код в них доставляется с помощью команды git push.
Создание чистого репозитория рассмотрим на примере /u3/scm/git/IRAM-flasher.git репозитория из обычного.
Прежде всего создадим обычный репозиторий на сервере в каталоге /u3/scm/git/IRAM-flasher:
$ mkdir -p /u3/scm/git/IRAM-flasher
Скопируем в каталог /u3/scm/git/IRAM-flasher дерево исходников и инициализируем его как git-репозиторий:
$ cd /u3/scm/git/IRAM-flasher $ git init $ git config --global user.name "kx" $ git config --global user.email kx@radix.pro $ touch .gitignore $ git add -A .
Файл .gitignore мы создали для того, чтобы указать файлы, которые мы не будем учитывать под версионным контролем. Например, мы не будем отслеживать изменения объектных файлов и библиотек. Для этого добавим следующий шаблон в файл .gitignore
*.[oa]
и обновим индекс:
$ git update-index --assume-unchanged .gitignore
Сделаем первый комит кода в новый репозиторий:
$ git commit -m "Initial commit"
Теперь нам остается только создать чистый репозиторий на основе имеющегося:
$ cd .. $ git clone --bare IRAM-flasher IRAM-flasher.git Initialized empty Git repository in /u3/scm/git/IRAM-flasher.git/
Удалить за ненадобностью обычный репозиторий:
$ rm -rf IRAM-flasher/
И отдать права пользователю git (не забыв о людях, которые входят в группу git):
# chown -R git:git IRAM-flasher.git # chmod -R g+w IRAM-flasher.git
Хорошим тоном является задание краткого описания репозитория и его владельца для WEB-интерфейсов, таких как gitweb и cGit:
$ cd /u3/scm/git/IRAM-flasher.git/ $ cat "Short description of your repository" > description $ vi config . . . [gitweb] owner = Andrey V.Kosteltsev
Dealing with Repository from Remote HOST
Клонировать репозиторий можно с помощью команды git clone:
$ git clone git@radix.pro:/u3/scm/git/IRAM-flasher.git IRAM-flasher Cloning into 'IRAM-flasher'... remote: Counting objects: 22, done. remote: Compressing objects: 100% (21/21), done. Receiving objects: 100% (22/22), 23.77 KiB, done. remote: Total 22 (delta 2), reused 0 (delta 0) Resolving deltas: 100% (2/2), done.
Прежде чем начать работать с репозиториями, обязательно идентифицируйте себя установив переменные user.name и user.email:
$ cd IRAM-flasher $ git config --global user.name "kx" $ git config --global user.email kx@radix.pro
После того, как вы внесли изменения в код, можно воспользоваться командой git commit:
$ git commit -a -m "Added .text.startup section" [master da9d480] Added .text.startup section 1 file changed, 1 insertion(+)
Для доставки изменений, сделанных вами в локальном репозитории, в origin репозиторий, служит команда git push:
$ git push Counting objects: 7, done. Delta compression using up to 4 threads. Compressing objects: 100% (4/4), done. Writing objects: 100% (4/4), 355 bytes, done. Total 4 (delta 3), reused 0 (delta 0) To git@radix.pro:/u3/scm/git/IRAM-flasher.git f3bfe3f..da9d480 master -> master
Следует помнить, что теги не доставляются в origin репозиторий неявно с помощью команды git push. Для того, чтобы доставить тег в origin репозиторий, необходимо задать параметры команды явно:
$ git push origin 0.0.1 Counting objects: 1, done. Writing objects: 100% (1/1), 184 bytes, done. Total 1 (delta 0), reused 0 (delta 0) To git@radix.pro:/u3/scm/git/IRAM-flasher.git * [new tag] IRAM-flasher-0.0.1 -> IRAM-flasher-0.0.1
Для получения обновлений, сделанных в origin репозитории, служит команда git pull. Например, получить обновления, сделанные на master ветке, можно воспользоваться следующей командой:
$ git pull origin master From /u3/scm/git/sources * branch master -> FETCH_HEAD Updating c4eea19..8043f46 Fast-forward Makefile | 1 + uClinux/elf2flt/Makefile | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 uClinux/elf2flt/Makefile
Git tags
Git использует два основных типа меток: легковесные и аннотированные. Легковесная метка – это что-то весьма похожее на ветку, которая не меняется – это просто указатель на определённый коммит. А вот аннотированные метки хранятся в базе данных Git как полноценные объекты. Они имеют контрольную сумму, содержат имя поставившего метку, e-mail и дату, имеют комментарий и могут быть подписаны и проверены с помощью GNU Privacy Guard (GPG). Обычно рекомендуется создавать аннотированные метки, чтобы иметь всю перечисленную информацию; но если вы хотите сделать временную метку или по какой-то причине не хотите сохранять остальную информацию, то для этого годятся и легковесные метки.
Создание аннотированной метки в Git выполняется легко. Самый простой способ это задать управление -a при выполнении команды tag:
$ git tag -a 0.0.1 -m 'Created tag for release (version 0.0.1)'
Для того, чтобы доставить тег в origin репозиторий, необходимо задать параметры команды явно (см. Dealing with Repository from Remote HOST):
$ git push origin 0.0.1 Counting objects: 1, done. Writing objects: 100% (1/1), 184 bytes, done. Total 1 (delta 0), reused 0 (delta 0) To git@radix.pro:/u3/scm/git/IRAM-flasher.git * [new tag] IRAM-flasher-0.0.1 -> IRAM-flasher-0.0.1
Чтобы удалить метку, например, с именем 0.0.1, надо выполнить следующие команды:
$ git tag -d 0.0.1 $ git push origin :refs/tags/0.0.1
List tags and branches
Просмотр имеющихся меток (tag) в Git делается просто. Достаточно набрать git tag:
$ git tag IRAM-flasher-0.0.1
Аналогичным образом можно посмотреть список всех веток в репозитории:
$ git branch * master
Repository Mirror
With sufficiently recent git (>=1.6.0):
In the below examples, git_user and project.git should be modified for your GitHub project.
Set up a (bare) mirror of the source repository
$ git clone --mirror git://gitorious.org/linux-davinci/linux-davinci.git
to fetch the changes
$ cd linux-davinci.git $ git fetch -q --all
make fetching automatic by installing a crontask
export EDITOR=vim crontab -e */5 * * * * cd /path/to/linux-davinci.git && git fetch -q --all :wq
or
sudo vi /etc/cron.d/sync_git_repos */5 * * * * cd /path/to/linux-davinci.git && git fetch -q --all
*/5 in the last line defines the minute at which the synchronization takes place, for example, */2 would cause the sychronization to take place every two minutes. */5 causes the synchronization to take place on minutes divisible by 5 (5, 10, 15, etc.)
Light Weight Clone
The command git clone has a --depth flag:
$ git clone --depth <depth> . . .
Create a shallow clone with a history truncated to the specified number of revisions. A shallow repository has a number of limitations (you cannot clone or fetch from it, nor push from nor into it), but is adequate if you are only interested in the recent history of a large project with a long history, and would want "to send in fixes as patches".
Change last commit message
To change the last incorrect commit message in the cloned repository you can make use following command:
$ git commit --amend -m "some other message"
But pushing this commit to the remote repository is not trivial and you commit will be rejected.
$ git push To git@radix.pro:/u3/scm/git/sources.git ! [rejected] master -> master (non-fast-forward) error: failed to push some refs to 'git@radix.pro:/u3/scm/git/sources.git' hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart. Merge the remote changes (e.g. 'git pull') hint: before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details.
If you work alone on the master branch and your commit doesn't affect eachother then you can use following command:
$ git push origin +master:master Counting objects: 70, done. Delta compression using up to 4 threads. Compressing objects: 100% (28/28), done. Writing objects: 100% (38/38), 3.58 KiB, done. Total 38 (delta 15), reused 0 (delta 0) To git@radix.pro:/u3/scm/git/sources.git + dc81971...fa4001b master -> master (forced update)
Information about changing older commit massages you can find at Changing a commit message page.