Skip to content

Latest commit

 

History

History
220 lines (150 loc) · 9.21 KB

GIT.rst

File metadata and controls

220 lines (150 loc) · 9.21 KB

Совместная работа

Важно!

Вместо TAB надо использовать 4 пробела.

Строки должны завершаться как в UNIX.

Содержимое ~/.gitattributes:

*.c     filter=treatspaces
*.txt   filter=treatspaces
*.py    filter=treatspaces
*.html  filter=treatspaces
*.css   filter=treatspaces
*.js    filter=treatspaces

Настройка атрибутов в ~/.gitconfig:

[core]
    attributesfile = /home/rad/.gitattributes
[filter "treatspaces"]
    smudge = expand -t4
    clean = expand -t4

Глобальная конфигурация

Тут надо указать своё имя и электронную почту:

[user]
    name = Ruslan Popov
    email = [email protected]
[gui]
    encoding = utf-8
[alias]
    visual = gitk
    last = log -1 HEAD
    st = status
    # git unstage - убрать всё из индекса (чтобы например добавить/закоммитить сначала что-то другое)
    unstage = reset HEAD --
    up = !(git add . && git stash && git pull --rebase >&2) | grep -v \"No local changes to save\" && git stash pop
    # git in / git out — смотреть какие коммиты придут/уйдут перед выполнением pull/push
    in = "!git remote update -p; git log ..@{u}"
    out = log @{u}..
    # git addremove - добавить в индекс новые файлы/изменения и удалить всё что удалилось
    addremove = !git add . && git ls-files --deleted | xargs --no-run-if-empty git rm
    # git backup - заархивировать весь локальный репозиторий перед экспериментированием
    backup = !file=../`git describe`.tar && echo \"Creating `readlink -f $file`\" && tar cf $file .
    ci = commit
    co = checkout
    br = branch
    bra = branch -a
    chp = cherry-pick
    bl = blame -b -w
    cia = commit --amend
    lg = log --pretty=format:'%h was %an, %ar, message: %s' --graph
    who = shortlog -s --
    # Позволяет просматривать дерево коммитов в очень удобном виде.
    gr = "log --all --graph --pretty=format:'%Cred%h%Creset%x09%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative"
    gha = "log --graph --date=relative --all --topo-order --pretty=format:'%C(cyan)[%an]%Creset %C(green bold)%d%Creset %C(yellow)%h%Creset : %s %C(cyan)[%ad]%Creset'"
[core]
    attributesfile = /home/rad/.gitattributes
#[filter "treatspaces"]
#   smudge = expand -t4
#   clean = expand -t4
[color]
    ui = true

Коммиты

Коммит -- набор изменений в коде проекта, который описывает решённую задачу или блок этой задачи. Крайне нежелательно смешивать несколько задач в одном коммите. Лучше разбейте их на несколько коммитов. Если задача непростая, то желательно разбить её на блоки.

Перед коммитом всегда смотреть, что коммитится с помощью:

git diff

Добавьте файлы в будущий коммит:

git add FILE1 FILE2 ... FILEN

Проверьте, что всё правильно:

git st

Если добавили лишний файл, то его можно убрать из будущего коммита:

git unstage FILE

Добавление части файла в будущий коммит:

git add -ip FILE

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

Формат комментария к коммиту:

git ci -m "Re #NNN: COMMENT."

где NNN -- номер бага в трекере, COMMENT -- текст комментария.

Посмотреть журнал коммитов:

git log

Посмотреть подробный журнал коммитов с информацией о ветках:

git gha

Если вы сделали коммит, но забыли добавить в него пару файликов, то их надо добавить в будущий коммит и объединить новый коммит с последним:

git add FILE1 FILE2
git cia

откроется информация последнего коммита, просто сохраните её и файлы будут добавлены в предыдущий коммит.

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

git gha
git reset --soft COMMIT

где COMMIT -- идентификатор последнего правильного коммита. Коммит исчезнет из истории, но все его изменения останутся в коде.

Если же коммит был настолько еретичным, что его надо уничтожить, то можно сделать жёсткий сброс:

git gha
git reset --hard СOMMIT

Тут всё аналогично, только изменения в коде будут тоже уничтожены.

После того, как коммиты были отправлены в удалённый репозиторий все ваши косяки становятся достоянием истории и отменять коммиты надо так:

git revert COMMIT

где COMMIT -- идентификатор коммита, который надо отменить. Будет создан коммит, который выполнит отмену изменений.

Ветки

Работа ведётся в ветках.

Получить список локальных веток:

git br

Получить список всех веток, включая ветки удалённого репозитория:

git br -a

Создать новую локальную ветку:

git br BRANCH [идентификатор_коммита или имя ветки удалённого репозитория]

Создать и перейти на новую локальную ветку:

git co -b BRANCH [идентификатор_коммита или имя ветки удалённого репозитория]

Перейти на нужную ветку:

git co BRANCH

Как видно, ветку можно создать из любого коммита, тега или другой ветки.

Получить данные из ветки удалённого репозитория и отправить их обратно:

git pull origin BRANCH
git push origin BRANCH

Обратите внимание на то, что работа идёт с текущей веткой. Т.е. если текущей веткой является branch_a, а вы делаете pull из ветки branch_b, то git попытается сделать их объединение в вашей текущей ветке. Будьте внимательны!

Удаление локальной ветки:

git br -d BRANCH

Удаление ветки удалённого репозитория:

git push origin --delete BRANCH
git push origin :BRANCH

Первая команда работает, начиная с версии 1.7. Вторая команда работает до версии 1.7, обратите внимание на двоеточие перед именем ветки, так обозначалась операция удаления ветки.

Копирование коммита из указанной ветки в текущую:

git chp COMMIT

где COMMIT -- идентификатор коммита из другой ветки.

Объединение текущей ветки с другой веткой:

git merge BRANCH

При возникновении конфликтов, надо их разрешить. Для этого смотрите git st, отредактируйте конфликтные файлы и сделайте коммит с исправлениями:

git ci -m "merge"